区块链中文技术社区

IBFT共识概述

介绍

伊斯坦布尔拜占庭容错(IBFT)共识是受Castro-Liskov 99论文启发的。

了iBFT通过使用3相一致,从原来PBFT继承PRE-PREPARE,PREPARE和COMMIT。系统最多可以容忍验证器网络中的F故障节点N,其中N = 3F + 1。

执行

术语

共识

《伊斯坦布尔BFT共识协议》从回合开始,0验证者以循环方式从他们自己选择提议者。然后,提议者将提出一个新的整体提议,并将其与PRE-PREPARE消息一起广播。在收到PRE-PREPARE来自提议者的消息后,其他验证者将验证传入的提议并输入消息的状态PRE-PREPARED并广播PREPARE消息。此步骤是确保所有验证程序都在相同的序列和同一轮上工作。当验证器从其他验证器接收到ceil(2N/3)ofPREPARE消息时,验证器将切换到的状态PREPARED并进行广播COMMIT信息。此步骤是要通知其他验证者它接受建议的块,并将该块插入到链中。最后,验证等待ceil(2N/3)的COMMIT消息进入COMMITTED状态,再追加块链。

Istanbul BFT协议中的块是最终的,这意味着没有分叉,并且任何有效块都必须位于主链中的某个位置。为了防止故障节点生成与主链完全不同的链,每个验证器都会在将ceil(2N/3)接收到的COMMIT签名extraData插入到链中之前,将接收到的签名附加到标头中的字段。因此,所有块都是可自我验证的。但是,动态extraData会导致块哈希计算出现问题。由于来自不同验证器的同一块可以具有不同的COMMIT签名集,因此同一块也可以具有不同的块哈希。为了解决这个问题,我们通过排除COMMIT签名部分来计算块哈希。因此,我们仍然可以保持块/块哈希的一致性,并在块头中放入共识证明。

共识国家

Istanbul BFT是一种状态机复制算法。每个验证器维护一个状态机副本,以便达成块共识。IBFT共识中的各个州是,

状态转换

回合变更流程
提案人选择

目前,我们支持两种政策:轮循和粘性提议者。

验证人名单投票

Istanbul BFT使用与Clique类似的验证者投票机制,并从Clique EIP复制大部分内容。每个时代的交易都会重置验证者投票,这意味着将添加或删除验证者的所有待处理投票都将重置。

对于所有交易块:

未来的消息和积压

在异步网络环境中,可能会收到将来无法在当前状态下处理的消息。例如,验证程序可以COMMIT在上接收消息NEW ROUND。我们称这种消息为“未来消息”。当验证器收到将来的消息时,它将把消息放入待办事项中,并尝试在以后尽可能的处理。

常数

Istanbul BFT定义以下常量

块头

Istanbul BFT不会添加新的块标题字段。相反,它遵循Clique重新使用ethash标头字段的方式,如下所示:

type IstanbulExtra struct {
        Validators    []common.Address  //Validator addresses
        Seal          []byte            //Proposer seal 65 bytes
        CommittedSeal [][]byte          //Committed seal, 65 * len(Validators) bytes
}

因此,extraData形式为EXTRA_VANITY | ISTANBUL_EXTRAwhere|代表固定索引,以分隔虚荣和伊斯坦布尔额外数据(不是分隔符的实际字符)。

散列哈希,提议者印章和承诺印章
ethash由于以下原因,Istanbul区块哈希计算与区块哈希计算有所不同:

  1. 提议者需要盖上提议者的印章,extraData以证明该区块已被选定的提议者签名。
  2. 验证者需要放入ceil(2N/3)已提交的印章作为共识证明,extraData以证明该区块已通过共识。

ethash除了需要处理之外,该计算仍然类似于块哈希计算extraData。我们计算字段如下:

投标人印章计算

到提议者印章计算时,提交的印章仍然是未知的,因此我们计算出那些未知数为空的印章。计算如下:

区块哈希计算

在计算块哈希时,我们需要排除提交的密封,因为该数据在不同的验证器之间是动态的。因此,我们CommittedSeal在计算哈希值时会创建一个空数组。计算公式为:

共识证明

在将区块插入区块链之前,每个验证者都需要ceil(2N/3)从其他验证者那里收集已提交的印章,以构成共识证明。一旦接收到足够的承诺密封,这将填补CommittedSeal中IstanbulExtra,重新计算extraData,然后再插入块成blockchain。请注意,由于提交的密封可能因不同的来源而有所不同,因此如上一节所述,我们在计算块哈希值时会排除该部分。

承诺印章计算:

提交的印章是由每个验证者对哈希值COMMIT_MSG_CODE及其私钥的消息代码签名而计算的。计算如下:

出处

GoQuorum中的Istanbul BFT实施基于EIP 650。自从打开EIP以来,它已进行了更新,以通过引入锁定来解决安全问题。

原文:https://docs.goquorum.consensys.net/en/stable/Concepts/Consensus/IBFT/

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »