整体架构

整体架构

检查点 Checkpoint

RootHash is the Merkle hash of Bor block hashes from StartBlock to EndBlock
checkpoint 就是一开始区块到结束区块构建成的Merkle根hash。

其实就是一组block区块的keccak256,再组装起来,生成一个MerkleHash
然后提交到主链给合约验证合法性,以更新侧链状态。

总体流程

两个作用

先说两个概念:

  1. 铸币
  2. 燃烧

用户从 ETH->MATIC 即,在ETH链上质押ETH到Matic链上,是存款操作,matic链上会进行相关的铸币操作。
用户从 MATIC->ETH 即,从Matic链上提现到ETH链上,是取款操作,Matic链上就会先燃烧Matic代币,再从ETH中释放对应ETH,就是燃烧。

1.通过提交到以太坊主链上的 checkpoint来决定,侧链上block的最终性(finality)。
2.在用户提现资产到主链上时,可以提供燃烧证明。

检查点很重要,因为它们在以太坊链上提供了最终性。
Heimdall 层允许将 Bor 生成的区块聚合到单个 Merkle 根中,并定期将其发布到以太坊主链。此已发布状态也称为检查点,因此整个过程称为检查点。

除了在主链上提供最终性之外,检查点(checkpoint)在取款中还可以发挥非常重要的作用,因为它们包含在用户取款时代币燃烧证明(取款)。
它允许用户使用 Patricia Merkle 证明和头块证明在根和约上证明其剩余代币。
注意,要证明剩余代币,必须通过PoS(权益持有人,就是 validtor)将头块提交到根链。
提款过程将照常收取以太坊gas费。
这些信息包含了用来验证用户在侧链上真实燃烧了一定数量代币的所需要的所有信息。

燃烧证明

取款,核心 Merkle 根
燃烧证明是什么:
简单说就是证明用户在侧链上确实发生了一笔资产提现的交易,验证这个燃烧证明有效的话,会将资产打到用户的地址,反之,如果验证不通过,则用户的这笔提现将失败。

用户等待checkpoint提交到主链上后,在侧链通过bttc sdk可以获取燃烧证明(the proof of burn trx)。

这里燃烧证明解决的是上面的第三个问题,即目标链上的信息传递到主链上的有效性问题。

形成一个 checkpoint(工作原理)

RootHash is the Merkle hash of Bor block hashes from StartBlock to EndBlock

一个区块内的多笔交易计算出blockhash

1
blockHash = keccak256([number, time, tx hash, receipt hash]) 

所有block hash参于生成 Merkle Hash

1
2
3
4
5
6
7
8
9
10
11
Pseudocode for the root hash for 1 to n Bor blocks:

B(1) := keccak256([number, time, tx hash, receipt hash])
B(2) := keccak256([number, time, tx hash, receipt hash])
.
.
.
B(n) := keccak256([number, time, tx hash, receipt hash])

// checkpoint is Merkle root of all block hash
checkpoint's root hash = Merkel[B(1), B(2), ....., B(n)]

而上面提到的这笔用来申请提现的燃烧交易,就被包含在这个区块当中,并且被用来计算出这个块的blockhash.当累计了一定数量的块之后(从startblock到endblock,参见上面checkpoint结构),这些块被计算出各自的blockhash,然后用这些blockhash来计算出root hash,如下面共识所示:

1
2
3
4
5
6
7
8
9
// Checkpoint block header struct
type Checkpoint struct {
Proposer HeimdallAddress `json:"proposer"`
StartBlock uint64 `json:"start_block"`
EndBlock uint64 `json:"end_block"`
RootHash HeimdallHash `json:"root_hash"`
BorChainID string `json:"bor_chain_id"`
TimeStamp uint64 `json:"timestamp"`
}

从代码上看默认是5分钟提一次checkpoint。
目前 侧链(BOR) 是2s 一个块,checkpoint最低提交256个快,checkpoint_poll_interval 最低合理值为8m32s,
最大值为1024*2s ,34m8s,可设置[9,30]分钟,如果有多条主链的的情况下,可根据各主链手续费不同,可以拆分此checkpoint_poll_interval分别设置。

1
2
3
4
DefaultCheckpointerPollInterval = 5 * time.Minute
DefaultSyncerPollInterval = 1 * time.Minute
DefaultNoACKPollInterval = 1010 * time.Second
DefaultClerkPollInterval = 10 * time.Second