eyewater
75 天前
看到博主对 PBFT 的两阶段感到困惑,在此解答一下,博主推出来 PBFT 不需要两阶段的原因在于没有考虑网络问题:
假设我们有四个节点 P1,P2,P3,P4 (有一个恶意节点,但是无需标明哪个节点是恶意的)。两个 view ,v1 和 v2 ,以及两个区块 B1 和 B2 。
如果没有两阶段会发生什么(假设只有 prepare 阶段)?
1. 在 v1 ,对于 B1 ,只有 v1 收到了 3 票(2f+1),P2 ,P3 ,P4 都没有收到足够的票(注意,此时已经达到了触发 view change 的条件)。
2. 在 v2 ,对于 B2 ,P2 ,P3 ,P4 收到了 3 票。
此时会发生,在 v1 ,P1 提交了 B1 ,在 v2 ,P2 ,P3 ,P4 提交了 B2 。
此时已经违法了安全性(这是因为网络是半同步)。
如果有两阶段会发生什么( prepare 和 commit )?
1. 在 v1 ,对于 B1 ,只有 P1 收到了 3 个 commit 票,P2 ,P3 ,P4 都没有收到足够的 commit 票。
此时,对于 B1 ,如果 P1 收到 3 个 commit 票,那么至少有两个诚实节点认为 B1 已经 prepared 。
2. 在 v2 ,由于 view change 需要收到 3 个节点的 view change 消息,并且 view change 会包含每个节点认为已经准备好的区块。
由条件 1 ,我们已知有两个节点认为 B1 是 prepared ,在 view change 时,需要三条 view change 消息。那么三条 view change 中至少有两个消息来自诚实节点。
此时,对于 B1 ,有两个诚实节点认为 B1 已经 prepared 。
而 view change 的消息中又包含了两个诚实节点的消息。
我们用 H1 来表示认为 B1 已经 prepared 的诚实节点集合,用 H2 来表示广播 view change 消息的诚实节点集合。
由于|H1| >= 2, |H2| >= 2 ,但是我们只有三个诚实节点,这意味着|H1|与|H2|存在交集。也就是说至少有一个诚实节点认为 B1 已经 prepared 并且广播了一个 view change 消息。
这样,在 v2 ,所有节点还是会对 B1 进行投票。此时,P1 ,P2 ,P3 ,P4 将会提交 B1 。符合安全性。
另外,本人也在找区块链方面的实习,主要研究的是区块链共识协议,对 Ethereum, PBFT, HotStuff 都有比较深入的理解,如果有机会,可以联系我