很多读者都很关心 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


firesWu
10 声望4 粉丝