因为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