【问题标题】:How to verify that a transaction was signed by a given account ID in NEAR protocol?如何验证交易是否由 NEAR 协议中的给定帐户 ID 签名?
【发布时间】:2020-07-04 23:46:19
【问题描述】:

我有一个已签名的交易,我想验证它是否由 NEAR 上存在的帐户 ID 签名。

【问题讨论】:

    标签: nearprotocol


    【解决方案1】:

    问题分为三个方面:

    1. 检查交易哈希。用 Borsh 序列化交易并计算 sha256,它应该匹配 transaction.hash。
    2. 验证签名对于给定的公钥是否有效。使用可以验证给定签名类型的任何可用工具。 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-* 或原始 RPC 调用检查给定帐户 ID 的密钥是否存在:

      $ 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"
          }
      }
      

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 2022-09-29
      • 2021-12-13
      • 2021-01-15
      • 2018-05-07
      • 2018-07-03
      • 2016-10-08
      • 2022-08-03
      • 1970-01-01
      相关资源
      最近更新 更多