【问题标题】:Make a call function with RPC endpoints or other method使用 RPC 端点或其他方法调用函数
【发布时间】:2022-07-07 14:01:14
【问题描述】:

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

【问题讨论】:

  • 你试过这个docs.near.org/docs/tools/near-cli#near-call吗?它有一个关于如何调用方法的示例,而不仅仅是查看它。
  • @John 我知道,问题是我正在创建自己的客户端,而 near-cli 使用 near-api-js,阅读源代码真的很乱。顺便说一句,我使用 c++ 开发 cli,而不是 javascript

标签: nearprotocol near


【解决方案1】:

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

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

near-cli-rsnear-callnear-api-js 是简化此过程的工具,但我们可以逐步详细了解它。

在我们开始之前,先看看near-jsonrpc-client repo 中的this example,它是这里描述的方法的代码实现。

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

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

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

既然我们现在有了nonceblock_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
      }
    }
  ]
}

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2022-10-08
    • 2013-11-22
    • 2020-10-25
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多