Quorum 中的 RAFT 共识算法如何保证确定性的链扩展?

How does RAFT consensus algorithm in Quorum ensure deterministic chain extension?

在 Quorum 的 RAFT consensus docs 中提到

This chain extension logic is deterministic: the same exact behavior will occur on every single node in the cluster, keeping the blockchain in sync.

在leader发生变更的情况下,共识算法如何保证所有follower节点拥有相同的账本?会不会有一些follower节点先从前一个leader那里得到一个新块,一些节点先从新leader那里得到一个新块?是否有任何同步机制可以避免这种行为?

在领导层更迭期间,跟随者节点有可能从前任领导者那里获得区块;但他们不会使用它,直到新领导者提交该块,这可能不会发生。

raft 复制分两个阶段进行:准备阶段和提交阶段。两者都是通过 Append 消息发生的,该消息具有 committed 水印。

新 raft leader 所做的第一件事就是修复 followers 的日志。也就是说,它会覆盖日志中未提交的部分以匹配自己的部分,然后提交这些部分。

一旦一个区块的转换数低于节点的承诺水印,它就可以用于商业;在此之前,节点必须假定该块可能不正确并且可以被删除。

我强烈建议在 https://raft.github.io/ 上玩可视化:

  1. 关闭大部分节点,但保持领导者和另一个节点处于活动状态;
  2. 请求领导者的价值;
  3. 关闭leader,开启其他节点;
  4. 超时您刚刚重新激活的节点之一(不是具有您请求的值的节点。)
  5. 看看会发生什么。