我开始开发自己的 NEAR 客户端,因为我认为这可能是一个不错的个人项目。问题在于调用函数,因为附近的文档仅在有关 rpc 端点的页面中提及视图函数。我不知道调用函数是否有一些特殊连接,或者关于调用函数的页面没有写入 rpc 端点。但我需要知道如何调用调用函数。
1 回答
基本上,“更改”方法是从一个账户(调用者/签名者)到合约账户(接收者)进行的交易。NEAR 网络上的交易由Actions
. 在进行函数调用的情况下,相关的动作就是FunctionCall
动作。
这是Transaction
文档的链接:https ://docs.near.org/docs/concepts/transaction#transaction 。
near-cli-rs和near-api-jsnear-call
是简化此过程的工具,但我们可以详细了解它以更好地理解它。
在我们开始之前,看一下near-jsonrpc-client repo中的这个例子,它是这里描述的方法的代码实现。
首先,您需要确保您可用的访问密钥已获得许可,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"
},
}
既然我们现在有了nonce
and block_hash
,我们就可以开始了。
因此,我们交易所需的一切都是可用的。最后一点是FunctionCall
动作本身,它是一个包含以下字段的对象;
method_name
: 你调用的合约的 change 方法。args
: JSON 格式的参数列表。gas
:https ://docs.near.org/docs/concepts/gasdeposit
:(对于支付方式)https://www.near-sdk.io/contract-interface/payable-methods
现在,我们可以看到一切都开始融合在一起,我们的交易现在看起来像这样;
{
"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_async
或broadcast_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-client或near-api-js。
还可以考虑使用交互式near-cli-rs。