cfx 命名空间
JSON-RPC规范说明
在GitHub上有一个cfx命名空间的JSON-RPC API规范。 你可以在 open-rpc 测试平台中查看它。 查看 Conflux-Rust RPC 的更新日志 以了解更多。
惯例
十六进制值编码
有两种关键的数据类型通过 JSON 传递:未格式化的字节数组和数量。 二者都使用十六进制编码传递,但对格式化有不同的要求。
数值
当编码数值(整数,数字)时:使用最紧凑的表示方式编码为十六进制,并加上“0x”前缀。 零应表示为"0x0"。 例如:
0x41(十进制的 65)0x400(十进制的 1024)- 错误样例:
0x(应该至少有一位数字 - 零是“0x0”) - 错误样例:
0x0400(不允许有前导零) - 错误样例::
ff(缺少0x前缀)
未格式化的数据
当编码未格式化的数据(字节数组、哈希值、字节码数组)时:使用两个十六进制数字表示每个字节,并在前面加上“0x”作为前缀。 例如:
0x41(size 1,"A")0x004200(size 3,"\0B\0")0x(size 0,"")- 错误:
0xf0f0f(必须是偶数位数)。 - 错误:
004200(缺少0x前缀)。
请注意,区块和交易的哈希值是用32个字节来表示的。
Base32 地址
BASE32:Base32 地址应该编码为一个ASCII字符串,包含42个字符加上网络前缀、分隔符和可选字段。 请注意以下关于base32地址作为RPC参数的限制条件:
- 网络前缀应该与节点的网络匹配,例如:
cfx:acc7uawf5ubtnmezvhu9dhc6sghea0403y2dgpyfjp可以发送给主网节点,cfxtest:acc7uawf5ubtnmezvhu9dhc6sghea0403ywjz6wtpg可以发送给测试网节点。 值得注意的是,这两个示例地址对应于不同网络上的同一个账户。 - 无论包含还是省去地址类型都是可以接受的,例如:
cfx:aarc9abycue0hhzgyrr53m6cxedgccrmmyybjgh4xg和cfx:type.user:aarc9abycue0hhzgyrr53m6cxedgccrmmyybjgh4xg是等价的。 但是,类型不正确的地址,例如:cfx:type.contract:aarc9abycue0hhzgyrr53m6cxedgccrmmyybjgh4xg,会被拒绝。 - 全大写或者全小写地址都是可以接受的,例如:
cfx:aarc9abycue0hhzgyrr53m6cxedgccrmmyybjgh4xg和CFX:AARC9ABYCUE0HHZGYRR53M6CXEDGCCRMMYYBJGH4XG都是有效的。 但混合大小写地址会被拒绝。
为获取更多关于 Base32 地址的信息,请参阅 地址。
默认的 epochNumber (纪元数) 参数
有几个RPC方法有一个epoch number参数。 Epoch的概念在Conflux中有点类似于其他账本中的区块号(高度),但是一个epoch可能包含多个区块。
Epoch number指定了在一个时间点时,系统的相应状态,这些状态受到共识的约束。 Epoch number参数有以下几种可能的选项:
HEX String- 整数纪元数。 例如,0x3e8是epoch 1000。String “earliest”表示创世区块的epoch。String “latest_checkpoint”表示存储在内存中的最早的epoch。String “latest_finalized”- 表示最新的已经确定(通过PoS)的epoch。 (添加自conflux-rustv2.0.0)String “latest_confirmed”- 表示最新的已经确认的epoch(使用确认计量器的估计值)。string "latest_state"- 表示已经执行的最新纪元。String “latest_mined”- 表示最新的已知epoch。
请注意,由于性能优化,最新的已知epoch没有被执行,所以这些epoch没有可用的状态。 对于大多数与状态查询有关的RPC,推荐使用"latest_state"。 (有关Conflux中交易生命周期的更多信息,请参考交易生命周期)
遵循 EIP-1898 的Conflux epochNumber 参数
Conflux core space 支持纪元数参数在 EIP-1898 样式中为某些RPC 服务。 开发者可以通过提供纪元编号或区块哈希来查询纪元的状态。 此外,该参数使开发者能够查询特定纪元的状态,从而确定哪个区块是枢纽区块,这在处理链重组时非常有用。
EIP-1898 样式的纪元参数是一个包含3个可选字段的对象:
epochNumber. 对应于EIP-1898定义的blockNumber。blockHash. 指定区块的哈希requirePivot. 对应于EIP-1898中的requireCanonical, 但用法不同。- 如果为true,当由
blockHash指定的区块不是枢纽块时,RPC将返回错误消息"pivot chain assumption failed"(枢纽块假设失败)。 - 如果为 false,无论该区块是否为枢纽区块,RPC 都将 根据
blockHash指定的区块的纪元返回结果。 - 默认值为
true.
- 如果为true,当由
如果提供了blockHash且requirePivot设置为真,无论RPC的行为如何(例如epoch是否已执行),RPC 会首先检查该区块是否为枢纽区块。
例如:
{
"epochNumber": "0x3e8"
}
or
{
"blockHash": "0x692373025c7315fa18b2d02139d08e987cd7016025920f59ada4969c24e44e06",
"requirePivot": false
}
or
{
"blockHash": "0x692373025c7315fa18b2d02139d08e987cd7016025920f59ada4969c24e44e06",
"requirePivot": true
}
EIP-1898中的纪元号参数现在可用于以下RPC:
CURL 请求示例
下面提供了通过向Conflux节点发出 curl 请求来使用 JSON_RPC 应用程序接口的示例。 每个示例都包括对特定端点、其参数、返回类型的描述,以及应该如何使用它的工作示例。
Curl 请求可能会返回与内容类型相关的错误消息。 这是因为 --data 选项将内容类型设置为 application/x-www-form-urlencoded。 如果你的节点确实抱怨此问题,请通过在调用开始时放置 -H "Content-Type: application/json" 来手动设置标头。 这些示例也未包括网址/互联网协议与端口组合,该组合必须是 curl 的最后一个参数(例如 127.0.0.1:12537)。 包含这些附加数据的完整 curl 请求采用以下形式:
$ curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"cfx_clientVersion","params":[],"id":67}' 127.0.0.1:12537
本文档剩余部分的示例将使用 HTTP endpoint。
状态和交易可用性
Conflux的归档节点和全节点会删除历史状态树,以减少存储空间的占用。 全节点也会丢弃历史区块的交易和收据。 因此,一些RPC接口可能无法用于历史查询。
下面是Conflux RPC API的列表,以及它们在归档节点和全节点上的可用性。 *“recent”表示该RPC只支持最近的项目,“OK”*表示它应该对任何有效的输入都能正常工作。
| RPC | 归档节点 | 全节点 |
|---|---|---|
cfx_call | recent | recent |
cfx_checkBalanceAgainstTransaction | recent | recent |
cfx_clientVersion | OK | OK |
cfx_epochNumber | OK | OK |
cfx_estimateGasAndCollateral | recent | recent |
cfx_gasPrice | OK | OK |
cfx_getAccount | recent | recent |
cfx_getAccumulateInterestRate | OK | OK |
cfx_getAdmin | recent | recent |
cfx_getBalance | recent | recent |
cfx_getBestBlockHash | OK | OK |
cfx_getBlockByEpochNumber | OK | recent |
cfx_getBlockByHash | OK | recent |
cfx_getBlockByHashWithPivotAssumption | OK | recent |
cfx_getBlockRewardInfo | OK | recent |
cfx_getBlocksByEpoch | OK | OK |
cfx_getCode | recent | recent |
cfx_getCollateralForStorage | recent | recent |
cfx_getConfirmationRiskByHash | OK | recent |
cfx_getInterestRate | recent | recent |
cfx_getLogs | OK | recent |
cfx_getNextNonce | recent | recent |
cfx_getSkippedBlocksByEpoch | OK | OK |
cfx_getSponsorInfo | recent | recent |
cfx_getStakingBalance | recent | recent |
cfx_getStatus | OK | OK |
cfx_getStorageAt | recent | recent |
cfx_getStorageRoot | recent | recent |
cfx_getTransactionByHash | OK | recent |
cfx_getTransactionReceipt | OK | recent |
cfx_getVoteList | recent | recent |
cfx_sendRawTransaction | OK | OK |
如果您查询的状态条目在节点上不可用,您将收到错误响应:
// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"cfx_getBalance","params":["cfx:type.user:aarc9abycue0hhzgyrr53m6cxedgccrmmyybjgh4xg", "earliest"],"id":1}' -H "Content-Type: application/json" localhost:12539
// Result
{
"jsonrpc": "2.0",
"error": {
"code": -32016,
"message": "Error processing request: State for epoch (number=0 hash=0x24dcc768132dc7f651d7cb35c52e7bba632eda073d8743f81cfe905ff7e4157a) does not exist: out-of-bound StateAvailabilityBoundary { synced_state_height: 0, lower_bound: 9510001, upper_bound: 9569393, optimistic_executed_height: Some(9569392) }"
},
"id": 1
}
在这个例子中,我们被告知最早可用的状态是在纪元9510001(0x911c71)处。
从以太坊 JSON-RPC 迁移
以太坊和 Conflux 的一些 JSON-RPC 有对应关系。 即使 JSON-RPC 的细节可能有所不同,但以下映射表在从以太坊迁移到 Conflux 时可能会有所帮助:
| 以太坊 | Conflux |
|---|---|
eth_blockNumber | cfx_epochNumber |
eth_call | cfx_call |
eth_estimateGas | cfx_estimateGasAndCollateral |
eth_gasPrice | cfx_gasPrice |
eth_getBalance | cfx_getBalance |
eth_getBlockByHash | cfx_getBlockByHash |
eth_getBlockByNumber | cfx_getBlockByEpochNumber |
eth_getCode | cfx_getCode |
eth_getLogs | cfx_getLogs |
eth_getStorageAt | cfx_getStorageAt |
eth_getTransactionByHash | cfx_getTransactionByHash |
eth_getTransactionCount | cfx_getNextNonce |
eth_getTransactionrecipt | cfx_getTransactionReceipt |
eth_sendRawTransaction | cfx_sendRawTransaction |
GOSSIP, STATE, HISTORY
一些核心的 JSON-RPC 方法需要从 Conflux 网络获取数据,它们可以分为三个主要类别:Gossip, State 和 History。 你可以使用这些部分中的链接跳转到每个方法,或者使用目录来浏览所有方法的列表。
Gossip 方法
这些方法跟踪链的头部。 这是交易在网络中传播、进入区块的方式,以及客户端发现新区块的方式。
- cfx_getStatus
- cfx_epochNumber
- cfx_sendRawTransaction
State 方法
这些方法报告存储的所有数据的当前状态。 “状态”就像一块大的共享内存,包括账户余额、合约数据和 gas 估算。
- cfx_getBalance
- cfx_getStorageAt
- cfx_getNonce
- cfx_getCode
- cfx_call
- cfx_estimateGasAndCollateral
History 方法
获取从创世区块开始的每个区块的历史记录。 这就像一个大型的只追加文件,包括所有区块头、区块体和交易收据。
- cfx_getBlockByHash
- cfx_getBlockByEpochNumber
- cfx_getTransactionByHash
- cfx_getTransactionReceipt
JSON-RPC 方法
cfx_getTransactionByHash
返回关于一个交易的信息,通过它的哈希来识别。
参数
DATA,32 字节 - 交易的哈希。
params: [
"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"
]
返回值
Object - 交易对象,如果没有找到交易,则为 null:
type:QUANTITY,交易的类型。0x0表示传统交易,0x1表示 CIP-2930 交易,0x2表示 CIP-1559 交易。blockHash:DATA,32 字节,包含并执行了这个交易的区块的哈希。null当交易是 pending 时为 nullchainId:QUANTITY- 发送者指定的链 IDcontractCreated:BASE32,创建的合约的地址。null当它不是一个合约部署交易时为 nulldata:DATA,随交易发送的数据。epochHeight:QUANTITY- 发送者指定的 epoch。 注意这不是包含这个交易的区块的 epoch。from:BASE32- 发送者的地址。gas:QUANTITY- 发送者提供的 gas。gasPrice:QUANTITY- 发送者以 Drip 为单位提供的 gas 价格。hash:DATA, 32 Bytes - 交易的哈希。nonce:QUANTITY- 发送者在这之前发送的交易数量。r:DATA, 32 字节 - ECDSA 签名 rs:DATA, 32 字节 - ECDSA 签名 sstatus:QUANTITY- 0表示成功,1表示发生错误,2表示跳过,null表示交易被跳过或未被打包。storageLimit:QUANTITY- 发送者指定的存储限制。to:BASE32- 接收者的地址。null当它是一个合约部署交易时为 nulltransactionIndex:QUANTITY- 表示区块中的交易索引位置。null当交易是 pending 时为 nullv:QUANTITY- ECDSA 恢复 IDvalue:QUANTITY- 转移的价值,以 Drip 为单位。maxGasFeePerGas:QUANTITY,发送者愿意支付的每单位燃气的最大总费用(包括网络/基础费用和矿工/优先费用),以Drip为单位。maxPriorityFeePerGas:QUANTITY,发送者愿意支付给矿工的每单位燃气的最大费用,以Drip为单位。accessList:ARRAY,EIP-2930访问列表。yParity:QUANTITY,secp256k1签名中y值的奇偶性(0表示偶数,1表示奇数)。
注意,字段 blockHash, contractCreated, status 和 transactionIndex 是由节点提供的,因为它们依赖于交易在账本中的位置。 其余的字段是包含在原始交易中或从原始交易中派生出来的。
请注意,字段 type,maxGasFeePerGas,maxPriorityFeePerGas,yParity和 accessList 包含在 Conflux-rust v2.4.0 的响应中。
示例
// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"cfx_getTransactionByHash","params":["0x497755f45baef13a35347933c48c0b8940f2cc3347477b5ed9f165581b082699"],"id":1}' -H "Content-Type: application/json" localhost:12539
// Result
{
"jsonrpc": "2.0",
"result": {
"type": "0x2",
"blockHash": "0x564750c06c7afb10de8beebcf24411cc73439295d5abb1264d2c9b90eee5606f",
"chainId": "0x2",
"contractCreated": null,
"data": "0x0",
"epochHeight": "0x909c9f",
"from": "CFX:TYPE.USER:AARC9ABYCUE0HHZGYRR53M6CXEDGCCRMMYYBJGH4XG",
"gas": "0xf4240",
"gasPrice": "0x174876e800",
"hash": "0x497755f45baef13a35347933c48c0b8940f2cc3347477b5ed9f165581b082699",
"nonce": "0x3b518",
"r": "0x14da6cff1a3cd864b04d1b16f480fa023f449322e318b04bb1109b5754b516ce",
"s": "0x304070abe6488c3532ecb66f4be32b88ee35ce48a4607b8d0c86461987a79fc7",
"status": "0x0",
"storageLimit": "0x100",
"to": "CFX:TYPE.CONTRACT:ACC7UAWF5UBTNMEZVHU9DHC6SGHEA0403Y2DGPYFJP",
"transactionIndex": "0x0",
"v": "0x1",
"value": "0x3635c9adc5dea00000",
"accessList": [],
"maxFeePerGas": "0x4a817c800",
"maxPriorityFeePerGas": "0x4a817c800",
"yParity": "0x0"
},
"id": 1
}
cfx_getBlockByHash
返回关于一个区块的信息,通过它的哈希来识别。
参数
DATA:32 字节,区块的哈希值。Boolean- 如果true,返回完整的交易对象。 如果false, 只返回交易的哈希值
params: [
"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
true
]
返回值
Object - 区块对象,或 null(当没有找到区块时):
adaptive:Boolean-true则该区块在 GHAST 规则下的权重是自适应的。blame:QUANTITY- 如果为 0,则该区块不责怪其父路径上的任何区块。 如果n > 0, 则该区块责 怪其父路径上的nn 个前任,例如, 当n = 1, 则该区块责怪其父区块,但不责怪其父区块的父区块。deferredLogsBloomHash:DATA, 32 Bytes - 在该区块所在 epoch 的延迟执行后的事件地址和事件topic的布隆滤波器的哈希(假设它是主区块)。deferredReceiptsRoot:DATA, 32 Bytes - 在该区块所在 epoch 的延迟执行后的收据的 Merkle 根(假设它是枢轴区块)。deferredStateRoot:DATA, 32 Bytes - 在该区块所在 epoch 的延迟执行后的状态 trie 根三元组的哈希(假设它是枢轴区块)。difficulty:QUANTITY- 该区块的 PoW 难度。epochNumber:QUANTITY- 包含该区块的 epoch 的编号,在节点对账本的视图中。null当 epoch 编号未确定时为 null(例如,该区块不在最佳区块的过去集合中)。gasLimit:QUANTITY, 决定区块的燃气限制。 从Conflux-rust v2.4.0开始,乘以系数0.9以计算出Core Space区块的燃气限制。 例如,如果gasLimit字段值为60,000,000,则交易Gas限制总和的实际最大值为54,000,000。gasUsed:QUANTITY- 该区块使用的总 gas。null当区块是 pending 时为 null。hash:DATA,32 字节 - 区块的哈希。height:QUANTITY- 区块的高度。miner:BASE32- 获得挖矿奖励的受益人地址。nonce:DATA,8 字节 - 已生成的工作量证明的哈 希。parentHash:DATA,32 字节 - 父区块的哈希。powQuality:DATA- PoW 质量。null当区块是 pending 时为 null。refereeHashes:Array- 裁判区块哈希数组。size:QUANTITY- 该区块的字节大小,不包括区块头。timestamp:QUANTITY- 该区块创建的 unix 时间戳。transactions:Array- 交易对象数组,或者 32 字节的交易哈希,取决于第二个参数。transactionsRoot:DATA, 32 字节 - 该区块中交易的 Merkle 根。custom:Array- 自定义信息。 注意从 v2.0 开始,custom的类型已经从数字数组的数组变成了十六进制字符串的数组。blockNumber:QUANTITY- 该区块在树图中的总顺序编号。null当顺序未确定时为 null。 添加自Conflux-rust v1.1.5posReference:DATA, 32 字节 - PoS 最新提交区块的哈希。 添加自Conflux-rust v2.0.0baseFeePerGas:QUANTITY,区块中的每单位燃气的基础费用。 添加自Conflux-rust v2.4.0。
注意,字段 epochNumber 和 gasUsed 是由节点提供的,因为它们依赖于账本。 其余的字段是直接包含在区块头中或从区块头中派生出来的。
示例
// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"cfx_getBlockByHash","params":["0x692373025c7315fa18b2d02139d08e987cd7016025920f59ada4969c24e44e06", false],"id":1}' -H "Content-Type: application/json" localhost:12539
// Result
{
"jsonrpc": "2.0",
"result": {
"adaptive": false,
"blame": 0,
"deferredLogsBloomHash": "0xd397b3b043d87fcd6fad1291ff0bfd16401c274896d8c63a923727f077b8e0b5",
"deferredReceiptsRoot": "0x522717233b96e0a03d85f02f8127aa0e23ef2e0865c95bb7ac577ee3754875e4",
"deferredStateRoot": "0xd449df4ba49f5ab02abf261e976197beecf93c5198a6f0b6bd2713d84115c4ec",
"difficulty": "0xeee440",
"epochNumber": "0x1394cb",
"gasLimit": "0xb2d05e00",
"gasUsed": "0xad5ae8",
"hash": "0x692373025c7315fa18b2d02139d08e987cd7016025920f59ada4969c24e44e06",
"height": "0x1394c9",
"miner": "CFX:TYPE.USER:AARC9ABYCUE0HHZGYRR53M6CXEDGCCRMMYYBJGH4XG",
"nonce": "0x329243b1063c6773",
"parentHash": "0xd1c2ff79834f86eb4bc98e0e526de475144a13719afba6385cf62a4023c02ae3",
"powQuality": "0x2ab0c3513",
"refereeHashes": [
"0xcc103077ede14825a5667bddad79482d7bbf1f1a658fed6894fa0e9287fc6be1"
],
"size": "0x180",
"timestamp": "0x5e8d32a1",
"transactions": [
"0xedfa5b9c38ba51e791cc72b8f75ff758533c8c38f426eddee3fd95d984dd59ff"
],
"custom": ["0x12"],
"transactionsRoot": "0xfb245dae4539ea49812e822adbffa9dd2ee9b3de8f3d9a7d186d351dcc9a6ed4",
"posReference": "0xd1c2ff79834f86eb4bc98e0e526de475144a13719afba6385cf62a4023c02ae3",
"baseFeePerGas": "0x4a817c800"
},
"id": 1
}
cfx_getBlockByEpochNumber
返回一个区块的信息,该区块由它的纪元号(epoch number)标识。