注:原文 2019.6.26年公布在medium上

最近,Facebook的加密货币我的项目Libra公布了白皮书,在Github上开源了测试网代码。在白皮书中,咱们能够看到Libra应用了LibraBFT,一种拜占庭容错共识协定。因为这个协定来源于Hotstuff协定,因而学习后者能够帮忙咱们了解LibraBFT。

1、Hotstuff是什么?

Hotstuff是一种基于leader的拜占庭容错协定,由VMware实验室在2018年3月提出。该论文将公布在PODC 2019上。相似于许多共识协定,假如网络是一个牢靠和平安的P2P网络,通信模型采纳局部同步模型,这意味着网络存在一个音讯传输提早下限。
本文,将简要介绍Hotstuff的工作原理,以及通过先介绍PBFT来逐步阐明Hotstuff如果打到目标。

2、PBFT是什么?

一般来说,共识协定用来在去中心化网络当中对系统状态达到共识,而后所有诚恳的节点能够从一个状态转移到另一个状态。

一般来说,PBFT采纳二阶段的P2P音讯替换来实现这个目标。
当leader播送它提出的(非法的)状态变动申请给其余节点,一个零碎里的诚恳节点,首先须要晓得有足够多的节点收到了这个申请,这样它能够确认这个申请是非法的。基于这一点,它还须要晓得有足够多的节点也确认了这个申请是非法的,因而确认这是一个在足够多的节点间对于状态变动的共识。

当leader在运行协定过程中失败了,比方节点发现无奈与leader节点通信,而后须要替换leader,这意味着须要批改view。这时,零碎中的节点收回扭转view的申请。当一个节点收到足够多的扭转view的申请时,收回确认扭转view的音讯给新的leader。当新的leader收到足够多的确认扭转view的音讯时,新的view开始产生。

3、Basic HotStuff是什么?

咱们置信HotStuff第一个也是最重要的扭转是将PBFT的网状通信网络编程星型通信模型,这意味着每次通信只须要依赖leader。节点不再通过P2P网络将信息播送给其余节点,而是发送给leader,由leader解决并发送给其余节点。归功于星型网络模型,零碎通信复杂度
大大降落。相似于PBFT,leader提出状态扭转申请,其余节点接管到申请后校验申请合法性。


图1 网状网络模型到星型网络模型

HotStuff第二个重要的扭转将扭转view的过程合并到失常执行过程,这意味着不须要独自的扭转view的过程,因而升高了扭转view的复杂度。能够看到,在HotStuff里,在扭转view过程中,节点不须要在告诉新leader以前,确认音讯“有足够多的节点想要扭转view”,取而代之的是,间接切换到新的view,而后告诉新的leader。Hotstuff将确认“有足够多的节点想要扭转view”的音讯放到失常执行中。这是一个新的办法,然而不可避免的导致对于失常处理过程引入一个新的新的确认阶段。因而,HotStuff扩大PBFT的二阶段到三阶段。
介绍完这两个扭转,当初让咱们看一下HotStuff的阶段。这个协定中,leader首先收集replica收回的新view的音讯。当leader收集到足够多的新view的音讯,它开始新的view,提出状态扭转申请,而后发送prepare音讯给其余节点。接管到prepare音讯后,节点校验音讯的非法心,而后通过一下三个阶段确认音讯:

  1. PRE-COMMIT阶段
    当leader接管到以后提案的prepare投票时,组合这些投票到prepare quorum certificate(qc)中,而后在放到precommit音讯中,播送给其余节点,这意味着有足够多的节点确认这个状态扭转申请。
  2. COMMIT阶段
    当leader接管到以后提案的precommit投票时,组合这些投票到precommit quorum certificate(qc)中,而后在放到commit音讯中,播送给其余节点。其余replica能够锁定以后状态扭转申请,所以能够达到共识论断,即便在一次view扭转过程中(??)。
  3. DECIDE阶段
    当leader接管到以后提案的commit投票时,组合这些投票到commit quorum certificate(qc)中,而后在放到decide音讯中,播送给其余节点。收到decide音讯后,replica能够在已提交分支上执行状态扭转,并且开始新的view。

    图2 basic HotStuff

什么是门限签名?

为了进一步升高通信复杂度,HotStuff做的第三个扭转是引入了一个新的密码学原语:门限签名。

假如在一个(k,n)的门限签名框架里,n个replica独特领有一个公钥,每个replica领有一部分的私钥(分片)。只有有k个replica对音讯进行了签名,这k个签名就能结构出一个残缺的签名,并且能够被公钥验证。

一般来说,残缺的签名和replica的数量无关。Hotstuff应用门限签名来升高在共识协定中的签名个数。

咱们能够看到在Hotstuff的三阶段确认中,投票就是replica的门限签名过程,而后发送给leader。leader收集到足够多个投票,就生成残缺的签名。leader会将签名发到下一个阶段的音讯里,发送给replica,并被校验签名。

图3 门限签名

HotStuff的流水线

能够看到Basic HotStuff的三个确认阶段都有雷同的构造,节点对音讯投票,leader聚合投票,并发送给其余节点。这些阶段能够用通用的形式标识并流水线化。这也是HotStuff的第四个扭转,共识阶段的流水线化。

图4 流水线
pipelined HotStuff在Basic HotStuff上做了改良,在每次prepare阶段都扭转view。事实上,咱们能够看到下一个view的prepare对以后的view的prepare进行确认,就是下一个view的prepare音讯里蕴含了以后view的prepare-commit音讯。因为所有阶段的构造都是统一的,所以流水线化能够实现。

问题

  1. 为什么须要减少一个阶段?
  2. 流水线代码怎么实现?