Tower BFT——Solana的PBFT的高性能实现

989 阅读6分钟

在这篇博文中,我们将探讨Tower BFT,这是Solana对PBFT的定制实现,它更倾向于灵活性而不是一致性。Tower BFT利用Solana的PoH作为共识前的时钟,以减少消息传递的开销和延迟。

"为了提供有效性,复制体必须移动到一个新的视图,如果他们无法执行一个请求。然而,重要的是最大限度地延长时间,当至少有2f+1个非故障复制体在同一视图中时,并确保该时间段以指数形式增加,直到一些请求的操作被执行"(Practical Byzantine Fault Tolerance, Miguel Castro and Barbara Liskov)。

Solana实现了PBFT的推导,但有一个根本区别。历史证明(PoH)提供了共识前的全球时间来源。我们对PBFT的实现使用PoH作为网络时间时钟,复制者在PBFT中使用的指数级增加的超时可以在PoH本身中计算和强制执行。

PoH是一个可验证的延迟函数,作为顺序哈希函数实现。我们使用VDF的宽松定义,因为验证需要(计算时间)/(核心数量)。PoH如何工作的基本原则如下:

  1. Sha256尽可能快地进行循环,这样每个输出都是下一个输入。
  2. 循环被采样,迭代次数和状态被记录。

记录的样本代表了时间的流逝,被编码为可验证的数据结构。此外,这个循环还可以用来记录事件。

  1. 引用任何一个样本的消息都被保证是在该样本之后创建的。
  2. 消息可以被插入到循环中,并与状态一起被散列。这保证了一条消息是在下一次插入之前创建的。 这种数据结构既保证了时间,也保证了嵌入其中的事件的顺序,这个核心思想是Solana中所有主要技术优化的基础。

以另一种方式说明。想象一下,你在一个岛上,一个瓶子飘过,里面有一个拇指驱动器。该驱动器上是Solana PoH分类帐。只需使用PoH账本,你就可以计算出网络中所有节点的状态。例如,如果在过去的X个哈希值中没有记录对账本的投票,那么一个节点就被认为是失败的。如果在过去的X个哈希值中,有签署了验证信息的网络的超级多数,我们可以认为账本是有效的。

  1. 所有检查这个数据结构的节点将计算出完全相同的结果,不需要任何点对点的通信。

  2. PoH哈希值唯一标识了账本的那个分叉。

  3. 以及只有当它所投票的PoH哈希值存在于账本中时,验证投票信息才是有效的。 这给我们带来了投票和PBFT。由于分类账本身是一个可靠的网络时钟,我们可以将PBFT超时编码在分类账本身。

  4. 一个投票从N个哈希值的超时开始。

验证者保证(用斜线),一旦对一个PoH哈希投了票,验证者就不会对任何不属于该投票的PoH哈希投票,至少有N个哈希。

  1. 所有前辈投票的超时时间都是双倍的。

为了使操作更容易管理,投票被限制在一个固定的哈希值期间,我们称之为槽位。我们对槽的目标是代表400ms左右的哈希值的数量。每隔400毫秒,网络就有一个潜在的回滚点,但每一个后续的投票都会使网络在展开投票之前必须拖延的实际时间翻倍。

想象一下,每个验证者在过去的12秒内投票了32次。12秒前的投票现在有2³²个时段的超时,或者大约54年。有效地,这个投票将永远不会被网络回滚。而最近的一次投票的超时时间是2个槽,或者大约800ms。随着新的区块被添加到账本中,旧的区块越来越有可能被确认,因为旧的投票被承诺的槽数每槽翻倍,或者每400ms。

请注意,虽然这听起来像是工作证明中的概率最终性,但它不是。一旦⅔验证者对某个PoH散列进行了投票,该PoH散列就被规范化了,不能再回滚。这与工作证明不同,在工作证明中没有规范化的概念。

为了防止被锁定在网络的其他部分,每个验证者确保他们只在看到网络中的超级多数人也在同一账本上投票时才投票。每个验证者都会监测祖先投票的超时时间何时会超过预定的阈值--比如从5分钟到10分钟--并确保网络的超级多数已经在包含该投票的分叉上投票。在实践中,验证者:

  1. 检查超级多数是否已经对一个将承诺超时10分钟的槽进行了投票。
  2. 如果没有,就不要投票。

那么,在分区期间,网络发生了什么,超时实际上开始过期?

  1. 任何已经过期的投票都被清除了。
  2. 当且仅当子代有相同的超时时间时,祖代的超时时间加倍。 例如,让我们考虑一个场景,其中当前的超时是:

64, 32, 16, 8, 4, 2

如果一个验证人停止了17个名额的投票,并再次投票,那么验证人的超时将是:

64, 32, 2

再连续投4次,所有的祖先才会再次超时一倍:

64, 32, 4, 2

64, 32, 8, 4, 2

64, 32, 16, 4, 2

最后第4票会使所有超时的票数翻倍:

128, 64, 32, 16, 8, 4, 2

这种方法允许网络不断地流转区块,而不会使账本停滞,直到超级多数观察到相同的账本。另一个值得注意的方面是,网络中的每个参与者都可以计算出其他每个参与者的超时时间,而不需要任何P2P通信。这就是Tower BFT的异步性。

我们预计会有很多微分叉被迅速丢弃。当验证者检测到多个分叉时,诚实的验证者会计算每个分叉的有效赌注加权超时,并挑选最重的一个。验证者的奖励只产生于达到2³²超时的投票。因此,验证者在最重的分叉上投票是有激励作用的,因为拥有最大数量的赌注加权超时的分叉将为网络产生最大数量的奖励。