首页>>资讯>>学院

JSON-RPC调用链上合约的底层原理

2024-09-09 11:29:00 139

JSON-RPC 是一种轻量级的远程过程调用(Remote Procedure Call,RPC)协议,通常用于与区块链节点通信以调用智能合约或查询链上数据。


构造 JSON-RPC 请求并发送


调用智能合约的核心是构造一个符合 JSON-RPC 规范的请求。一个典型的 JSON-RPC 请求包含以下几个字段:


jsonrpc: JSON-RPC 的版本号,通常是 "2.0"。

method: 表示调用的方法,比如 "eth_call"(用于执行不会改变区块链状态的只读合约调用)或 "eth_sendTransaction"(用于发送交易以调用会改变区块链状态的合约方法)。

params: 方法所需的参数列表,通常包含合约地址、调用的数据(例如函数签名和参数的 ABI 编码)、发送者地址等。

id: 请求的唯一标识符,用于响应时匹配请求。


处理JSON-RPC响应


节点处理完请求后,会构造一个 JSON-RPC 响应并返回给客户端。响应包含以下几个字段:

jsonrpc: JSON-RPC 的版本号。

result: 调用方法的返回结果,可能是合约返回的数据或交易的哈希值。


id: 与请求中的 "id" 字段匹配。


例子


假设我们要调用Base Sepolia网络的ERC-20合约的 balanceOf 方法来查询某个地址的代币余额。


构建JSON-rpc参数

{
  "jsonrpc": "2.0",
  "method": "eth_call",
  "params": [
    {
      "to": "0x0f4ace65b5ad88880ecd0ce251864d6d822267eb",
      "data": "x70a08231000000000000000000000000f53271e78cfc2f0f8dbd4e8f83e6b3da32b6f953"
    },
    "latest"
  ],
  "id": 1
}

to: 是ERC-20合约的地址。

data: 是通过 ABI 编码的函数签名和参数。

latest: 指明在最新的区块高度执行这个调用。


发送JSON-rpc请求


发送请求可以借助postman工具。如下图:

24.png

对于data,可以借助solidity来进行编码;对于result,可以借助solidity来进行解码。

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract One {
    function getSetNameAgeBytes4() public pure returns (bytes4) {
        return bytes4(keccak256("balanceOf(address)"));
    }

    function getParamsBytes(address token) public pure returns (bytes memory)
    {
        return abi.encode(token);
    }
    
    function decodeData(bytes memory data) public pure returns (uint256) {
        // 使用 abi.decode 函数解码 data
        uint256 decodedValue = abi.decode(data, (uint256));
        return decodedValue;
    }

}

运行结果,如下图:

24.png

声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!