Week8-8.21
8.22 Epoch Number, Block Number,Height 与 Epoch Height 的区别
Conflux 采用了树图共识,常常会采用 epoch number
与 block number
来标识区块,同时也有着 height
与 epoch height
与区块相关的字段。这些字段的区别如下:
-
Epoch Number(纪元):如图所示,Conflux 会根据共识挑选出蓝色的(pivot)区块,并根据这些区块划分出若干个连续的
epoch
,每个epoch
中会包含一个或多个区块。例如(1)A、C、E、H 在不同的epoch
中,epoch number
不同且递增;(2)B、C的epoch number
相同。 -
Block Number:一旦
epoch
的划分被决定,每个区块会被确定唯一的block number
。block number
决定了交易的执行顺序。图中的所有区块的block numebr
都不相同。
需要注意的是,新上链的区块不稳定,可能发生区块顺序的重组导致
epoch number
与block number
发生变化。
-
Height(区块高度):
height
为区块所包含的字段,等于其父区块的Height+1。蓝色(pivot)区块的height
总是和其epoch number
相等。图中 C、D、G 区块的Height相同。 -
Epoch Height(目标纪元):
epoch height
是交易中发送者所指定的字段,代表着该笔交易被执行时的合法epoch number
范围。交易中的 EpochHeight 参数 对这一点进行了更详尽的解释。
8.23 存储抵押机制
在Conflux中引入了存储抵押(Collateral for storage)机制,作为使用存储的定价方式。合约的交互者在占用存储空间时需要锁定一笔资金,作为占用存储空间的抵押物。在相应的存储空间被释放或被他人覆盖前,抵押物都会被锁定,而被锁定的抵押物所产生的相应利息会直接分配给矿工,用于存储空间的维护。
在Conflux网络中,每个存储条目占用空间是64字节,我们称最后向某个存储条目写入的账户称为该存储条目的所有者。而对于每一个存储条目,其所有者会被锁定 1/16 CFX。当其他账户修改了某个存储条目时,存储条目的所有者会改变,原所有者抵押的资金(1/16 CFX)会被解锁,新所有者则会锁定同样的资金。当合约被销毁时,所有空间会被释放,对应的存储抵押也会被全部解锁。
更加细节的解析可以参考Conflux的存储抵押机制。
8.24 代付中存储抵押的更新
Conflux 中的代付机制除了支持 gas 的代付外也支持存储抵押的代付。赞助者可以通过调用代付合约的setSponsorForCollateral(address contractAddr)
并发送一笔CFX更新存储抵押代付,新发送的CFX需要大于原有的存储抵押。其后,原赞助者为存储抵押支付的所有CFX(包括已被使用的存储抵押与未被使用的存储抵押)将会被全部返还。
8.25 在内置合约 Staking 中质押 CFX
在 Conflux 中,除了因交易的存储开销导致CFX被抵押外,账户还可以与内置合约 Staking 交互主动质押 CFX。质押的 CFX 目前有两种用途:
- 用于参与POS链。参考如何参与POS?
- 用于参与治理投票,包括治理与即将上线的CIP-94 On-chain DAO Vote for Chain Parameters 。
8.26 与 Pivot 区块相关的 RPC 方法
Pivot 区块(下图中蓝色的区块)十分重要,决定了 Conflux 中区块(中交易)实际的执行顺序。Conflux 的 RPC 也提供了数个与 Pivot 区块相关的方法:
-
cfx_getStatus
与cfx_getBestBlockHash
。cfx_getStatus
获得的bestHash
字段代表了在最新一个epoch中Pivot 区块的哈希值。cfx_getBestBlockHash
所获取的也是该值。
// getStatus
{
"jsonrpc": "2.0",
"result": {
"bestHash": "0xe4bf02ad95ad5452c7676d3dfc2e57fde2a70806c2e68231c58c77cdda5b7c6c",
"chainId": "0x1",
"networkId": "0x1",
"blockNumber": "0x1a80325",
"epochNumber": "0xaf28ab",
"latestCheckpoint": "0xada520",
"latestConfirmed": "0xaf2885",
"latestState": "0xaf28a7",
"latestFinalized": "0x2a420c",
"ethereumSpaceChainId": "0x22b9",
"pendingTxNumber": "0x0"
},
"id": 1
}
-
cfx_getBlocksByEpoch
。该 RPC 会返回某一个 Epoch 下的所有区块,并按照 blockNumber 排序。换言之,该返回值中的最后一个区块为 Pivot 区块.
// Result
{
"jsonrpc": "2.0",
"result": [
"0x618e813ed93f1020bab13a1ab77e1550da6c89d9c69de837033512e91ac46bd0",
"0x0f6ac81dcbc612e72e0019681bcec32254a34bd29a6bbab91e5e8dc37ecb64d5",
"0xad3238c00456adfbf847d251b004c1e306fe637227bb1b9917d77bd5b207af68",
"0x0f92c2e796be7b016d8b74c6c270fb1851e47fabaca3e464d407544286d6cd34",
"0x5bcc2b8d2493797fcadf7b80228ef5b713eb9ff65f7cdd86562db629d0caf721",
"0x7fcdc6fff506b19a2bd72cd3430310915f19a59b046759bb790ba4eeb95e9956",
"0xf4f33ed08e1c625f4dde608eeb92991d77fff26122bab28a6b3a2037511dcc83",
"0xa3762adc7f066d5cb62c683c2655be3bc3405ff1397f77d2e1dbeff2d8522e00",
"0xba7588476a5ec7e0ade00f060180cadb7430fd1be48940414baac48c0d39556d",
"0xe4dc4541d07118b598b2ec67bbdaa219eb1d649471fe7b5667a0001d83b1e9b6",
"0x93a15564544c57d6cb68dbdf60133b318a94439e1f0a9ccb331b0f5a0aaf8049" // pivot
],
"id": 1
}
-
cfx_getBlockByHashWithPivotAssumption
。该 RPC 与常用的cfx_getBlockByHash
类似,不同点在于,该 RPC 需要传入三个参数:(1)blockHash(2)assumedPivotHash(3)epochNumber。当后面两个参数与blockHash相匹配时,该RPC才会返回 blockHash 对应的区块信息,否则会返回错误。
No Comments