基本上,“更改”方法是从一个账户(调用者/签名者)到合约账户(接收者)进行的交易。 NEAR 网络上的交易由Actions 的集合构成。在进行函数调用的情况下,相关的操作是FunctionCall 操作。
这是Transaction 文档的链接:https://docs.near.org/docs/concepts/transaction#transaction。
near-cli-rs、near-call 和 near-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"
},
}
既然我们现在有了nonce 和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
}
}
]
}
剩下的就是使用borsh 二进制格式和this schema 序列化所有这些。
一旦我们序列化了我们的交易,我们就需要使用我们的私钥对其进行签名,将字节转换为 base64,最后使用broadcast_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。