Skip to main content

Week8-8.21

8.22 Epoch Number, Block Number,Height 与 Epoch Height 的区别

Conflux 采用了树图共识,常常会采用 epoch numberblock number 来标识区块,同时也有着 heightepoch height 与区块相关的字段。这些字段的区别如下:

  1. Epoch Number(纪元):如图所示,Conflux 会根据共识挑选出蓝色的(pivot)区块,并根据这些区块划分出若干个连续的 epoch,每个 epoch 中会包含一个或多个区块。例如(1)A、C、E、H 在不同的 epoch 中,epoch number 不同且递增;(2)B、C的epoch number相同。

  2. Block Number:一旦 epoch 的划分被决定,每个区块会被确定唯一的 block numberblock number 决定了交易的执行顺序。图中的所有区块的 block numebr 都不相同。

需要注意的是,新上链的区块不稳定,可能发生区块顺序的重组导致epoch numberblock number发生变化。

  1. Height(区块高度):height 为区块所包含的字段,等于其父区块的Height+1。蓝色(pivot)区块的height总是和其epoch number相等。图中 C、D、G 区块的Height相同。

  2. Epoch Height(目标纪元):epoch height 是交易中发送者所指定的字段,代表着该笔交易被执行时的合法epoch number范围。交易中的 EpochHeight 参数 对这一点进行了更详尽的解释。

tree_graph.jpeg

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 目前有两种用途:

  1. 用于参与POS链。参考如何参与POS?
  2. 用于参与治理投票,包括治理与即将上线的CIP-94 On-chain DAO Vote for Chain Parameters

8.26 与 Pivot 区块相关的 RPC 方法

Pivot 区块(下图中蓝色的区块)十分重要,决定了 Conflux 中区块(中交易)实际的执行顺序。Conflux 的 RPC 也提供了数个与 Pivot 区块相关的方法:

tree_graph.jpeg

  1. cfx_getStatuscfx_getBestBlockHashcfx_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
}
  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
}
  1. cfx_getBlockByHashWithPivotAssumption。该 RPC 与常用的 cfx_getBlockByHash 类似,不同点在于,该 RPC 需要传入三个参数:(1)blockHash(2)assumedPivotHash(3)epochNumber。当后面两个参数与blockHash相匹配时,该RPC才会返回 blockHash 对应的区块信息,否则会返回错误。