很多读者都很关心 BM 和 V 神 在 EOS issue 上对于 DPOS 的机制的讨论,接下来我们具体讨论下他们的讨论内容。
我们先来讲述一下最初 EOS 的 DPOS + BFT 的共识机制:当一个特定的区块被 (2/3 + 1) 生产者确认的时候,该块成为不可逆块。
假设现在有 A, B 和 C 三个 BP。
情况 a: A 生产了一个区块 N,B 生产区块 N + 1 并且确认了区块 N,C 生产区块 N + 2 并且确认了区块 N,N +1 , 此时 N 已经有 3 个确认,达到了 2/3 + 1 个确认,则区块 N 成为不可逆。
情况 b: A 生产一个区块 Na,B 生产一个区块 Nb,C 在 Nb 的基础上生产一个区块 N + 1,此时发现 两个区块 N(Na 和 Nb) 都不能达到 2/3 + 1 的确认数了,那岂不是永远不会不可逆了?假如此时 A 在 N + 1 的基础上生产区块 N + 2, B 生产区块 N + 3,此时区块 N + 1 达到了不可逆的,那么 N + 1 所在的该分叉上小于等于 N + 1 的都会变成不可逆,也就是 Nb 也变成不可逆。
提出问题
上面所述的只经过了一次共识,那么会出现什么问题呢。
V 神就在 issue 上提出一个例子。
可以看出第一条链 A 生产的 101 经过 B、C 已经达到了 3 个确认数已经成为不可逆了,但此时 D 因网络不好,没接收到这些块,从而产生分叉开始生产区块 101,之后 A 生产区块 102 , 因为块高度大于之前的 101 所以是可生产的,B 同理,经过 A B 之后 D 生产的 101 同样达到了 三个确认数,这样就会有 2 个块高度为 101 的区块成为了不可逆,造成 conflict。
为什么会造成这个原因呢?
因为区块 101 没有经过所有节点就成为不可逆了,导致后面的产生的区块 101 可在下一轮被确认成为不可逆块。如果说 A ,B ,C ,D 都确认了区块 101, 那么下一轮谁都没可能生产块高度为 101 的区块。也就不会同时出现 2 个不可逆块了。但全部节点确认才成为不可逆这就破坏了引入 BFT 的想法,而且你没办法保证所有节点都会对他进行确认,毕竟网络波动的原因会一直存在。
那怎么解决不可逆块冲突,但是又不会破坏 BFT 的想法呢。
那我们可以继续使用 BFT 的思想,也就是破坏掉第二个区块 101 成为 lib 的条件。
PLIB
这里引进 proposed lib 的概念,即资格成为 lib 的区块,简称 plib。一个区块经过 2/3 + 1 共识后,他不会立马成为 lib, 会先成为 plib, 然后再 plib 经过 2/3 共识后才会成为 lib。
解决问题
由上图,区块 101 成为了 lib, 那么代表 plib 高度至少是 105 了,也就是 7 个节点中至少有五个生产的区块高度达到了 110, 这时候,假如一个 E 生产出区块 101,那么至少需要 2/3 的节点帮他确认成为 plib,也就是有节点能生成 102 – 105,需要 4 个节点,但是 7 个 BP 已经有 5 个的块高度达到了 110,根本就不够节点能让 区块 101 成为不可逆, 那么就不会有 2 个 相同 block_num 的 lib 存在了。也就是当 N 能成为 lib 的时候,根本没有任何情况能让 2 个 N 同时成为 plib (当这里的 N 成为 lib 是排除掉因为 N + m 成为 lib 才使 N 成为 lib 的情况)。
其实这种方式你可以看成几条带 plib 的分叉链,BP 节点对这些链进行 2/3 共识来选出哪条 plib 分叉链作为主链,丢弃掉其他 plib 分叉链。
总结:dpos 3.0 + BFT 有最初的一次共识增加到了 2 次,避免掉出现 conflict lib,但是这也让 head block num 和 lib 的高度拉到至少 2 2/3 21 * 12 = 336 个块 (这种计算方式是忽略 BP 漏块的情况)。用时间算比较准确也就是 168 秒。还有不要嫌字迹不清晰,写到一半笔没墨水了,我也没办法 T T
以上为个人见解,如有错误或者缺漏,还请指正哈。
参考文章:https://github.com/EOSIO/eos/…https://medium.com/eosio/dpos…
转载请注明来源: https://eos.live/detail/19947