达成共识
共识的概念是直截了当的:共识是指网络就存储在网络中的哪些信息是真实的且应该保留,以及哪些信息不是真实的且不应该保留达成一致。对于比特币来说,达成共识只是就网络上发送和接收比特币的设置达成一致。对于其他网络,达成共识还包括就智能合同、医疗记录或存储在区块链上的任何其他网络信息的最终状态达成一致。
几十年来,共识算法一直是研究的主题。分布式系统的一致性算法必须对多种类型的故障和问题具有弹性,例如损坏的消息、网络部分的连接和断开、延迟等等。在金融体系中,尤其是在区块链,存在自私和恶意的参与者寻求利润的风险。对于区块链网络中的每个算法,达成共识确保网络中的所有节点都同意一致的区块链全局状态。任何分布式共识协议都有三个关键属性:
- 安全:分布式网络上所有节点保证它们具有相同状态或一致性的能力
- 活性/可用性:协议保证成功,并让不同的节点产生最终结果
- 容错:协议处理产生错误或恶意结果的节点的能力
碰巧的是,Fischer、Lynch 和 Paterson 的一篇著名论文指出,在同一个异步分布式系统中,这三种情况都不可能发生。因此,任何和所有的区块链设计必须在这些属性之间进行权衡。这些折衷通常是在安全性和活性之间,因为容错通常被视为全球分布式网络的必备条件。
在区块链体系中,目前有四种达成共识的主要方法。它们如下:
- 实用拜占庭容错算法
- 功率算法
- PoS 算法
- 委托销售点算法
本章将依次介绍这些方法。
实用拜占庭容错算法
实用的拜占庭容错 ( PBFT )算法。很多算法被称为拜占庭容错。这个名字来自于提出原始问题的寓言。
想象一下,一支古代拜占庭军队正在攻占一座城市。想法是从四面出击。一旦军队的将军们到达这座城市,他们必须就何时以及如何进攻达成一致。困难在于如何达成一致。将军们只能通过信使进行交流,但是信使们可能会被敌人俘虏,而且还有一种额外的恐惧,那就是一个或多个将军或他们的指挥官是叛徒。
将军们需要一种方法来确保所有忠诚的将军都同意相同的计划,并且少数可能的叛徒不能导致任务失败。
忠诚的将军们都会按照方法说的去做,但是叛徒们可能会做任何事情。将军们如何创造一种方法来确保,只要他们中的大多数是忠诚的,他们的计划就会成功?
这个寓言有时也被称为中国将军的问题,以及其他一些名称,但问题仍然是一样的:当沟通渠道不安全,甚至可能有叛徒在他们中间时,不同的政党如何安全地沟通并就某事达成协议。
在区块链的例子中,故事中的将军是参与运行区块链的分布式网络的计算机。信使代表这些机器运行的数字网络和这些机器使用的消息协议。目标是让优秀的计算机或将军决定网络上的哪些信息是有效的,同时根除不良行为者并防止错误信息被记录在区块链上。
故事中忠诚的将军代表诚实节点的操作员,他们对确保区块链和基于它的应用程序的完整性感兴趣,因此致力于确保只记录正确的数据。叛徒代表了世界上许多坏演员,他们喜欢为了个人利益或代表其他敌对党派伪造数据(尤其是财务数据)。坏人的动机可能各不相同,从消费他们并不真正拥有的比特币或逃避合同义务,甚至试图破坏网络,作为敌对政府控制货币的一种形式。
拜占庭断层
为了理解 PBFT 和随后出现的所有其他共识算法,首先定义什么是拜占庭错误是很重要的。拜占庭故障是会破坏分布式系统一致性的任何事件或结果,如下所示:
- 未能返回任何结果
- 返回不正确或不一致的结果
- 返回故意误导的结果
- 任何事先没有定义的行为
如果这些事件中的任何一个发生了,拜占庭断层就被认为发生了。因此,拜占庭容错系统能够处理某种程度的不一致输入,但最终仍能提供正确的结果。这里的关键是这样的系统是容错的,而不是无故障的。所有容错系统在它们的容错能力耗尽并且系统以某种方式失效之前只能容忍这么多。
PBFT 是如何运作的
Hyperledger 是使用 PBFT 的主要区块链。以下是 PBFT 在 Hyperledger 中的工作方式。每个验证节点(一台运行区块链软件并致力于保持一致性的计算机)保存一份区块链内部状态的副本。当一个节点接收到一个消息时,它使用该消息和它们的内部状态来计算新的状态应该是什么。然后,节点决定应该如何处理有问题的消息:将其视为有效,忽略它,或者采取其他行动。一旦节点对新消息做出决定,该节点就与系统中的所有其他节点共享该决定。基于所有节点提交的全部决策来确定一致决策:
- 提交:网络上的一个或多个节点提交一个事务,该事务被发送到其他节点。例如,如果有十个节点参与,其中三个发送消息,则如下所示:
- 所有十台计算机都看到三个交易
- 这些事务是分布式的,因此每个节点都有所有事务的完整副本
- 这些事务可能在不同的时间到达节点,因此顺序可能不一致
- 排序:验证节点中的一个通过其他节点的投票被选为领导者。该验证领导者选择事务的顺序,并将其发送给其他参与节点。然后,每个其他验证节点将它们已经拥有的事务重新排列成由验证领导者设置的顺序。
- 执行:验证节点然后执行新排序的事务。每个节点独立地执行所有的改变,并将这些改变从先前的块添加到全局状态。如果无法达成共识,事务将被回滚并拒绝。
对每个块重复这个过程。PBFT 的优势在于速度非常快,并且扩展性相对较好。缺点是参与者必须是已知的——不是任何人都可以加入这个网络。
工作证明
区块链使用的第一个共识算法是比特币的工作证明 ( PoW )。工作证明基本上是通过利用某些加密函数的一个特性来工作的:有一些数学问题很难解决,但一旦解决了,就很容易检查。如前所述,其中一个问题是散列:获取数据并从中计算散列非常容易,但获取散列并发现输入数据却极其困难。比特币、莱特币和以太坊最常使用 PoW。
战俘有以下特点:
- 相对可预测的求解时间:比特币的网络协议预计每个区块的求解时间约为十分钟。如果网络开始解决工作证明问题太快,网络会自动增加难度。
- 对计算能力的大幅增加或减少有抵抗力:摩尔定律表明,计算机可以完成的工作量预计每两年翻一番。此外,由于网络是开放的,任何人都可以在任何时候向网络添加大量的计算资源。为了使网络保持稳定,算法必须自动调整自己。类似地,如果网络不再盈利,那么使用的计算能力将会下降,因为这些资源被重新分配。这是通过自动调整算法中的难度来实现的。任何网络参与者都必须能够很容易地快速检查他们是否拥有正确的链以及该链是否有效。这是通过使用散列函数来实现的。
只要没有一组参与者控制超过 50%的整体网络计算能力,工作验证算法就能保持网络的完整性。坏演员能够控制链条的可能性称为 51%攻击。如果一个团体曾经控制了一半以上的网络力量,他们可以通过停止支付甚至加倍支出来控制网络和网络交易。攻击集团将能够阻止新的交易被确认(在他们认为合适时停止对用户的支付),甚至逆转在他们开始控制网络之后发生的交易。
比特币的战俘问题是如何发生的
PoW 算法从取最长的链开始。在比特币中,有多种方法可以完成区块(取决于包含的交易)。因此,可能有多个可用的“已解”链可以被比特币节点选择作为基础。作为算法的一部分,比特币采用最长的链,因此应用了最多的计算能力。下图说明了一个电源链:
比特币的难题是找到一个输入,当添加到先前的块哈希和交易列表时,产生一个以一定数量的零开始的哈希。
通常,该函数的输入是所有事务的 Merkle 根和先前的块散列。为了简化说明,假设我们有一个简单的输入,比如我爱区块链。让我们假设系统有最简单的困难:在散列的开始有一个零。我爱区块链的 SHA-256 哈希如下:
ef34c91b820b3faf29104f9d8179bfe2c236d1e8252cb3ea6d8cb7c897bb7d96.
如你所见,它不是以0
开始的。为了解决这个输入的阻塞,我们需要找到一个字符串(称为 nonce ,我们可以将它添加到这个字符串中,这样散列组合( nonce + I love 区块链)会得到一个以0
开始的字符串。事实证明,我们只能通过测试来做到这一点。例如,如果我们把1
加到开头,我们得到1 我爱区块链,散列如下:
b2fc53e03ea88d69ebd763e4fccad88bdb1d7f2fd35588a35ec6498155c702ed
运气不好。2 和 3 呢?这些也无法解决这个难题。碰巧的是,4 我爱区块链有一个以0
开头的 hash:
0fd29b2154f84e157d9f816fa8a774121bca253779acb07b07cfbf501825415d
只试了四次,但这是一个很低的难度。每增加一个零,寻找合适的输入来计算合适的散列的挑战就加倍了。截至发稿时,一个有效的比特币块需要 18 个零才有效。
这个试图找到产生正确散列的随机数的过程被称为挖掘。每台挖掘 PoW 链的计算机都在竞争,看谁能先找到合适的 nonce。获胜者可以创建链中的下一个块,并获得代币奖励。更多详情参见第十八章、采矿。
PoW 优势在于任何人都可以加入 PoW 网络,且它作为一种功能性的共识机制得到了很好的确立。PoW 网络的主要缺点是速度慢和财务成本高:运行所有的计算机来进行这些计算非常昂贵,并且输出没有被投入任何真正的生产用途。这被认为对环境有害,而且在大量开采区块链的地方会导致能源价格上涨。在一些地区,区块链采矿已经因此被禁止。
由于这些不利因素,发明了(PoS)。
**# 利害关系证明
PoS 的目标与 PoW 相同,即保护网络免受攻击,并允许在开放网络中达成共识。第一个使用这种方法的数字货币是 Peercoin,随后出现了许多其他货币,如 NXT、Dash、PIVX 等。在 PoW 网络中,解决这个难题决定了哪个节点可以创建链中的下一个块。在 PoS 网络中,区块被认为是伪造的,而不是开采的,因为它们在工作证明区块链。在 PoS 链中,验证者通过获得每一个区块的交易费而获得奖励,有时在每次创建一个区块时自动创建额外的硬币。在 PoS 链中,成为下一个区块创建者的机会取决于一个节点在网络中的投资额。
看看下面的例子:
PoS 网络中有五个节点。他们有以下余额:
- 一万枚硬币
- 200 个硬币
- 300 个硬币
- 4000 个硬币
- 20,500 个硬币
代币总数为 35,000 个硬币。假设每个节点下注 100%的硬币,每个区块和它们包含的节点将有以下成为下一个区块签名者的可能性:
- 28.57%
- 0.57%
- 0.86%
- 11.4%
- 58.6%
显而易见,如果单个节点曾经控制了大多数令牌(甚至是很大一部分),那么它们将对网络具有实质性的控制。在这种情况下,节点#5 将最终创建超过一半的块。此外,因为节点#5 将定期签署块,它也将获得大部分的交易费和新创造的硬币。在某种程度上,PoS 以额外代币的形式奖励验证者投资的利息。对 PoS 网络的一个批评是富人变得更富,这可能导致网络集中化和控制的增加。
无关紧要的攻击
PoS 系统中的一个问题是无关紧要的攻击的威胁。在无关紧要的攻击中,为了多次使用令牌,验证器实际上创建了多个块。由于在 PoS 系统中创建区块的成本较低,网络没有不批准所有交易的财务激励,从而导致共识破裂。
例如,想象一个糟糕的演员,该隐,他只有 100 个代币。他决定尝试作弊,并向网络发送两条消息:一条是他向 Sanjay 发送 100 个代币,另一条是他向 Eliza 发送 100 个代币。网络应接受任一交易,但不接受两者。通常,节点必须就哪个事务有效或拒绝两个事务达成共识。然而,如果一个验证程序与 Cain 合作(或者由 Cain 自己运行),那么批准这两个块对他们来说是有利的。
下图中,期望值代表 EV 。它表明,如果一个验证器接受这两个块,它可以有效地加倍花费而没有损失:
为了避免这一问题,PoS 系统已经引入了各种对策,例如存款。在区块链分叉或双重花费攻击的情况下,参与的验证器有丢失令牌的风险。通过经济处罚和赌注代币的损失,加倍花费和验证所有区块的动机被认为减少或消除了。
变化
基本 PoS 方法有多种变体。每种变化都有不同的要求,如持有股份所需的最低余额、对不良行为的潜在处罚、网络利益相关者的权利和能力,以及修饰符,如帐户需要持有多长时间的股份才能被计算在内。
委托股权证明
DPoS 与 PoS 共识相关,但有一些重要的区别。这个新系统是 Bitshares、Steemit 和目前的 EOS 的 Dan Larimer 创造的。这两个网络和 Lisk(另一个常用的区块链)是目前唯一使用这种方法的主要区块链。在 dpo 中,令牌的持有者不是进行块验证的人。相反,他们可以使用他们的令牌来选择一个代表他们进行验证的节点——他们的代表(也称为验证器)。正是这个委托/验证器帮助操作网络。可用验证器插槽的数量往往被锁定在一个特定的数字上,通常是 21 个。为了成为代理,节点的所有者必须通过将网络上的全部令牌中他们的份额委托给他们来说服网络的其他用户信任他们来保护网络。本质上,网络上的每个令牌相当于一张选票,票数最多的人被允许操作网络。目前,只有 Bitshares、Steemit、EOS 和 Lisk 是使用这种方法的主要区块链。
在 DPoS 中,每个代理都有一个有限的指定时间来发布新块。如果一个代理连续错过他们的块创建时间或发布无效交易,使用他们股份的令牌持有者可以投票淘汰他们,并用一个更好的代理替换他们。下图显示了这种结构的样子:
对 DPoS 的主要批评是,它是部分集中的,并且对背叛网络没有真正直接的经济处罚。违反网络规则的后果是被令牌持有者投票淘汰。人们认为,争取代理股份的声誉成本和损失将超过试图对网络产生负面影响的财务收益。由于只有少量的委托槽,令牌持有者更容易注意到单个验证器节点的行为。
嫩薄荷共识
Tendermint 使用定制的共识引擎,这是 Jae Kwon 博士论文的一部分。它类似于 dpo,因为网络中的参与者可以将他们的投票权委托给一个验证帐户。然而,要做到这一点,他们必须绑定或锁定他们的令牌。要做到这一点,他们必须发布一个特殊的绑定交易,其中他们的硬币被锁定到一个验证节点。如果他们的代表行为不端,代表和借出他们硬币的账户都会没收他们的一部分抵押代币。为了释放他们的代币,必须向网络发布另一个特殊的解除绑定交易,并且这种提取要经历长时间的延迟。
让我们看看这些交易是如何发生的。下图来自 Tendermint 文档:
。
让我们更详细地看一下上图。代表们通过签名投票发出下一个街区的信号。有三种类型的投票:预先投票、预先提交和提交。每个块都有一个特殊的验证器,称为提议器。提议者首先提出一个基于前一个锁定块的有效块状态。该提案在其他验证者之间对等共享,如果 2/3 或更多的人投票同意锁定的区块(在预投票阶段),则他们进入下一阶段:预提交。在预提交阶段,同样,如果 2/3 同意 prevote 条件,他们将发出准备提交的信号。最后,发生块的实际提交:节点必须已经接收到块,并且它必须已经接收到预提交的 2/3 有效投票。
如果这个 2/3 投票的序列看起来不寻常,那是因为异步网络的性质,其中验证器可能在不同的时间接收块和投票。这个序列,以及当没有达到 2/3 多数时处理的边缘情况,允许对不可靠的网络进行有效和快速的协商。
权威证明
授权证明 ( PoA )网络仅在所有区块链参与者已知时使用。在授权证明中,每个参与者都是已知的,并在区块链注册。这样的区块链被称为许可链,因为只有被授权列表中的计算机才能伪造积木。因此,重要的是没有授权计算机受到损害,并且每个操作者必须尽力确保他们的验证器的完整性。这种方法最初是由奇偶技术公司的 Gavin Wood 分享的,作为一种运行基于以太坊的区块链的不同方式。
建立权威
要建立验证器,必须满足以下三个主要条件:
- 身份需要正式验证并上链。
- 资格应该很难获得。例如,成为公证人、接受背景调查和缴纳保证金。
- 每个权威机构必须具备的一系列条件应该是有据可查的、统一的、值得网络信任的。
一旦建立了授权机构,就可以通过将该授权机构添加到区块链的有效验证者列表中来授予伪造新块的权利。
虽然 PoA 主要用于私有链,但它也可以用于公共链。两个公共以太坊测试网络,Rinkleby 和 Kovan,是使用 PoA 作为其共识机制的公共区块链网络。
PoA 的明显缺点是每个验证器操作者的身份必须是已知的和可信的,并且滥用这种信任的惩罚必须是真实的。对于全球区块链来说,这可能不是首选,因为区块链技术的吸引力之一是匿名交换价值的能力。
经过时间的证明
Hyperledger 锯齿项目引入了一种新的共识机制,称为耗时证明或诗人。Hyperledger 主要处理许可的区块链,类似于 PoA 链,只有指定数量的参与者被允许进入网络。
基本方法很简单:
- 每个节点必须等待一段随机的时间
- 第一个停止等待的节点将创建一个块
要使这种方法奏效,我们必须做两件事。首先,我们必须能够验证所有参与者的等待时间实际上是随机的,否则一个简单的攻击将是假装等待一个随机时间,然后立即创建一个新的块。第二,不仅时间长度是随机选择的,而且节点在行动之前实际上等待了整个时间段,这必须是可验证的。
这些问题的解决方案来自英特尔(PoET 算法的发明者),并依靠特殊的 CPU 指令来确保仅运行可信代码。通过强制可信代码负责处理块计时,系统确保了彩票是公平的。
摘要
在这一点上,你应该对区块链用来达成共识的不同机制有了一个坚实的基础。每种一致性算法都在速度、可用性、一致性和容错性之间做出一定的权衡。最常见的共识机制仍然是 PoW 和 PoS,但是区块链的发展速度非常快,并且很可能会开发出新的和改进的方法。对一致性算法的改进将提高区块链的可扩展性和可靠性,以及该技术的潜在应用范围。
参考
- https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf
- https://www . Microsoft . com/en-us/research/publication/Byzantine-generals-problem/?from = http % 3A % 2F % 2f research . Microsoft . com % 2f en-us % 2f um % 2f people % 2f flamport % 2f pubs % 2f byz . pdf
- https://github . com/tender mint/tender mint . com/blob/5c 111743 a03d 2c 6 ed 2 E0 b 14 BD 3091 CAC 8974 c8 da/docs/tender mint _ v 02 . pdf
- https://peercoin.nimg/paper/peercoin-paper.pdf
- https://github . com/ethereum/guide/blob/master/poa . MD
- https://medium . com/poa-network/proof-of-authority-consensus-model-with-identity-利害攸关-d5bd15463256**