JSON-RPC 应用程序接口
页面最后更新: 2025年10月27日
为了让软件应用程序与以太坊区块链交互(通过读取区块链数据或向网络发送交易),它必须连接到以太坊节点。
为此,每个以太坊客户端都会实现 JSON-RPC 规范opens in a new tab,因此无论具体的节点或客户端实现如何,应用程序都可以依赖一组统一的方法。
JSON-RPCopens in a new tab 是一种无状态、轻量级的远程过程调用 (RPC) 协议。 它定义了一些数据结构及其处理规则。 它与传输无关,因为这些概念可以在同一进程,通过接口、超文本传输协议或许多不同的消息传递环境中使用。 它使用 JSON (RFC 4627) 作为数据格式。
客户端实现
每个客户端在执行 JSON-RPC 规范时可以使用不同的编程语言。 有关特定编程语言的更多详细信息,请参阅各个客户端文档。 我们建议查看每个客户端文档以获取最新的应用程序接口支持信息。
便捷程序库
虽然你可以选择通过 JSON 应用程序接口直接与以太坊客户端交互,但是对于去中心化应用程序开发者来说,常常有更容易的选项。 许多 JavaScript 和后端 API 程序库都提供了 JSON-RPC API 之上的包装器。 通过这些库,开发者可以用他们选择的语言写下直观的一行函数来初始化(后端的)JSON RPC 请求并用于与以太坊进行交互。
共识客户端 API
本页主要处理以太坊执行客户端使用的 JSON-RPC 应用程序接口。 但是,共识客户端也有一个远程过程调用应用程序接口,允许用户直接从节点查询有关节点的信息、请求信标区块、信标状态和其他与共识相关的信息。 此 API 记录在 Beacon API 网页opens in a new tab 上。
内部应用程序接口还用于节点内的客户端间通信——也就是说,它使共识客户端和执行客户端能够交换数据。 这被称为“引擎 API”,其规范可在 GitHubopens in a new tab 上找到。
执行客户端规范
在 GitHub 上阅读完整的 JSON-RPC API 规范opens in a new tab。 此 API 在 Execution API 网页opens in a new tab上有文档,还包含一个可试验所有可用方法的检查器。
约定
十六进制值编码
两种关键数据类型通过 JSON 传递:未格式化的字节数组和数量。 两者都使用十六进制编码传递,但对格式化有不同的要求。
数量
当对数量(整数、编号)进行编码时:编码为十六进制(以“0x”为前缀),最紧凑的表示方法(例外:0 应表示为“0x0”)。
以下是一些示例:
- 0x41(十进制中是 65)
- 0x400(十进制中是 1024)
- 错误:0x(后面至少有一位,0 是“0x0”)
- 错误:0x0400(不允许有前导零)
- 错误:ff(必须有前缀 0x)
未格式化数据
当对无格式数据(字节数组、帐户地址、哈希、字节码数组)进行编码时:编码为十六进制,以“0x”为前缀,每字节两个十六进制数字。
以下是一些示例:
- 0x41(大小为 1,“A”)
- 0x004200(大小为 3,“0B0”)
- 0x(大小为 0,“”)
- 错误:0xf0f0f(位数必须是偶数)
- 错误:004200(必须以 0x 为前缀)
区块参数
以下方法拥有区块参数:
当查询以太坊状态的请求被发出时,提供的区块参数决定了区块的高度。
区块参数可以使用以下选项:
HEX String- 整数区块号String "earliest"- 表示最早/创世区块String "latest"- 最新提议的区块String "safe"- 最新且安全的头部区块String "finalized"- 最新的最终确定的区块String "pending"- 待处理状态/交易
示例
在此页面上,我们提供了如何通过命令行工具 curlopens in a new tab 使用单个 JSON_RPC API 端点的示例。 这些单独的端点示例位于下面的 Curl 示例部分。 在页面下方,我们还提供了一个端到端示例,用于使用 Geth 节点、JSON_RPC API 和 curl 编译和部署智能合约。
Curl 示例
下面提供了通过向以太坊节点发出 curlopens in a new tab 请求来使用 JSON_RPC API 的示例。 每个示例都包括对特定端点、其参数、返回类型的描述,以及应该如何使用它的工作示例。
Curl 请求可能会返回与内容类型相关的错误消息。 这是因为 --data 选项将内容类型设置为 application/x-www-form-urlencoded。 如果你的节点确实抱怨此问题,请通过在调用开始时放置 -H "Content-Type: application/json" 来手动设置标头。 这些示例也不包括 URL/IP 和端口组合,它必须是提供给 curl 的最后一个参数(例如 127.0.0.1:8545)。 包含这些附加数据的完整 curl 请求采用以下形式:
1curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545Gossip、状态、历史
少数核心 JSON-RPC 方法需要来自以太坊网络的数据,并可以清晰地归为三大类:Gossip、状态和历史。 使用这些部分中的链接跳转到每个方法,或使用目录浏览整个方法列表。
Gossip 方法
这些方法用于跟踪链头。 这就是交易如何在网络中传播、如何找到进入区块的方式,以及客户端如何发现新区块的方式。
状态方法
用于报告所有已存储数据的当前状态的方法。 “状态”就像一大块共享内存,包括帐户余额、合约数据和燃料估算。
历史方法
将每个区块的历史记录追溯到创世块。 这就像一个大的仅附加文件,包括所有区块头、区块体、叔块和交易收据
- eth_getBlockTransactionCountByHash
- eth_getBlockTransactionCountByNumber
- eth_getUncleCountByBlockHash
- eth_getUncleCountByBlockNumber
- eth_getBlockByHash
- eth_getBlockByNumber
- eth_getTransactionByHash
- eth_getTransactionByBlockHashAndIndex
- eth_getTransactionByBlockNumberAndIndex
- eth_getTransactionReceipt
- eth_getUncleByBlockHashAndIndex
- eth_getUncleByBlockNumberAndIndex
JSON-RPC 应用程序接口实战
你可以使用演练场工具opens in a new tab来发现和试用 API 方法。 它还为你展示了各个节点提供商支持哪些方法和网络。
JSON-RPC API 方法
web3_clientVersion
返回当前客户端版本。
参数
无
返回值
String - 当前客户端版本
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'3// 结果4{5 "id":67,6 "jsonrpc":"2.0",7 "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1"8}web3_sha3
返回给定数据的 Keccak-256(_不是_标准化的 SHA3-256)。
参数
DATA- 要转换为 SHA3 哈希的数据
1params: ["0x68656c6c6f20776f726c64"]返回值
DATA - 给定字符串的 SHA3 结果。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'3// 结果4{5 "id":64,6 "jsonrpc": "2.0",7 "result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"8}net_version
返回当前网络 id。
参数
无
返回值
String - 当前网络 ID。
当前网络 ID 的完整列表可在 chainlist.orgopens in a new tab 上找到。 下面是部分常见网络 ID:
1:以太坊主网11155111:Sepolia 测试网560048:Hoodi 测试网
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'3// 结果4{5 "id":67,6 "jsonrpc": "2.0",7 "result": "3"8}net_listening
如果客户端正在主动侦听网络连接,则返回 true。
参数
无
返回值
布尔值 - 侦听时为 true,否则为 false。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'3// 结果4{5 "id":67,6 "jsonrpc":"2.0",7 "result":true8}net_peerCount
返回当前连接到客户端的对等点数。
参数
无
返回值
QUANTITY - 已连接对等点的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'3// 结果4{5 "id":74,6 "jsonrpc": "2.0",7 "result": "0x2" // 28}eth_protocolVersion
返回当前的以太坊协议版本。 请注意,此方法在 Geth 中不可用opens in a new tab。
参数
无
返回值
String - 当前的以太坊协议版本
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'3// 结果4{5 "id":67,6 "jsonrpc": "2.0",7 "result": "54"8}eth_syncing
返回包含同步状态数据的对象,或者返回 false。
参数
无
返回值
准确的返回数据因客户端实现而异。 节点未进行同步时,所有客户端返回 False,并且所有客户端返回以下字段。
Object|Boolean,一个包含同步状态数据的对象;如果未同步,则为 FALSE:
startingBlock:QUANTITY- 导入开始时的区块(仅在同步达到其头部后才会重置)currentBlock:QUANTITY- 当前区块,与 eth_blockNumber 相同highestBlock:QUANTITY- 估算的最高区块
然而,各个客户端还可能提供额外数据。 例如 Geth 返回以下字段:
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": {5 "currentBlock": "0x3cf522",6 "healedBytecodeBytes": "0x0",7 "healedBytecodes": "0x0",8 "healedTrienodes": "0x0",9 "healingBytecode": "0x0",10 "healingTrienodes": "0x0",11 "highestBlock": "0x3e0e41",12 "startingBlock": "0x3cbed5",13 "syncedAccountBytes": "0x0",14 "syncedAccounts": "0x0",15 "syncedBytecodeBytes": "0x0",16 "syncedBytecodes": "0x0",17 "syncedStorage": "0x0",18 "syncedStorageBytes": "0x0"19 }20}显示全部然而 Besu 返回:
1{2 "jsonrpc": "2.0",3 "id": 51,4 "result": {5 "startingBlock": "0x0",6 "currentBlock": "0x1518",7 "highestBlock": "0x9567a3",8 "pulledStates": "0x203ca",9 "knownStates": "0x200636"10 }11}显示全部有关更多详细信息,请参阅特定客户端的文档。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": {8 startingBlock: '0x384',9 currentBlock: '0x386',10 highestBlock: '0x454'11 }12}13// 或者在未同步时14{15 "id":1,16 "jsonrpc": "2.0",17 "result": false18}显示全部eth_coinbase
返回客户端的 coinbase 地址。
在 playground 中尝试端点opens in a new tab**注意:**该方法已于 v1.14.0 版本被弃用,并不再受支持。 试图使用该方法会触发“Method not supported(不支持该方法)”错误。
参数
无
返回值
DATA,20 字节 - 当前的 coinbase 地址。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}'3// 结果4{5 "id":64,6 "jsonrpc": "2.0",7 "result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1"8}eth_chainId
返回链 ID,用于签署受重放攻击保护的交易。
在 playground 中尝试端点opens in a new tab参数
无
返回值
chainId,十六进制字符串值,表示当前链 ID 的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}'3// 结果4{5 "id":67,6 "jsonrpc": "2.0",7 "result": "0x1"8}eth_mining
如果客户端正在积极挖掘新区块,则返回 true。 此方法只能在工作量证明网络中返回 true,并且在合并后可能无法用于某些客户端。
参数
无
返回值
布尔值 - 如果客户端正在挖矿,则返回 true,否则返回 false。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}'3//4{5 "id":71,6 "jsonrpc": "2.0",7 "result": true8}eth_hashrate
返回节点挖矿时使用的每秒哈希数。 此方法只能在工作量证明网络中返回 true,并且在合并后可能无法用于某些客户端。
参数
无
返回值
QUANTITY - 每秒的哈希数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}'3// 结果4{5 "id":71,6 "jsonrpc": "2.0",7 "result": "0x38a"8}eth_gasPrice
返回当前燃料价格的估计值,以 wei 为单位。 例如,Besu 客户端检查最后 100 个区块,并默认返回燃料单价中位数。
在 playground 中尝试端点opens in a new tab参数
无
返回值
QUANTITY - 以 wei 为单位的当前燃料价格的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'3// 结果4{5 "id":73,6 "jsonrpc": "2.0",7 "result": "0x1dfd14000" // 8049999872 Wei8}eth_accounts
返回客户端拥有的地址列表。
在 playground 中尝试端点opens in a new tab参数
无
返回值
DATA 数组,20 字节 - 客户端拥有的地址。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]8}eth_blockNumber
返回最新区块的编号。
在 playground 中尝试端点opens in a new tab参数
无
返回值
QUANTITY - 客户端所在的当前区块编号的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'3// 结果4{5 "id":83,6 "jsonrpc": "2.0",7 "result": "0x4b7" // 12078}eth_getBalance
返回给定地址的帐户余额。
在 playground 中尝试端点opens in a new tab参数
DATA,20 字节 - 要查询余额的地址。QUANTITY|TAG- 整数区块编号,或字符串"latest"、"earliest"、"pending"、"safe"或"finalized",请参阅区块参数
1params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]返回值
QUANTITY - 以 wei 为单位的当前余额的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x0234c8a3397aab58" // 1589724902343750008}eth_getStorageAt
从给定地址的存储位置返回值。
在 playground 中尝试端点opens in a new tab参数
DATA,20 字节 - 存储的地址。QUANTITY- 存储中位置的整数。QUANTITY|TAG- 整数区块编号,或字符串"latest"、"earliest"、"pending"、"safe"或"finalized",请参阅区块参数
返回值
DATA - 此存储位置的值。
示例
正确位置的计算取决于要检索的存储。 考虑通过地址 0x391694e7e0b0cce554cb130d723a9d27458f9298 部署在 0x295a70b2de5e3953354a6a8344e616ed314d7251 的以下合约。
1contract Storage {2 uint pos0;3 mapping(address => uint) pos1;4 constructor() {5 pos0 = 1234;6 pos1[msg.sender] = 5678;7 }8}检索 pos0 的值很简单:
1curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:85452{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"}检索映射的元素要难一些。 映射中的元素位置通过以下方式计算:
1keccak(LeftPad32(key, 0), LeftPad32(map position, 0))这意味着要检索 pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] 处的存储,我们需要通过以下方法计算位置:
1keccak(2 decodeHex(3 "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +4 "0000000000000000000000000000000000000000000000000000000000000001"5 )6)可以使用 Web3 库附带的 geth 控制台进行计算:
1> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"2undefined3> web3.sha3(key, {"encoding": "hex"})4"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"现在获取该存储:
1curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:85452{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"}eth_getTransactionCount
返回从某个地址_发送_的交易数量。
在 playground 中尝试端点opens in a new tab参数
DATA,20 字节 - 地址。QUANTITY|TAG- 整数区块编号,或字符串"latest"、"earliest"、"pending"、"safe"或"finalized",请参阅区块参数
1params: [2 "0x407d73d8a49eeb85d32cf465507dd71d507100c1",3 "latest", // 最新区块的状态4]返回值
QUANTITY - 从此地址发送的交易数量的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}eth_getBlockTransactionCountByHash
返回匹配给定区块哈希的区块中的交易数量。
在 playground 中尝试端点opens in a new tab参数
DATA,32 字节 - 区块的哈希
1params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]返回值
QUANTITY - 此区块中交易数量的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x8b" // 1398}eth_getBlockTransactionCountByNumber
返回匹配给定区块编号的区块中的交易数量。
在 playground 中尝试端点opens in a new tab参数
QUANTITY|TAG- 整数区块编号,或字符串"earliest"、"latest"、"pending"、"safe"或"finalized",请参阅区块参数。
1params: [2 "0x13738ca", // 203962343]返回值
QUANTITY - 此区块中交易数量的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x8b" // 1398}eth_getUncleCountByBlockHash
返回匹配给定区块哈希的区块中的叔块数量。
在 playground 中尝试端点opens in a new tab参数
DATA,32 字节 - 区块的哈希
1params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]返回值
QUANTITY - 此区块中叔块数量的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}eth_getUncleCountByBlockNumber
返回匹配给定区块编号的区块中的叔块数量。
在 playground 中尝试端点opens in a new tab参数
QUANTITY|TAG- 整数区块编号,或字符串"latest"、"earliest"、"pending"、"safe"或"finalized",请参阅区块参数
1params: [2 "0xe8", // 2323]返回值
QUANTITY - 此区块中叔块数量的整数。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x0" // 08}eth_getCode
返回位于给定地址的代码。
在 playground 中尝试端点opens in a new tab参数
DATA,20 字节 - 地址QUANTITY|TAG- 整数区块编号,或字符串"latest"、"earliest"、"pending"、"safe"或"finalized",请参阅区块参数
1params: [2 "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",3 "0x5daf3b", // 61397074]返回值
DATA - 来自给定地址的代码。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"8}eth_sign
sign 方法通过 sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))) 计算以太坊专用签名。
通过在消息中添加前缀,计算出的签名就可以识别为以太坊特定签名。 这可以防止滥用,因为恶意去中心化应用程序可以签署任意数据(例如交易)并使用签名冒充受害者。
注意:签名时使用的地址必须已解锁。
参数
DATA,20 字节 - 地址DATA,N 字节 - 要签名的消息
返回值
DATA:签名
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"8}eth_signTransaction
为交易签名,随后可使用 eth_sendRawTransaction 方法将该交易提交到网络。
参数
对象- 交易对象
type:from:DATA,20 字节 - 交易发送方地址。to:DATA,20 字节 -(创建新合约时可选)交易接收方地址。gas:QUANTITY-(可选,默认值:90000)为交易执行提供的燃料整数。 它将返回未使用的燃料。gasPrice:QUANTITY-(可选,默认值:待定)用于每单位已支付燃料的 gasPrice 整数,以 Wei 为单位。value:QUANTITY-(可选)随此交易发送的价值的整数,以 Wei 为单位。data:DATA- 合约的已编译代码或所调用方法签名和编码参数的哈希。nonce:QUANTITY-(可选)nonce 的整数。 它允许覆盖你自己的使用相同随机数的待处理交易。
返回值
DATA,由指定账户签名的 RLP 编码交易对象。
示例
1// 请求2curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","params": [{"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675","from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155","gas": "0x76c0","gasPrice": "0x9184e72a000","to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567","value": "0x9184e72a"}]}'3// 结果4{5 "id": 1,6 "jsonrpc": "2.0",7 "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"8}eth_sendTransaction
如果数据字段包含代码,则创建新的消息调用交易或合约,并使用 from 中指定的帐户进行签名。
参数
对象- 交易对象
from:DATA,20 字节 - 交易发送方地址。to:DATA,20 字节 -(创建新合约时可选)交易接收方地址。gas:QUANTITY-(可选,默认值:90000)为交易执行提供的燃料整数。 它将返回未使用的燃料。gasPrice:QUANTITY-(可选,默认值:待定)用于每单位已支付燃料的 gasPrice 整数。value:QUANTITY-(可选)随此交易发送的价值的整数。input:DATA- 合约的已编译代码或所调用方法签名和编码参数的哈希。nonce:QUANTITY-(可选)nonce 的整数。 它允许覆盖你自己的使用相同随机数的待处理交易。
1params: [2 {3 from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155",4 to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567",5 gas: "0x76c0", // 304006 gasPrice: "0x9184e72a000", // 100000000000007 value: "0x9184e72a", // 24414062508 input:9 "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",10 },11]显示全部返回值
DATA,32 字节 - 交易哈希;如果交易尚不可用,则为零哈希。
创建合约时,在交易被提议到区块后,使用 eth_getTransactionReceipt 获取合约地址。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"8}eth_sendRawTransaction
为已签名的交易创建新的消息调用交易或创建合约。
参数
DATA,已签名的交易数据。
1params: [2 "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",3]返回值
DATA,32 字节 - 交易哈希;如果交易尚不可用,则为零哈希。
创建合约时,在交易被提议到区块后,使用 eth_getTransactionReceipt 获取合约地址。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"8}eth_call
立即执行新的消息调用,但不在区块链上创建交易。 通常用于执行只读智能合约函数,例如 ERC-20 合约的 balanceOf。
参数
对象- 交易调用对象
from:DATA,20 字节 -(可选)交易发送方地址。to:DATA,20 字节 - 交易接收方地址。gas:QUANTITY-(可选)为交易执行提供的燃料整数。 eth_call 消耗零燃料,但某些执行可能需要此参数。gasPrice:QUANTITY-(可选)用于每单位已支付燃料的 gasPrice 整数value:QUANTITY-(可选)随此交易发送的价值的整数input:DATA-(可选)方法签名和编码参数的哈希。 详情请参阅 Solidity 文档中的以太坊合约 ABIopens in a new tab。
QUANTITY|TAG- 整数区块编号,或字符串"latest"、"earliest"、"pending"、"safe"或"finalized",请参阅区块参数
返回值
DATA - 已执行合约的返回值。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x"8}eth_estimateGas
生成并返回允许交易完成所需燃料数量的估算值。 交易不会添加到区块链中。 请注意,出于各种原因,包括以太坊虚拟机的机制和节点性能,估算值可能远远超过交易实际使用的燃料数量。
在 playground 中尝试端点opens in a new tab参数
参见 eth_call 参数,但所有属性都是可选的。 如果没有指定燃料限制,geth 将使用待处理区块的区块燃料限制作为上限。 因此,当燃料数量高于待处理区块的燃料限制时,返回的估算值可能不足以执行调用/交易。
返回值
QUANTITY - 已使用的燃料数量。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x5208" // 210008}eth_getBlockByHash
根据哈希返回关于区块的信息。
在 playground 中尝试端点opens in a new tab参数
DATA,32 字节 - 区块的哈希。布尔值- 如果为true,则返回完整的交易对象;如果为false,则仅返回交易的哈希。
1params: [2 "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",3 false,4]返回值
对象 - 区块对象;如果未找到区块,则为 null:
number:QUANTITY- 区块编号。 如果是待处理区块,则为 null。hash:DATA,32 字节 - 区块的哈希。 如果是待处理区块,则为 null。parentHash:DATA,32 字节 - 父块的哈希。nonce:DATA,8 字节 - 生成的工作量证明的哈希。 如果是待处理区块时,则为null,如果是权益证明区块(自合并起),则为0x0。sha3Uncles:DATA,32 字节 - 区块中叔块数据的 SHA3。logsBloom:DATA,256 字节 - 区块日志的布隆过滤器。 如果是待处理区块,则为 null。transactionsRoot:DATA,32 字节 - 区块交易树的根。stateRoot:DATA,32 字节 - 区块最终状态树的根。receiptsRoot:DATA,32 字节 - 区块收据树的根。miner:DATA,20 字节 - 获得区块奖励的受益人的地址。difficulty:QUANTITY- 此区块难度的整数。totalDifficulty:QUANTITY- 截至此区块的链总难度的整数。extraData:DATA- 此区块的“额外数据”字段。size:QUANTITY- 此区块大小的整数,以字节为单位。gasLimit:QUANTITY- 此区块允许的最大燃料数量。gasUsed:QUANTITY- 此区块中所有交易使用的总燃料数量。timestamp:QUANTITY- 整理区块时的 unix 时间戳。transactions:数组- 交易对象数组或 32 字节交易哈希,具体取决于最后一个给定参数。uncles:数组- 叔块哈希数组。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}'3// 结果4{5 "jsonrpc": "2.0",6 "id": 1,7 "result": {8 "difficulty": "0x4ea3f27bc",9 "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32",10 "gasLimit": "0x1388",11 "gasUsed": "0x0",12 "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",13 "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",14 "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171",15 "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843",16 "nonce": "0x689056015818adbe",17 "number": "0x1b4",18 "parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54",19 "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",20 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",21 "size": "0x220",22 "stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d",23 "timestamp": "0x55ba467c",24 "totalDifficulty": "0x78ed983323d",25 "transactions": [26 ],27 "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",28 "uncles": [29 ]30 }31}显示全部eth_getBlockByNumber
根据区块编号返回关于区块的信息。
在 playground 中尝试端点opens in a new tab参数
QUANTITY|TAG- 整数区块编号,或字符串"earliest"、"latest"、"pending"、"safe"或"finalized",请参阅区块参数。布尔值- 如果为true,则返回完整的交易对象;如果为false,则仅返回交易的哈希。
1params: [2 "0x1b4", // 4363 true,4]返回值 请参阅 eth_getBlockByHash
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'结果请参阅 eth_getBlockByHash
eth_getTransactionByHash
根据交易哈希返回关于所请求交易的信息。
在 playground 中尝试端点opens in a new tab参数
DATA,32 字节 - 交易的哈希
1params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]返回值
对象 - 交易对象;如果未找到交易,则为 null:
blockHash:DATA,32 字节 - 此交易所在区块的哈希。 如果交易待处理,则为null。blockNumber:QUANTITY- 此交易所在区块的区块编号。 如果交易待处理,则为null。from:DATA,20 字节 - 发送者的地址。gas:QUANTITY- 发送者提供的燃料。gasPrice:QUANTITY- 发送者提供的燃料价格,以 Wei 为单位。hash:DATA,32 字节 - 交易的哈希。input:DATA- 随交易发送的数据。nonce:QUANTITY- 发送者在此交易之前进行的交易数量。to:DATA,20 字节 - 接收者的地址。 如果是合约创建交易,则为 null。transactionIndex:QUANTITY- 区块中交易索引位置的整数。 如果交易待处理,则为null。value:QUANTITY- 以 Wei 为单位的转账价值。v:QUANTITY- ECDSA 恢复 IDr:QUANTITY- ECDSA 签名 rs:QUANTITY- ECDSA 签名 s
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}'3// 结果4{5 "jsonrpc":"2.0",6 "id":1,7 "result":{8 "blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",9 "blockNumber":"0x5daf3b", // 613970710 "from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",11 "gas":"0xc350", // 5000012 "gasPrice":"0x4a817c800", // 2000000000013 "hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",14 "input":"0x68656c6c6f21",15 "nonce":"0x15", // 2116 "to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",17 "transactionIndex":"0x41", // 6518 "value":"0xf3dbb76162000", // 429000000000000019 "v":"0x25", // 3720 "r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",21 "s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c"22 }23}显示全部eth_getTransactionByBlockHashAndIndex
根据区块哈希和交易索引位置返回关于交易的信息。
在 playground 中尝试端点opens in a new tab参数
DATA,32 字节 - 区块的哈希。QUANTITY- 交易索引位置的整数。
1params: [2 "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",3 "0x0", // 04]返回值 请参阅 eth_getTransactionByHash
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'结果请参阅 eth_getTransactionByHash
eth_getTransactionByBlockNumberAndIndex
根据区块编号和交易索引位置返回关于交易的信息。
在 playground 中尝试端点opens in a new tab参数
QUANTITY|TAG- 区块编号,或字符串"earliest"、"latest"、"pending"、"safe"或"finalized",请参阅区块参数。QUANTITY- 交易索引位置。
1params: [2 "0x9c47cf", // 102419993 "0x24", // 364]返回值 请参阅 eth_getTransactionByHash
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'结果请参阅 eth_getTransactionByHash
eth_getTransactionReceipt
根据交易哈希返回交易的收据。
注意待处理的交易没有收据。
参数
DATA,32 字节 - 交易的哈希
1params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]返回值
对象 - 交易收据对象;如果未找到收据,则为 null:
transactionHash:DATA,32 字节 - 交易的哈希。transactionIndex:QUANTITY- 区块中交易索引位置的整数。blockHash:DATA,32 字节 - 此交易所在区块的哈希。blockNumber:QUANTITY- 此交易所在区块的区块编号。from:DATA,20 字节 - 发送者的地址。to:DATA,20 字节 - 接收者的地址。 如果是合约创建交易,则为 null。cumulativeGasUsed:QUANTITY- 在区块中执行此交易时使用的燃料总量。effectiveGasPrice:QUANTITY- 为每单位燃料支付的基础费和小费的总和。gasUsed:QUANTITY- 仅此特定交易使用的燃料数量。contractAddress:DATA,20 字节 - 如果交易是创建合约的,则为创建的合约地址,否则为null。logs:数组- 此交易生成的日志对象数组。logsBloom:DATA,256 字节 - 布隆过滤器,供轻客户端快速检索相关日志。type:QUANTITY- 交易类型的整数,0x0表示传统交易,0x1表示访问列表类型,0x2表示动态费用。
它还返回以下任一者:
root:DATA32 字节的交易后状态根(拜占庭之前)status:QUANTITY,1(成功)或0(失败)
示例
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}'3// Result4{5 "jsonrpc": "2.0",6 "id": 1,7 "result": {8 "blockHash":9 "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3",10 "blockNumber": "0xeff35f",11 "contractAddress": null, // string of the address if it was created12 "cumulativeGasUsed": "0xa12515",13 "effectiveGasPrice": "0x5a9c688d4",14 "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7",15 "gasUsed": "0xb4c8",16 "logs": [{17 // logs as returned by getFilterLogs, etc.18 }],19 "logsBloom": "0x00...0", // 256 byte bloom filter20 "status": "0x1",21 "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",22 "transactionHash":23 "0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5",24 "transactionIndex": "0x66",25 "type": "0x2"26 }27}显示全部eth_getUncleByBlockHashAndIndex
根据哈希和叔块索引位置返回关于区块的叔块的信息。
在 playground 中尝试端点opens in a new tab参数
DATA,32 字节 - 区块的哈希。QUANTITY- 叔块的索引位置。
1params: [2 "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",3 "0x0", // 04]返回值 请参阅 eth_getBlockByHash
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'结果请参阅 eth_getBlockByHash
注意:叔块不包含个人交易。
eth_getUncleByBlockNumberAndIndex
根据编号和叔块索引位置返回关于区块的叔块的信息。
在 playground 中尝试端点opens in a new tab参数
QUANTITY|TAG- 区块编号,或字符串"earliest"、"latest"、"pending"、"safe"、"finalized",请参阅区块参数。QUANTITY- 叔块的索引位置。
1params: [2 "0x29c", // 6683 "0x0", // 04]返回值 请参阅 eth_getBlockByHash
注意:叔块不包含个人交易。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}'结果请参阅 eth_getBlockByHash
eth_newFilter
基于筛选器选项创建一个筛选器对象,以在状态更改(日志)时发出通知。 要检查状态是否已更改,请调用 eth_getFilterChanges。
关于指定主题筛选器的说明: 主题是顺序相关的。 以下主题过滤器将匹配日志中包含主题 [A, B] 的交易:
[]“任意值”[A]“第一个位置为 A(之后的位置为任意值)”[null, B]“第一个位置为任意值,且第二个位置为 B(之后的位置为任意值)”[A, B]“第一个位置为 A,且第二个位置为 B(之后的位置为任意值)”[[A, B], [A, B]]“第一个位置为(A 或 B),且第二个位置为(A 或 B)(之后的位置为任意值)”- 参数
对象- 筛选器选项:
fromBlock:QUANTITY|TAG- (可选,默认:"latest")整数区块编号,或"latest"表示最新提议的区块,"safe"表示最新的安全区块,"finalized"表示最新最终确定的区块,或"pending"、"earliest"表示尚未进入区块的交易。toBlock:QUANTITY|TAG- (可选,默认:"latest")整数区块编号,或"latest"表示最新提议的区块,"safe"表示最新的安全区块,"finalized"表示最新最终确定的区块,或"pending"、"earliest"表示尚未进入区块的交易。address:DATA|数组,20 字节 -(可选)日志起源的合约地址或地址列表。topics:DATA 数组,-(可选)32 字节DATA主题数组。 主题是顺序相关的。 每个主题也可以是带有“or”选项的 DATA 数组。
1params: [2 {3 fromBlock: "0x1",4 toBlock: "0x2",5 address: "0x8888f1f195afa192cfee860698584c030f4c9db1",6 topics: [7 "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",8 null,9 [10 "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",11 "0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc",12 ],13 ],14 },15]显示全部返回值
QUANTITY - 筛选器 ID。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}eth_newBlockFilter
在节点中创建一个筛选器,以在新区块到达时发出通知。 要检查状态是否已更改,请调用 eth_getFilterChanges。
参数 无
返回值
QUANTITY - 筛选器 ID。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}eth_newPendingTransactionFilter
在节点中创建一个筛选器,以在新的待处理交易到达时发出通知。 要检查状态是否已更改,请调用 eth_getFilterChanges。
参数 无
返回值
QUANTITY - 筛选器 ID。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}eth_uninstallFilter
卸载具有给定 ID 的筛选器。 当不再需要监控时应始终调用该方法。 此外,在一段时间内未使用 eth_getFilterChanges 请求筛选器时,筛选器便会超时。
参数
QUANTITY- 筛选器 ID。
1params: [2 "0xb", // 113]返回值
布尔值 - 如果成功卸载筛选器,则为 true,否则为 false。
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'3// 结果4{5 "id":1,6 "jsonrpc": "2.0",7 "result": true8}eth_getFilterChanges
筛选器轮询方法,返回自上次轮询以来产生的日志的数组。
参数
QUANTITY- 筛选器 ID。
1params: [2 "0x16", // 223]返回值
数组 - 日志对象数组;如果自上次轮询以来没有任何更改,则为空数组。
-
对于使用
eth_newBlockFilter创建的过滤器,返回值是区块哈希(DATA,32 字节),例如["0x3454645634534..."]。 -
对于使用
eth_newPendingTransactionFilter创建的筛选器,返回值是交易哈希(DATA,32 字节),例如["0x6345343454645..."]。 -
对于使用
eth_newFilter创建的过滤器,日志是具有以下参数的对象:removed:TAG- 如果日志因链重组而被删除,则为true。 如果是有效日志,则为false。logIndex:QUANTITY- 区块中日志索引位置的整数。 如果是待处理日志,则为null。transactionIndex:QUANTITY- 创建日志的交易索引位置的整数。 如果是待处理日志,则为null。transactionHash:DATA,32 字节 - 创建此日志的交易的哈希。 如果是待处理日志,则为null。blockHash:DATA,32 字节 - 此日志所在区块的哈希。 如果交易待处理,则为null。 如果是待处理日志,则为null。blockNumber:QUANTITY- 此日志所在区块的区块编号。 如果交易待处理,则为null。 如果是待处理日志,则为null。address:DATA,20 字节 - 此日志的来源地址。data:DATA- 可变长度的非索引日志数据。 (在 solidity 中:零个或多个 32 字节的非索引日志参数。)topics:DATA 数组- 0 到 4 个 32 字节DATA类型的索引日志参数的数组。 (在 solidity 中:第一个主题是事件签名的_哈希_(例如Deposit(address,bytes32,uint256)),除非你使用anonymous说明符声明了该事件。)
-
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'3// 结果4{5 "id":1,6 "jsonrpc":"2.0",7 "result": [{8 "logIndex": "0x1", // 19 "blockNumber":"0x1b4", // 43610 "blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",11 "transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",12 "transactionIndex": "0x0", // 013 "address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",14 "data":"0x0000000000000000000000000000000000000000000000000000000000000000",15 "topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]16 },{17 ...18 }]19}显示全部eth_getFilterLogs
返回与具有给定 ID 的筛选器匹配的所有日志的数组。
参数
QUANTITY- 筛选器 ID。
1params: [2 "0x16", // 223]返回值 请参阅 eth_getFilterChanges
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}'结果请参阅 eth_getFilterChanges
eth_getLogs
返回与给定筛选器对象匹配的所有日志的数组。
参数
对象- 筛选器选项:
fromBlock:QUANTITY|TAG- (可选,默认:"latest")整数区块编号,或"latest"表示最新提议的区块,"safe"表示最新的安全区块,"finalized"表示最新最终确定的区块,或"pending"、"earliest"表示尚未进入区块的交易。toBlock:QUANTITY|TAG- (可选,默认:"latest")整数区块编号,或"latest"表示最新提议的区块,"safe"表示最新的安全区块,"finalized"表示最新最终确定的区块,或"pending"、"earliest"表示尚未进入区块的交易。address:DATA|数组,20 字节 -(可选)日志起源的合约地址或地址列表。topics:DATA 数组,-(可选)32 字节DATA主题数组。 主题是顺序相关的。 每个主题也可以是带有“or”选项的 DATA 数组。blockHash:DATA,32 字节 -(可选,未来)添加 EIP-234 后,blockHash将是一个新的过滤器选项,它会将返回的日志限制为具有 32 字节哈希blockHash的单一区块。 使用blockHash相当于fromBlock=toBlock= 哈希为blockHash的区块编号。 如果blockHash出现在筛选条件中,则fromBlock和toBlock都不允许使用。
1params: [2 {3 topics: [4 "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",5 ],6 },7]返回值 请参阅 eth_getFilterChanges
示例
1// 请求2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'结果请参阅 eth_getFilterChanges
用法示例
使用 JSON_RPC 部署合约
本节演示如何仅使用远程过程调用接口部署合约。 部署合约还有其他途径,可以省去这些复杂的步骤,例如使用构建在 RPC 接口之上的程序库,如 web3.jsopens in a new tab 和 web3.pyopens in a new tab。 这些简化通常更容易理解且不易出错,但了解幕后发生的操作仍然很有帮助。
以下是一个名为 Multiply7 的简单智能合约,将使用 JSON-RPC 接口将其部署到以太坊节点。 本教程假设读者已经在运行 Geth 节点。 更多关于节点和客户端的信息请见此处。 请参阅各个客户端文档,了解如何为非 Geth 客户端启动 HTTP JSON-RPC。 大多数客户端默认在 localhost:8545 上提供服务。
1contract Multiply7 {2 event Print(uint);3 function multiply(uint input) returns (uint) {4 Print(input * 7);5 return input * 7;6 }7}首先确保启用了超文本传输协议远程过程调用接口。 这意味着我们在启动时为 Geth 提供 --http 标记。 在此示例中,我们使用私有开发链上的 Geth 节点。 使用这种方法,我们不需要真实网络上的以太币。
geth --http --dev console 2>>geth.log这将在 http://localhost:8545 上启动 HTTP RPC 接口。
我们可以使用 curlopens in a new tab 检索 coinbase 地址(通过获取帐户数组的第一个地址)和余额来验证接口是否正在运行。 请注意,这些示例中的数据在你的本地节点上会有所不同。 如果你想尝试这些命令,请将第二个 curl 请求中的请求参数替换为第一个 curl 请求返回的结果。
curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545{"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]}curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545{"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"}因为数字是十六进制编码的,所以余额以十六进制字符串返回(以 wei 为单位)。 如果我们想要获得数字形式的以太币余额,可以使用 Geth 控制台中的 Web3。
1web3.fromWei("0x1639e49bba16280000", "ether")2// "410"现在我们的私有开发链上有一些以太币,我们可以部署合约了。 第一步是将 Multiply7 合约编译为可以发送到以太坊虚拟机的字节码。 要安装 Solidity 编译器 solc,请遵照 Solidity 文档opens in a new tab。 (你可能希望使用较旧的 solc 版本来匹配我们示例中使用的编译器版本opens in a new tab。)
下一步是将 Multiply7 合约编译成可以发送给以太坊虚拟机的字节码。
echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin======= <stdin>:Multiply7 =======Binary:6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029现在我们有了编译后的代码,我们需要确定部署它需要花费多少燃料。 RPC 接口有一个 eth_estimateGas 方法,可以给我们一个估算值。
curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545{"jsonrpc":"2.0","id":5,"result":"0x1c31e"}最后,部署合约。
curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"}交易被节点接受并返回交易哈希。 此哈希可用于跟踪交易。 下一步是确定我们的合约部署到的地址。 每个已执行的交易都将创建一个收据。 此收据包含有关交易的各种信息,例如交易包含在哪个区块中以及以太坊虚拟机使用了多少燃料。 如果交易
创建了合约,它还将包含合约地址。 我们可以使用 eth_getTransactionReceipt RPC 方法检索收据。
curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545{"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}}我们的合约是在 0x4d03d617d700cf81935d7f797f4e2ae719648262 上创建的。 结果为空而不是收据,意味着该交易尚未添加到区块中。 稍等片刻,检查你的共识客户端是否正在运行,然后重试。
与智能合约交互
在本示例中,我们将使用 eth_sendTransaction 将交易发送到合约的 multiply 方法。
eth_sendTransaction 需要几个参数,具体而言,from、to 和 data。 From 是我们帐户的公共地址,to 是合约地址。 data 参数包含有效载荷,它定义了必须调用哪个方法以及使用哪些参数。 这就是 ABI(应用程序二进制接口)opens in a new tab发挥作用的地方。 应用程序二进制接口是一个 JSON 文件,它定义了如何为以太坊虚拟机定义和编码数据。
有效载荷的字节定义了调用合约中的哪个方法。 这是函数名称及其参数类型的 Keccak 哈希的前 4 个字节(十六进制编码)。 Multiply 函数接受 uint,它是 uint256 的别名。 这为我们提供了:
1web3.sha3("multiply(uint256)").substring(0, 10)2// "0xc6888fa1"下一步是对参数进行编码。 只有一个 uint256,比如值 6。 应用程序二进制接口有一个部分指定了如何编码 uint256 类型。
int<M>: enc(X) 是 X 的大端序二进制补码编码,对于负 X 在高位(左侧)填充 0xff,对于正 X 填充零字节,使得长度为 32 字节的倍数。
此编码为 0000000000000000000000000000000000000000000000000000000000000006。
结合函数选择器和编码后的参数,我们的数据将是 0xc6888fa10000000000000000000000000000000000000000000000000000000000000006。
现在可以将其发送到节点:
curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545{"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"}由于发送了交易,因此返回了交易哈希。 检索收据将得出:
1{2 blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",3 blockNumber: 268,4 contractAddress: null,5 cumulativeGasUsed: 22631,6 gasUsed: 22631,7 logs: [{8 address: "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d",9 blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",10 blockNumber: 268,11 data: "0x000000000000000000000000000000000000000000000000000000000000002a",12 logIndex: 0,13 topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"],14 transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",15 transactionIndex: 016 }],17 transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",18 transactionIndex: 019}显示全部收据中包含一个日志。 此日志由以太坊虚拟机在交易执行时生成并包含在收据中。 multiply 函数显示 Print 事件在输入乘以 7 时触发。 由于 Print 事件的参数是 uint256,我们可以根据 ABI 规则对其进行解码,这将为我们提供预期的十进制数 42。 除了数据之外,值得注意的是,主题可用于确定哪个事件创建了日志:
1web3.sha3("Print(uint256)")2// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"以上只是对一些最常见任务的简要介绍,展示了 JSON-RPC 的直接用法。