0

我开始开发自己的 NEAR 客户端,因为我认为这可能是一个不错的个人项目。问题在于调用函数,因为附近的文档仅在有关 rpc 端点的页面中提及视图函数。我不知道调用函数是否有一些特殊连接,或者关于调用函数的页面没有写入 rpc 端点。但我需要知道如何调用调用函数。

4

1 回答 1

1

基本上,“更改”方法是从一个账户(调用者/签名者)到合约账户(接收者)进行的交易。NEAR 网络上的交易由Actions. 在进行函数调用的情况下,相关的动作就是FunctionCall动作。

这是Transaction文档的链接:https ://docs.near.org/docs/concepts/transaction#transaction 。

near-cli-rsnear-api-jsnear-call是简化此过程的工具,但我们可以详细了解它以更好地理解它。

在我们开始之前,看一下near-jsonrpc-client repo中的这个例子,它是这里描述的方法的代码实现。

首先,您需要确保您可用的访问密钥已获得许可,FullAccess或者是FunctionCall允许进行该函数调用的访问密钥。请参阅https://near-sdk.io/zero-to-hero/beginner/logging-in#access-keys

我们可以从通过queryRPC 方法查看访问密钥开始。

http post https://rpc.testnet.near.org jsonrpc=2.0 id=dontcare method=query \
  params:='{
    "request_type": "view_access_key",
    "finality": "final",
    "account_id": "signer.testnet",
    "public_key": "ed25519:AeKTfwxjMxbroVoW3HuueKdqJN5vHxrXjmoUvK2oCT2D"
  }'

其响应将是这样的;

{
  "result": {
    "nonce": 80,
    "permission": {
      "FunctionCall": { ... }
    },
    ...
    "block_hash": "87HZEuCyDp8WQd7ixEHLUmM1LwKKAQAqLUiPASWojeqx"
  },
}

既然我们现在有了nonceand block_hash,我们就可以开始了。

因此,我们交易所需的一切都是可用的。最后一点是FunctionCall动作本身,它是一个包含以下字段的对象;

现在,我们可以看到一切都开始融合在一起,我们的交易现在看起来像这样;

{
  "signer_id": "signer.near",
  "public_key": "ed25519:AeKTfwxjMxbroVoW3HuueKdqJN5vHxrXjmoUvK2oCT2D",
  "nonce": "<CURRENT_NONCE + 1>",
  "receiver_id": "receiver.testnet",
  "block_hash": "<LATEST_BLOCK_HASH>",
  "actions": [
    {
      "functionCall": {
        "method_name": "greet",
        "args": { "name": "John Wick" },
        "gas": 100000000000000,
        "deposit": 0
      }
    }
  ]
}

剩下的就是使用带有这个 schema的borsh二进制格式来序列化所有这些。

一旦我们序列化了我们的交易,我们就需要用我们的私钥对其进行签名,将字节转换为 base64,最后使用RPCbroadcast_tx_asyncbroadcast_tx_commitRPC 方法进行广播。

http post https://rpc.testnet.near.org jsonrpc=2.0 id=dontcare method=broadcast_tx_async \
    params:='[
        "DwAAAG5lYXJrYXQudGVzdG5ldABuTi5L1rwnlb35hc9tn5WELkxfiGfGh1Q5aeGNQDejo0QAAAAAAAAAEAAAAGpvc2hmb3JkLnRlc3RuZXSiWAc6W9KlqXS5fK+vjFRDV5pAxHRKU0srKX/cmdRTBgEAAAADAAAAoe3MzhvC0wAAAAAAAAB9rOE9zc5zQYLL1j6VTh3I4fQbERs6I07gJfrAC6jo8DB4HolR9Xps3v4qrZxkgZjwv6wB0QOROM4UEbeOaBoB"
    ]'

根据您使用的工具,我建议您使用 Rust 版本的客户端——near-jsonrpc-clientnear-api-js

还可以考虑使用交互式near-cli-rs

于 2022-02-16T08:42:33.647 回答