因为 Conflux 实现构造与 Ethereum 不同,所以概念上及实现上也有很大的区别,本文次要介绍针对 Conflux RPC 应用与以太坊 RPC 应用的区别
概念介绍
Epoch
以太坊区块链中只有主链上的交易是无效的,所以可认为以太坊区块账本是一条单链,从前往后每个区块都有一个编号,叫做区块号(block number),conflux 开发了一种全新的账本构造: 树图,实现了高吞吐,低提早。
在树图区块构造中,如果只看父边他是一个 Tree,如果父边援用边都看则是一个 Graph。正是这种构造使得 Conflux 网络能够并收回块,即多个区块能够都在某个区块之后生成。因而在 Conflux 是没有 block number 的概念。但为了实现全序,Conflux 通过 GHAST 规定从创世区块开始,在其所有子区块中抉择最重子树 block 为 pivot block,所有的 pivot block 链到一块也造成一条链 定义为 pivot chain,如果只看 pivot chain 其跟一般的区块链构造统一,在这条链上基于每个 pivot block 定义一个 Epoch,因而你能够把 conflux 中的 Epoch 了解为跟 block number 对应的概念,只不过 conflux 中的每个 epoch 中可能会有多个 block。
Storage Limit
在事实世界中,发动交易须要领取人力、物力、工夫、手续费等老本,而在区块链网络中发送交易须要给矿工付手续费,在 Conflux、以太坊中同样如此。具体来讲,Conflux、ETH 网络的交易最终是由矿工 运行的 VM 执行的,gas 是用来掂量一笔交易执行的工作量(能够了解为工作的工时),交易发送者,发送交易时能够指定违心给每个工作量付的价格即 gasPrice。因而最终一笔交易的手续费为 gas * gasPrice。在发送一笔交易时指定的 gas 则是一个限度值,即发送方最大违心为一笔交易领取 gas 这么多的工时,如果交易须要的工作量超过 gas,则不会再付钱,交易不会被执行。
在 Dapp 零碎中,交易执行除了须要 Node 进行计算付出计算资源外,还须要 Node 存储合约的状态,因而须要付出存储资源。在 Conflux 零碎中发送交易时,还须要为状态存储 抵押一部分费用,因而在 conflux 中发送交易时会比以太坊多一个 storageLimit 参数,用于设置违心为某笔交易存储所抵押的费用下限。在合约开释掉应用的存储空间之后,抵押的费用 也会失去返还。
RPC 相干参数介绍
Epoch Number 可选项
当发送 RPC 申请时,有些 RPC 须要携带 Epoch Number 参数,Epoch Number 示意要申请在哪个 Epoch 的状态。以下是参数 Epoch Number 的可选项:
格局 | 意义 |
---|---|
16 进制字符串 | epoch number 整形数值(如 ”0x1000″ 示意 Epoch number 4096) |
字符串 “earliest” | 创世块所在的 Epoch 高度 |
字符串 “latest_checkpoint” | 以后 checkpoint 的第一个 Epoch 高度 |
字符串 “latest_state” | 最近执行的区块所在的 Epoch 高度 |
字符串 “latest_mined” | 最新挖出的区块所在的 Epoch 高度 |
留神,出于性能优化的思考,最新的 Epoch 是不可执行的,所以在这些 Epoch 里没有可用的状态。对于大多数与状态查问无关的 RPCs,倡议应用 ”latest_state”。
数据的 16 进制编码规定
发送 RPC 申请时,无格局的字节数组和数值,两种要害数据类型是通过 JSON 格局数据进行传输。两者都以十六进制编码传输,但格局稍有不同:
1. 对数值编码
当编码数值(整数,数字)时:编码为前缀为 ”0x” 的十六进制,应用最紧凑的表现形式(例外:零示意为 ”0x0″)。示例如下:
正确示例:
- 0x41(十进制数字 65)
- 0x400(十进制数字 1024)
谬误示例:
- 谬误: 0x(需至多有一位数字 – 零为 “0x0″)
- 谬误: 0x0400(不容许以零结尾)
- 谬误: ff(必须以 0x 为前缀)
2. 对无格局数据编码
当编码无格局数据(字节数组,帐户地址,哈希值,字节码数组)时也是应用前缀为 ”0x” 的十六进制编码,与数值编码的区别是:每个字节必须蕴含应用两位十六进制数字。示例如下:
正确示例:
- 0x41 (长度为 1,示意字符串 ”A”)
- 0x004200 (长度为 3,示意字符串 ”\0B\0″)
- 0x (长度为 0,示意字符串 ””)
谬误示例
- 谬误: 0xf0f0f (必须为偶数位数)
- 谬误: 004200 (必须以 0x 结尾)
设置 GasLimit & StorageLimit & EpochHeight
发送交易时,倡议先应用 RPC cfx_estimateGasAndCollateral
返回预估的 gas 应用数量和存储抵押数量;然而因为理论执行耗费与预估后果有差别,为了避免交易执行失败,倡议在理论发送交易时,设置 gaslimit 与 storage_limit 的值为 预估值 * 4/3
。
参数 EpochHeight 示意这笔交易将会在 Epoch 为 [EpochHeight-100000 , EpochHeight+100000]
的区间内执行,当超出这个区间这笔交易将被抛弃,倡议设置以后 Epoch 值即可。
Conflux VS Ethereum JSONRPC
以下是对 Conflux 与 Ethereum 的 JSON RPC 的应用比拟,Conflux RPC 具体介绍请参见 JSON RPC 开发者文档
Public RPC
Conflux Public RPC | 对应 Ethereum RPC | RPC 参数 | 须要 epoch number 参数? | |
---|---|---|---|---|
cfx_gasPrice | eth_gasPrice | N | ||
cfx_epochNumber | eth_blockNumber | epoch_number | Y | |
cfx_getBalance | eth_getBalance | address,epoch_number | Y | |
cfx_getAdmin | – | address,epoch_number | Y | |
cfx_getSponsorInfo | – | address,epoch_number | Y | |
cfx_getStakingBalance | – | address,epoch_number | Y | |
cfx_getCollateralForStorage | – | address,epoch_number | Y | |
cfx_getCode | eth_getCode | address,epoch_number | Y | |
cfx_getStorageAt | eth_getStorageAt | address,pos,epoch_number | Y | |
cfx_getStorageRoot | – | address,epoch_number | Y | |
cfx_getBlockByHash | eth_getBlockByHash | block_hash,include_txs | N | |
cfx_getBlockByHashWithPivotAssumption | – | block_hash, pivot_hash, epoch_number, | Y | |
cfx_getBlockByEpochNumber | eth_getBlockByNumber | epoch_number, include_txs | Y | |
cfx_getBestBlockHash | – | N | ||
cfx_getNextNonce | – | address, epoch_number | Y | |
cfx_sendRawTransaction | eth_sendRawTransaction | raw_tx | N | |
cfx_call | eth_call | tx, epoch_number | Y | |
cfx_getLogs | eth_getLogs | filter | N | |
cfx_getTransactionByHash | eth_getTransactionByHash | tx_hash | N | |
cfx_estimateGasAndCollateral | eth_estimateGas | request, epoch_number | Y | |
cfx_checkBalanceAgainstTransaction | – | account_addr, contract_addr, gas_limit,gas_price, storage_limit, epoch | Y | |
cfx_getBlocksByEpoch | – | epoch_number | Y | |
cfx_getSkippedBlocksByEpoch | – | epoch_number | Y | |
cfx_getTransactionReceipt | eth_getTransactionReceipt | tx_hash | N | |
cfx_getAccount | – | address, epoch_number | Y | |
cfx_getInterestRate | – | epoch_number | Y | |
cfx_getAccumulateInterestRate | – | epoch_number | Y | |
cfx_getConfirmationRiskByHash | – | block_hash | N | |
cfx_getStatus | – | N | ||
cfx_getBlockRewardInfo | – | epoch_number | Y | |
cfx_clientVersion | web3_clientVersion | N |
Local RPC
Conflux 除了公共 rpc 外,还有一部分 rpc 出于平安及性能方面的思考限度只能在本地拜访
Conflux local rpc | 对应 Ethereum rpc |
---|---|
txpool_status | – |
tx_inspect | – |
txpool_inspect | – |
txpool_content | eth_newPendingTransactionFilter |
getTransactionsFromPool | – |
clear_tx_pool | – |
net_throttling | – |
net_node | – |
net_disconnect_node | – |
net_sessions | – |
current_sync_phase | – |
consensus_graph_state | – |
sync_graph_state | – |
cfx_sendTransaction | eth_sendTransaction |
accounts | eth_accounts |
new_account | – |
unlock_account | – |
lock_account | – |
sign | eth_sign |
暂无对应关系的以太坊 RPC
以下是以太坊中有的,Conflux 临时还没有对应关系的 RPC
- web3_sha3
- net_version
- net_peerCount
- net_listening
- eth_protocolVersion
- eth_coinbase
- eth_mining
- eth_hashrate
- eth_getTransactionCount
- eth_getBlockTransactionCountByHash
- eth_getBlockTransactionCountByNumber
- eth_getUncleCountByBlockHash
- eth_getUncleCountByBlockNumber
- eth_signTransaction
- eth_getTransactionByBlockHashAndIndex
- eth_getTransactionByBlockNumberAndIndex
- eth_getUncleByBlockHashAndIndex
- eth_getUncleByBlockNumberAndIndex
- eth_getCompilers
- eth_compileLLL
- eth_compileSolidity
- eth_compileSerpent
- eth_newFilter
- eth_newBlockFilter
- eth_uninstallFilter
- eth_getFilterChanges
- eth_getWork
- eth_submitWork
- eth_submitHashrate
- db_putString
- db_getString
- db_putHex
- db_getHex
- shh_post
- shh_version
- shh_newIdentity
- shh_hasIdentity
- shh_newGroup
- shh_addToGroup
- shh_newFilter
- shh_uninstallFilter
- shh_getFilterChanges
- shh_getMessages
- eth_syncing