原文标题:《NEAR 最新出块设计 Doomslug 比较 PBFT、Tendermint、HotStuff》
原文来源:NEAR 中文社区
本文将分析 NEAR 的最新出块技术 Doomslug 同 PBFT、Tendermint 以及 HotStuff 之间的区别。我们将深入了解 PBFT、Tendermint 以及 HotStuff 的工作原理,包括视域变换、流水线化、响应性以及其他细节。
在 21 世纪 10 年代的最后一天(2019.12.31),NEAR 发布了 Doomslug 的论文(https://near.ai/doomslug_14),提出了一个新的出块方式,使得 NEAR 能通过一轮通讯达到一定的实用确定性,并通过最终确定性组件在两轮通讯后提供完全的 BFT 确定性。
(简单来说,拜占庭容错(BFT)是能够抵抗拜占庭将军问题导致的一系列失败的系统属性。这意味着即使某些节点出现故障或恶意行为,拜占庭容错系统也能够继续运行。——Binance Academy)
我们所说的实用确定性或者说 Doomslug 确定性,指的是除非有一个节点作恶,通过 Doomslug 产出的一个区块不可逆。Doomslug 另一个优异的特征是只要有一半的参与者在线或诚实,它就能持续产出并确定区块,而不像其他 BFT 共识机制一样需要三分之二的人在线(当然,最终确定性组件仍然需要三分之二的参与者在线)。
现在 Doomslug 已经部署在了 NEAR 上,是时候解释一下它是怎么运作的了,以及它同其他出块方式的区别,特别是和 Tendermint 和 HotStuff 的差异。
如果你对本文有任何想法,欢迎反馈,你可以在论坛中提问。
https://near.ai/discuss_14
Doomslug 如何工作
简单来说,Doomslug 的工作原理是让一组参与者轮流产生并广播区块。一旦参与者接收到高度 h 的区块,他们会为把对此区块进行的背书发送给 h+1 区块的出块人。如果一段预设的时间后,h+1 的出块人并没有产出区块,发送过背书的人将会发送另一条信息给 h+2 区块的出块人,暗示他们建议跳过 h+1 区块。
一旦一个参与者拥有总数过半的背书或跳过信息,他就可以产出自己的块。
只要处理好信息延迟以及一些确实的作恶情况,这个看起来很简单的方式就可以提供我们想要的特性:如果一个由 Doomslug 产出的区块获得了上个区块过半出块人的背书,那上个区块就是不可逆的了,除非其中至少一个出块人作恶。更重要的是,它保证了即使网络缓慢,信息延迟,一个包含过半背书的区块总会被创造出来,所以该算法不会失效。
如前所述,会有一个最终确定性组件和 Doomslug 一同运行。在正常情况下,当 h+1 的区块产出时,高度 h 的区块就获得了 Doomslug 确定性,而 h-1 的区块将拥有完整的 BFT 确定性。也就是说,只要不是三分之一的人作恶,该区块不可能被修改。我们将比较 Doomslug 同其他共识算法之间的优劣。
Doomslug 和最终确定性组件都是在不假设网络速度以及可靠性的前提下提供区块不可逆转性的。也就是说 Doomslug 和最终确定下组件都能在异步网络的前提下提供安全性。但是,要保证这两个算法不失效(或者说「活性」)需要假设一定的同步网络。这是很常规的假设,所有在本文中讨论的共识算法都在其「活性」论证中有相同的的假设。在异步网络中同时拥有安全性和活性是不可能的,这被称为「FLP 不可能」。
对 PBFT、Tendermint 以及 HotStuff 的简单介绍
在我们比较 Doomslug 和 Tendermint 以及 HotStuff 之前,先来看看另两个算法是如何工作的。
在最好的情况下,PBFT、Tendermint 和 HotStuff 的工作原理十分相近:
共识协议通常在多个视域中起作用,最少一个。每个视域都会有一个被指派的领袖来执行共识。领袖提出一个特定的结果。在第一个视域中,对结果的选择是随意的。该领袖将这一结果发送给其他参与者,参与者们反馈针对这一结果的预投票。三分之二的预投票到位后,参与者会发送针对该结果的预承诺。一旦三分之二的参与者进行了预承诺,共识就达成了。
参与者之间交换信息的方式根据协议有所不同。在 Tendermint 中,参与者使用 gossip 协议,每个参与者在本地累加预投票和预承诺的数量;而在 HotStuff 中,是由领袖来计算信息并反馈给参与者。
整个过程只需要线性增长的网络开销就可以完成。事实上,如果只由领袖来计算预投票和预承诺的数量,那特定结果的首次广播和其他参与者的预投票、预承诺反馈就已经是线性的了。唯一的次方级增长开销是发送累计的预投票和预承诺,但这也可以通过一些方法解决,如 BLS 签名。
如果一个领袖因为某些原因没能达成共识,那就将转移至下一个视域,下一个领袖将再次尝试。视域变换是 HotStuff 以及 Tendermint 同 PBFT 最显著的区别点。在 PBFT 中,每个参与者有个计时器来计算从视域开始过了多少时间,一旦计时器超过了某个阈值,会发送一个视域变换信息给下一个领袖。当下一个领袖获得了超过三分之二的视域变换信息,他将回复一个开启新视域的信息。这整个过程需要至少立方级别的开销,同时也相当难正确地实行。
Tendermint 以及 HotStuff 用不同的方法来进行视域变换。预投票和预承诺阶段都有一个超时设置,当超时被触发时,参与者会发送一个相应的预投票或预承诺信息给「空对象」,并在本地前进到下一个阶段或视域。因此,视域变换不是一个协同步骤,而是一个隐秘操作。由于进行视域变换和承诺区块的机制是基本相同的,这使得算法变得相当简单。
Tendermint 同 HotStuff 有两个主要的区别。一是 HotStuff 是流水线化的,这意味着上一个视域的预承诺是下一个视域的预投票,相比非流水线版本减少了几乎一半步骤。有提议指出应把 Tendermint 也流水线化,但 Cosmos 提出和使用的版本并没有流水线设计。第二点,也是最多被讨论的是,HotStuff 拥有响应性的设计,一个诚实的领袖将永远在有网络延迟的前提下按时达成共识,而不会超时。而 Tendermint 则不是如此,在预承诺阶段,如果一个参与者发现有二分之三的参与者给空对象发送了预承诺,他们将不能移动到下一个视域,直到超时结束,否则,一个对网络控制得当的攻击者可以使算法永远在视域之间切换。
响应性虽然是一个简洁的设计,但也有某种程度的误导性。具体来说,它只能保证如果领袖在线且诚实,达成共识的时间将被限制在网络延迟内。如果领袖不在线,这个系统仍将等待整个超时时间,并进入下一个视域。在 Cosmos 的实际运用中,它已经运行了大量 Tendermint 节点很长时间,所有发生的视域变换都是由于领袖掉线,而不是由于向空对象预承诺,也就是说即使加入 HotStuff 的响应性设计,至今也不会对 Cosmos 产生任何帮助。
本文也不在这深入追究 HotStuff 达到响应性需要额外的通讯轮次。在第一个视域中,这么一个额外的轮次可以被省略,而在第二个视域中,它又被流水线化带来的优势所补偿了,因此这额外一轮的通讯不太会是一个大问题。
Doomslug vs Tendermint & HotStuff
理想情况
现在,让我们比较一下带最终确定性组件的 Doomslug 同 Tendermint 和 HotStuff 在不同场景下的差异。首先,让我们考虑没有视域变换发生的情况,所有信息都及时到达了领袖处。
如上图所示,灰色区块是被提出的区块,蓝色区块是拥有 BFT 确定性的区块,黄色的区块是拥有 Doomslug 确定性的区块。
在正常情况下,HotStuff 和 Tendermint 表现的完全相同:当一个区块被提出,在两轮通讯后,区块被最终确定,再两轮后,紧随的区块也得到最终确定。值得注意的是 HotStuff 不在区块间流水线化,而只在视域间,因此产出两个区块依旧需要 4 轮通讯,而不是 3 轮。
Doomslug 没有缩短达到 BFT 确定性需要的延迟,因此因此当第一个区块产出后,它仍旧需要两轮通讯来达到 BFT 确定性。但是,如上所述,在一轮通讯后,区块已经达到了一个比 BFT 弱的确定性,也就是 Doomslug 确定性,也就是说除非至少一个出块人作恶,该区块已经是不可逆的了。
还要注意,由于最终确定性组件的特性,他们的吞吐量和底层出块数是一样的,因此在三轮通讯后,已经有两个区块达到了 BFT 确定性,在四轮通讯后,则是有三个区块,换句来说,尽管带最终确定性组件的 Doomslug 需要相同的时间让单个区块达到 BFT 确定性,但在相同时间内,Doomslug 可以最终确定两倍于 Tendermint 和 Hotstuff 的区块。尽管没有改善延迟,但它将吞吐量提升了一倍。
非理想情况
现在让我们看一下非理想的情况,例如一些参与者不在线或者由于其他原因一个视域没有达成共识。上图展示了两个连续视域失败的情况。在 Tendermint 的情况下,每个失败的视域多了两轮通讯,也就是花费了 6 轮来最终确定了一个区块。在 HotStuff 的情况下,流水线开始工作,区块在 4 轮通讯后就达到最终确定。由于最终确定性组件拥有与区块链底层相同的吞吐量,Doomslug 有同样的流水线能力,也将在 4 轮通讯后最终确定区块。但要注意,在最初的 3 轮后,区块就已经达到了 Doomslug 确定性,当第四轮通讯区块最终确定时,也已经有另一个区块达到了 Doomslug 确定性。
其他方面
综上所述,我们从一个维度讨论了区块生产机制和共识算法的比较方法:在不同情况下达到最终确定所需的轮次数。其实还有其他思考方式,例如,尽管本文讨论的所有共识算法都有活性(换而言之就是在特定情况下不会失效),他们面对网络延迟和网络中断的表现还是不同的。他们从长时间链接丢失下恢复所花费的时间有显著差异。在我们的测试中,Doomslug 在长时间的网络静止后迅速恢复了过来
(https://github.com/nearprotocol/nearcore/blob/staging/chain/chain/tests/doomslug.rs#L297),
但总的来说,从这个角度对共识算法进行的研究少之又少。
另外一个维度是实现的复杂度。假设三分之一权重的出块人永远不会被腐化,一个基于 Tendermint 或 HotStuff 开发的协议无需部署任何逻辑来防止分叉。Doomslug 确定块的速度比出块慢,因此有可能在块没有最终确定前发生分叉。因此,协议需要能处理好这类分叉问题,导致协议的部署复杂度显著提升。对于 NEAR 来说,由于我们本身就是采用最长链原则的区块链协议,因此已经有了所有处理分叉的逻辑并进行了严格的测试,但对于想从头新做一个区块链协议的人来说,不用处理分叉问题会显著地降低实现难度。
原文:ALEXANDER SKIDANOV
翻译:Buster
来源链接:weixin.qq.com
区块律动 BlockBeats 提醒,根据银保监会等五部门于 2018 年 8 月发布《关于防范以「虚拟货币」「区块链」名义进行非法集资的风险提示》的文件,请广大公众理性看待区块链,不要盲目相信天花乱坠的承诺,树立正确的货币观念和投资理念,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。