如果有人直接问你:状态机复制(区块链)系统如何扩展?你应该问:你的系统的瓶颈是什么?数据?共识?还执行?数据:数据是将所有指令传输到状态机所有副本的载体。例如,如果一个块包含1MB的指令,那么您需要向所有验证副本发送1MB的数据。显然,在这种情况下,系统的信道容量(带宽)是系统可扩展性的瓶颈。共识:指令到达本地后,状态机将参与共识协议(就像这里讨论的部分同步或同步协议)。例如,如果一个共识协议需要两次消息往返,参与验证的状态机分布在世界各地,那么这里明显的瓶颈就是光速和地球大小造成的延迟。执行:指令到达并就指令序列达成共识后,副本需要执行指令。执行引擎是一种函数,它采用旧状态并应用指令来计算新状态(并计算输出)。再举个例子,如果执行需要很多密码计算,那么很明显这里的瓶颈就是replica重复的密码计算。需要注意的是,这三个瓶颈不是追求妥协,也不是两难选择,更不是三难选择。它们彼此独立。所有状态机复制系统的可扩展性都受到这三个因素的限制(并且,像木桶原理一样,受到其中最坏因素的限制)。本文介绍了针对这些瓶颈的一些解决方案。1.提高数据可扩展性和更好的网络解决方案对于比特币等加密货币,扩大吞吐量的能力取决于降低延迟——因为一个矿工挖出的区块需要经过一定的延迟才能传播给所有其他矿工。FIBER、Falcon、bloXroute等系统通过使用专用管道(流水线)减少延迟,并使用前向纠错码传播块。提高数据可扩展性的另一种方法是发现对等点并通过内容可寻址网络访问内容。具体可以参考Kademlia,它不仅启发了以太坊的RLPx编码规范,还在libp2p上进行了推广。将数据迁移到layer-2的另一种思路是,既然瓶颈来自于需要将所有指令复制到所有状态机,那么我不复制就完蛋了!对于Lightning、Plasma和其他Layer-2解决方案都是如此-将中间命令传播到一个小型半公共组以减少数据重复,定期向整个系统报告摘要(更多详细信息请参阅我们关于支付渠道的文章)。自然地,这种方法的缺点是不复制所有数据会产生数据可用性问题。安全取决于每个半公开组中至少有一个诚实的参与者,他们有数据来及时响应。2.从共识提高可扩展性吞吐量和延迟之间的权衡有人用每秒交易数(TPS)作为协议可扩展性的衡量标准。TPS是吞吐量的衡量标准,有一种误解认为仅对其进行优化即可实现共识可扩展性。共识可扩展性解决方案必须同时关注吞吐量和确认延迟。通过批处理提高共识吞吐量(但增加延迟)很简单:每天一次,而不是每隔几秒一次,让人们就所有被批处理的数据的哈希值达成一致。显然,由于每天只达成一次共识,因此成本将被分摊。仅就吞吐量而言,共识过程不再是阻碍可扩展性的瓶颈。显然,批处理虽然可以提高共识协议的吞吐量,但也会增加交易确认的延迟,这并不是扩展共识协议性能的灵丹妙药。BFT状态机复制的延迟和吞吐量在PBFT日志版本中有很好的讨论。对于基于NakamotoConsensus的协议,有许多协议试图提高吞吐量和延迟,例如:Bitcoin-NG、Fruitchains和Prism。性能和安全性之间的权衡有人提议在较小的状态机副本组内达成共识,以优化共识过程的性能。减小验证状态机组的大小确实可以提高性能,但会降低安全性。因此,真正的挑战是在不减少参与状态机数量的情况下提高共识过程的性能。增加共识协议的复杂度预计鱼和熊掌兼得,例如:减少轮数,或者改变消息传递的复杂度,让二次方增长的消息数可以变成线性。本文讨论部分同步中的一些协议改进和同步中的协议改进。可扩展性和适应性之间的权衡基于PBFT视图范式的共识协议容易受到攻击者的适应性攻击。共识协议的安全性不仅与攻击者的规模有关(由状态机的总副本数决定),也与对手的适应能力有关。应对适应性对手的协议通常会产生更高的成本,并面临更大的可扩展性挑战。Algorand提出基于轮次的密码采样,以扩展适应性攻击者的拜占庭共识。这种方法的模拟结果看起来非常好。自适应对手可以使用拒绝服务攻击来阻止系统进步。HoneyBadger提出了第一个实用的异步拜占庭容错协议——一个在不做任何时间假设的情况下保证活性的协议。避免对所有命令进行完全排序如果所有指令都相互依赖,则别无选择,只能对所有命令进行完全排序。但在许多工作负载中,指令并不相互依赖和干扰。例如,在某些情况下,A向B付款的指令和C向D付款的指令不会相互干扰;在这种情况下,我们不需要为两条指令浪费昂贵的共识资源。排序,它没有理由成为系统的瓶颈。epaxos非拜占庭模型中采用了这种方法(并非始终完全排序)。Avalanche和其他基于DAG的协议等协议通过允许并发执行交互而不干扰的指令来提高共识吞吐量。从抽象的角度来看,分片是状态和状态机副本集的分区。每个分片控制状态的一部分,共识过程是通过验证状态机群体的一部分来完成的。这当然也需要一些跨分片的交互机制。以太坊的《ShardingFAQ》(编者注:中文翻译见文末)资源是非常全面的资源。分片是一种并行化数据、共识和执行三个瓶颈的方法。数据和执行并行化的关键是工作负载的低状态争用。从共识的角度来看,分片本质上是性能和安全性之间的权衡:分片不是使用所有状态机副本来保证状态,而是创建多个分区,每个验证器副本保护自己的分区。分成许多分区(如果状态竞争很低)可以显着提高性能。然而,由于每个分区的验证状态机较少,安全性自然会降低。有关使用分片的介绍,请参阅Omniledger和Ethereum2.0。以太坊2.0计划将每个分区的低安全性和全局链的高安全性结合起来。就像Layer-2方案一样,低安全性分片可以定期将自己的状态上传到高安全性全局链并完成状态更新。这也是安全性和延迟之间的权衡——如果你想获得高安全性,你必须等待全球链的周期性敲定。3.从执行上提高可扩展性共识和执行分离是状态机复制系统的基本架构设计之一(见Base20013)。分离的好处可以在Yinetal2003中找到。在传统的状态机复制系统(SMR)中,命令不仅要复制并传播到所有副本,还必须在所有副本上执行。在许多系统中,可扩展性瓶颈是执行指令的成本。针对SMR系统的主要拒绝服务攻击是发出合法命令,导致整个系统浪费时间执行这些命令(有关详细信息,请参见示例1和示例2)。许多系统通过设计领域特定语言(DomainSpecificLanguage)来避免攻击。比特币使用比特币脚本,它谨慎地限制了每笔交易的计算复杂性。以太坊用gas机制来限制执行的复杂度,用效率来激励人们使用gas。并行执行状态机的并行执行也是提高执行能力的一种方式。当块中的大多数命令都是无状态的(彼此独立,或顺序可互换)时,此方法很有效。它的主要思想是构想一个在没有竞争的情况下可以并行执行,在有竞争的情况下保持安全的协议,并用这个协议来模拟连续执行的结果。有关详细信息,请参阅Eve2012、Dickerson、Gazzillo、Herlihy、Koskinen2017以及Saraph和Herlihy2019。不在SMR内部执行,使用经济激励和错误证明(乐观汇总类型)进行验证在这种类型的解决方案中,指令作为数据在SMR内部提交,但执行不是通过验证状态机的副本来完成的。状态机副本仅充当数据可用性层。与其使用复制品来执行指令,不如使用经济激励——玩家可以通过发行债券成为执行者。锁定押金的执行人可以提交执行结果,其他人可以通过提交错误证明报告执行人提交了错误的执行结果。如果这个错误被证明是正确的,执行者将受到惩罚,提交者将得到部分奖励。如果挑战者在虚假证明上撒谎,他的保证金将被没收。实施高效挑战的协议起源于FeigeKilian2000,而Canetti、Riva、Rothblum2011遵循了这条道路,最终演变为TrueBitTeutsch、Reitwie?ner2017和Buterin的具有链上激励的链下预言机。今天,这种方法在称为optimisticrollups的方案中得到了进一步发展(有关详细信息,请参阅合并共识、Adler、Mikerah、Quintyne-Collins、Al-Bassam、Sonnino、Buterin和LazyLedger)。不执行,使用简明证明来验证(zkrollups类型)在这个方案中,指令也作为数据提交给SMR,执行也与验证状态机的副本无关。副本只是指令的数据可用性层。与其使用挑战游戏和错误证明来验证执行结果,还可以使用简洁的非交互式证明(PCP、Groth10、Groth16、Ben-Sasson、Chiesa、Tromer、Virza2013-2019和调查)。这些加密技术允许验证者生成非常短的证明,同时以高水平的加密可靠性和完整性验证这些证明。执行(和证明生成)只能由同一实体完成。有了简洁证明,验证状态机副本只需要验证简洁证明,不需要重新执行长事务。Zexe利用这种方法构建了一个基于纳米内核的证明系统,人们可以在UTXO中实现隐私交易。Buterin关于zk-roll-up的文章和Ben-Sasson的播客强调了这种扩展交易吞吐量的方法。查看Buterin的视频,了解更多关于如何将隐私(零知识)添加到简洁证明(zkzkrollups)的信息。这种简洁的证明有很多优点:验证证明正确性的成本非常低。缺点是构建指令执行的证明通常比简单地执行指令要昂贵得多。另一个缺点是这些协议增加了很多复杂性。此外,一些协议需要广泛的可信初始设置仪式。点击查看最近一份optimistic和zkrollups的调查/比较(编者注:中文翻译见文末)。需要注意的是,上面介绍的方法都是为了克服执行扩展性的瓶颈,而不是改变数据扩展性的瓶颈。感谢我们想借此机会感谢LingRen、KartikNayak、AlinTomescu、PratyushMishra、LouisGuthmann和JohnAdler。感谢他们对本文提供的信息反馈。
