Как проверить, что транзакция была подписана данным идентификатором учетной записи в протоколе NEAR? - PullRequest
2 голосов
/ 24 марта 2020

У меня есть подписанная транзакция, и я хочу убедиться, что она подписана идентификатором учетной записи, существующим в NEAR.

1 Ответ

2 голосов
/ 24 марта 2020

Вопрос в три раза:

  1. Проверьте транзакцию га sh. Сериализуйте транзакцию с помощью Bor sh и вычислите sha256, она должна соответствовать транзакции. Ha sh.
  2. Убедитесь, что подпись действительна для данного открытого ключа c. Используйте любые доступные инструменты, которые могут проверить данный тип подписи. В Python есть пакет ed25519, поэтому вот пример:

    import ed25519
    import base58
    
    transaction = {
        "hash": "EzvvJEqdxKA62oAjG32y5herDtRGYEdmZXHDDyxorJ48",
        "public_key": "ed25519:oNCFEmRotRHTySKqmAwifNZ8VRpYS973p8cL61y7eiE",
        "signature": "ed25519:46WsywQYe31isWcHASrnR2pYCja4Mtjzs4n87isrTHWyDdX5uwrUaUn4SbhY9BMwWKvWwdcuyCjMsXdkXdPJv8ko",
    }
    
    pk_bytes = base58.b58decode(transaction['public_key'][len('ed25519:'):])
    pk = ed25519.VerifyingKey(pk_bytes)
    
    # OK:
    pk.verify(
        sig=base58.b58decode(transaction['signature'][len('ed25519:'):]),
        msg=base58.b58decode(transaction['hash'])
    )
    
    # Exception BadSignatureError:
    pk.verify(
        sig=base58.b58decode('66666666' + transaction['signature'][len('ed25519:') + 8:]),
        msg=base58.b58decode(transaction['hash'])
    )
    
  3. Проверьте, существует ли ключ для данного идентификатора учетной записи с Near-Shell, Near-API - * или необработанный RP C вызов:

    $ http post https://rpc.nearprotocol.com method=query params:='["access_key/test/ed25519:oNCFEmRotRHTySKqmAwifNZ8VRpYS973p8cL61y7eiE", ""]' id=123 jsonrpc=2.0
    
    {
        ...
        "result": {
            "block_height": 3297678,
            "nonce": 10493,
            "permission": "FullAccess"
        }
    }
    
...