《迅雷链精品课》第十四课:区块链共识算法前沿分析
1. 共识机制现状
经过前面几节课的介绍,我们知道现在主流的区块链共识机制主要有两类,即概率一致性算法和绝对一致性算法。区块链中的工作量证明POW类型的共识算法、股权证明POS以及变种DPOS都是属于概率一致性算法的,而以PBFT为代表的共识算法属于绝对一致性算法。其中,比特币的Nakamoto共识和早期的以太坊中的共识算法就采用了POW,以太坊的casper就是使用了POS共识算法。这几种主流共识算法各有所长,但是都存在一定的缺陷。
POW类型的共识算法虽然通过耗费算力来解决一个密码学难题来证明自己不会作恶,允许节点的任意加入,可扩展性强,但是这类算法的缺点是足够慢才能保证系统的安全性,同一个时刻只有一个矿工产生的区块会被认可,其他区块被视为分叉,分叉上的区块和交易是不会被认可的,这就导致系统浪费了大量的资源来做无效工作。而且由于交易需要等待足够的新区块产生才能确认这笔交易被认可了,避免进入分叉而被覆盖,所以交易的确认需要很长的时间。
POS类型的共识算法中,系统的安全性基于对股权大的节点不会作恶的前提,股权越大的节点的记账概率会更大。这类系统虽然能抵御女巫攻击,但会导致“富豪统治”的问题。
在上一节课中,我们知道,PBFT算法的正确性要求系统中的可信节点数大于2/3,换句话来说,这类区块链系统中需要对节点进行等级划分和权限控制,用户节点是不能随意加入系统作为验证节点的。此外,PBFT算法性能会随着节点个数的增加而下降,可扩展性不强。
表1-1 主流共识算法
其实不论是POW、POS还是PBFT算法,核心都是要解决区块链的安全和性能的困境问题,但是每种方案都存在一定的缺陷,共识机制需要在理论和工程实践上持续改进。融合多种共识算法优势的共识算法、DAG共识机制、基于可信硬件的共识算法等在未来都是值得关注的。下面我们主要讲讲融合了多种共识算法的algorand、DAG以及基于可信硬件的共识机制。
2. Algorand
我们在前面的几节课中提到,拜占庭容错算法应用于区块链作为共识算法,是一个确定性的算法,不会出现分叉,交易的确认时间短。传统的POW算法是一个概率一致性算法,比如比特币的共识算法 Nakamoto,同一时间多个矿工可以打包交易提出新块,只要该新块中包含一个值是的区块的哈希的前缀为n个0,则是合法的。这种开放式的规则不可避免地会导致区块分叉,Nakamoto 共识规定只有出现在最长的链上的区块才会最终被认可。为此, 用户在交易被矿工打包入块之后,需要延迟至少六个块约一个小时的时间才能确定交易不会出现在分叉中。但是,将BFT算法直接作为公链的共识算法时会存在一些问题:
BFT算法的正确性建立在系统中超过2/3的节点是可信节点的基础上,用户节点不能随意地加入系统中,这违背了区块链的去中心化精神。
BFT算法的性能会随着节点数的增加而下降,这就限制了系统的节点不能无限制地增加。
针对BFT算法在区块链的去中心化、可扩展性和安全存在的问题,图灵奖得主 Micali 在2016年的SOSP大会上提出了 Algorand 算法。Algorand 的核心是通过在BFT算法中引入可验证随机函数 VRF 来随机选取委员会作为每一轮投票的节点。在给定节点私钥sk、随机种子seed和输入的要竞选的角色role的前提下,如果节点当选为指定的角色role,即负责出块的提议者或者共识的投票者的话,VRF函数会输出一个哈希hash和证明π,其他节点通过该节点的私钥sk对应的公钥pk、哈希hash以及证明π,便可通过VRF验证函数来验证该节点是否当选为指定的角色。
下面我们来说说 Algorand 算法的几个特点:
为了避免委员会暴露之后被攻击者攻击,Algorand 要求所有委员会节点在这一轮投票完便失效,下一轮的委员会成员会重新选择。
此外,Algorand 算法为每个节点引入了权重的概念,节点的权重其账户的余额来决定,这个权重代表了节点当选为委员会成员会后的投票算力。只要委员会中可信节点的拥有的账户余额的总和超过2/3,那么 Algorand 就能避免分叉和双花,从而避免了女巫攻击 sybil attack,即一个节点模拟多个节点的投票来攻击系统。
这个权重还决定了节点被当选为委员会成员的概率,权重越大的节点,其被选中的概率越大。当然,这可能会导致权重小的节点一直当选不了委员会,为此,Algorand 在 VRF 函数中引入了计数器,节点连续当选的次数越多,那么其下一次被选中的概率就会越低,这保证了系统的公平性。
图2-1 Algorand 交易流程
如图2-1所示,Algorand 节点负责接收交易,节点间使用P2P协议进行通信,包括交易和区块的转发。Algorand 共识算法的具体流程为:
所有的节点使用VRF函数来决定自己是否是提议者,提议者负责打包本地的交生成区块并附加上相关的证明信息广播给系统内其他节点;
其他节点收到该区块之后,验证区块是否有效,有效的话进入BFT算法的下一个阶段prepare阶段。各个节点使用VRF函数来决定自己是否是投票者,如果是投票者,则生成投票信息prepare信息广播给系统其它节点;
当投票的权重超过2/3之后,进入下一轮投票commit阶段。各个节点会在本地使用VRF函数来决定自己是否是这一轮的投票者,如果是,则生成投票信息commit消息广播给系统内其他节点。注意,每一轮的投票的委员会都是重新生成的,每一轮的seeds也是由上一轮的seeds通过VRF函数生成的,而且其正确性是可以被验证的;
其它节点收到该消息后会验证消息的正确性和执行结果的正确性,如果合法,则将这个区块的交易应用到本地状态,将区块追加到本地账本中。
Algorand 算法通过巧妙地设计VRF函数,解决了BFT算法应用于区块链公链的去中心化和可扩展性问题。Algorand 算法让所有的节点都有机会参与到共识中,同时不会随着节点的增加而导致性能的急剧下降,在1000个虚拟机上运行总计50万个节点的情况下,Algorand的系统吞吐量大概是比特币的125倍。
3. DAG
我们已经知道,比特币的 Nakamoto 共识机制中交易的顺序由区块来决定,每个区块包含多笔有序的交易,同时指向了上一个区块。为了避免女巫攻击,Nakamoto 要求矿工都要通过消耗算力来解决一个POW问题,即算出一个变量来满足部分哈希碰撞,使得哈希的位前缀为0,系统可以通过调整碰撞的位数来调整问题的计算复杂度,从而决定出块的时间。为了防止攻击者制造分叉来使已经发生过的交易无效,Nakamoto 共识规定系统中最长链上的交易才是有效的,新产生的块会指向该链上的最后一个块,从而使得这条链越来越长,攻击者制造分叉撤销交易的难度就会越大。虽然这个解决了交易的排序问题,但是带来了其他的问题,共识成为了系统的性能瓶颈。
如何改善系统的性能呢?一个思路是通过减少系统的共识参与者,比如BFT算法和Bitcoin-NG,只选取部分的可信节点来决定交易的顺序,但是这类算法的缺点是会将节点划分为不同权限的参与者,有悖于区块链的去中心化精神。另外一个思路是改变区块链的组织情况,使用树或者有向无环图 DAG 来替换区块链的底层存储结构单向链,同时提供一个排序算法来处理冲突的交易、对交易进行排序。在DAG表示的区块链中,各个节点都可以贡献自己的算力来增加系统的吞吐量,在这种情况下,共识本身不再是系统的性能瓶颈,节点的数量和节点自身的计算资源将会决定系统的性能上限。其实,比特币的 Nakamoto 共识可以看做是将区块组织成DAG的一个特例,只不过对交易进行排序的时候,分叉上的区块中的交易都会被视为无效交易。
DAG算法又可以细分为两类,具体来说,一个是将区块组织成DAG,比如 SPECTRE 共识和 conflux 共识,另外一个是不保留区块的概念,而是直接将交易组织成DAG,比如 hashgraph 共识和 IOTA 的 tangle 算法。DAG 共识的一个难点是如何对区块或者交易进行排序,下面我们会分别介绍基于交易和区块的DAG共识机制是如何解决交易排序的问题的。
3.1 DAG 区块共识
SPECTRE 和 Conflux 共识是DAG共识的一种,它们都是将区块组织成有向无环图DAG,都是基于比特币的Nakamoto共识来解决POW问题来产生区块的。二者的不同是,前者只有一种边,指向了父节点,交易的排序也是部分有序的。而后者有两种边,指向父节点的边parent edge和引用没有叶子节点的节点的边 reference edge,并且对区块的绝对排序取得共识,交易的排序也是基于区块的顺序的。下面我们会具体介绍 Conflux 共识算法。
图3-1 Conflux 共识算法
如图3-1 所示,conflux 共识算法借鉴了比特币共识算法,Genesis是创世块,各个节点交易都是打包进区块的,区块的产生由POW问题的难度决定。不同于比特币的Nakamoto共识算法,区块中除了parent edge之外,还引入了reference edge。
parent edge:每个区块除了创世块之外,都只有一条指向父节点的边(图3-1中的实线箭头);
reference edge: 每个区块可以包含多条引用边(图3-1中的虚线箭头),引用边表明了区块间的先后关系,被引用的区块是先于引用者产生的,比如图3-1中的区块D是先于E产生的。
如果按照 DAG中的parent edges 的指向把所有的区块中连接起来,我们会发现有多条链,不同于比特币的Nakamoto 共识将最长的链视为合法链,conflux共识基于GHOST规则来将具有最大子树的节点视为中心链的节点。使用GHOST规则来产生中心链的一个好处是,即使由于网络延迟可信节点产生的区块出现在了分叉上,中心链上的已存在的区块顺序不会受影响。如图3-1所示,conflux算法会选择 Genesis←A←C←E←H 作为中心链,注意 Genesis←B←F←J←I←K 虽然是最长的链,但是它没有被选中为中心链,因为区块的子树中包含的区块要多于区块的子树包含的区块数目。
当节点打包本地交易池的交易生成一个区块的时候,节点首先会在本地计算找出中心链,新的区块的parent edge 会指向中心链的最后一个区块,同时找到本地区块中没有子区块或者被引用的区块,新的区块会创建refrence edges 来指向这些区块,比如图3-1中的新块会创建一个新的区块,包含一条parent edge 指向父区块H和一条引用区块K的边。
在将区块组织成DAG后,conflux算法又是如何对区块和交易进行排序的呢?
首先,conflux 共识基于中心链将区块划分成不同的epoch,中心链上的一个区块对应一个epoch,当中心链的特定epoch的区块可以通过parent edges 和 reference edges 访问到某个区块的时候,这个区块就属于这个epoch,当然,这个块不能属于上一个epoch。属于同一个epoch的区块的先后顺序由引用边refrence edges 来确定,被引用的区块的产生顺序是先于引用块的。如果在同一个epoch里面的区块没有直接的边,那么则按照区块ID来进行排序,图3-1中的区块的排序是Genesis,A,B,C,D,E,F,G,J,I,J,K。conflux 对交易的排序是建立在对区块的排序的基础上的,如果两个交易属于同一个区块,那么交易则按照区块里面的顺序进行排序,如果两个交易出现冲突,那么出现在后面的交易会被丢弃,图3-1中的交易的排序是TX0,TX1,TX2,TX3,TX4inB,TX4inG。
相比于传统的比特币Nakamoto 共识,conflux 这类将区块组织成DAG的共识算法,是可以极大地提高系统的交易吞吐量的,在系统总计两万个节点,单机器的带宽为20Mbps的时候,系统的吞吐量为2.88GB/s, 当带宽上线提高到40Mbps的话,系统的吞吐量会提升至5.76GB/h,交易的确认时间由一个小时缩短为4.5-7.4分钟,系统的交易吞吐量是6400 txs/sec。
3.2 DAG 交易共识
Tangle 是应用于物联网IOT的共识算法,目的是想解决传统的区块链中需要交易手续费问题,因为IOT世界中发生的大多数是小额支付,如果直接采用以比特币为代表的区块链解决方案的话,每笔小额支付交易的手续费明显高于交易的转账金额,那么这个明显是不合理的。但是去掉手续费的话,区块的产生就会出现问题,因为没有手续费,矿工创建区块就没有利益所得。基于这个,Serguei Popov 提出了基于 Tangle 的加密货币,Tangle是一个由交易组成的有向无环图DAG分布式账本,交易的产生除了要解决一个类似于比特币的部分哈希碰撞的PoW问题外,还需要验证两笔未被验证的交易。下面,我们来具体说一下 tangle 共识的工作机制。
首先,我们介绍一下tangle 共识的账本组成以及相关的基础概念。
如图3-2 所示,Tangle 中交易组成了DAG图,其中创始交易genesis比较特殊,被系统中所有的交易直接或者间接地验证了交易。当节点接收到新交易的时候,需要耗费算力来解决一个密码学问题,耗费的算力表示为交易本身的权重,权重越大,表明交易的可信度越高,图3-2中的交易G和交易F的自身权重分别是1和3。当一个交易没有被任何其他交易直接或者间接地确认的时候,称为tip。Tangle 共识中要求每一笔新的交易在校验自身的可信度之外,还需要为系统的安全做贡献,即需要验证两笔未被确认的交易tips。
交易除了自身的权重之外,还有一个累加权重,即某个交易自身的权重加上所有直接或者间接地确认了该交易的交易的自身权重的累加和,比如交易D被交易A、B、C直接或者间接地确认了,那么交易D的累加权重就是cw(D)=w(D)+w(A)+w(B)+w(C)=1+1+3+1=6,累加权重越高的交易,说明该交易的可信度越高。
在tangle 共识中,交易除了权重、累加权重之外,还有一个比较重要的属性,即分值score,这个是由该交易直接或者间接地确认的交易的自身权重的和,包含交易本身的权重,比如说交易A直接或者间接地确认了交易B、D、F、G,那么交易A的分值就是score(D)=w(A)+w(B)+w(D)+w(F)+w(G)=1+3+1+3+1=9,分值越高的tip,被选中的概率会越高,因为分值表明了它对系统安全的贡献。
图3-2 Tangle 共识中节点存储图
在了解了tangle 共识的存储结构和一些基础概念之后,我们知道新交易的加入需要确认两笔交易,但是如何选择这两笔交易呢?
Tangle 共识是通过TSA算法,即 tip 选择算法来完成这两笔需要确认的交易的选择的。具体来说,Tangle 共识使用了马尔可夫链随机游走算法MCMC实现的,MCMC是一个概率性地随机游走算法,节点的累加权重越高,那么出现在随机游走的路径上的概率越高。MCMC会在在本地的主DAG图中按照交易的累加权重来概率性地选择两个不跟主DAG相冲突未被确认的交易的,注意,分支越高的tip,被选中作为被确认交易的概率会越高。这个就保证了,随着时间的推演,系统会选择可信度更高的交易,系统的安全性会越高。
注意到,运行 Tangle 共识算法的本地节点中存储的交易可能是冲突的,对于出现冲突的交易,tangle 共识是通过运行TSA算法足够多的次数来统计哪笔交易被选择的概率更高,从而选择这笔交易的,被选中概率低的冲突交易之后就会成为孤儿交易,不会出现在本地的主DAG图中。比如说,当交易A和交易C出现冲突的时候,tangle 共识运行TSA算法100次之后,有97次选中了交易A,那么我们就可以说交易A有97%的置信度会被确认。
4. 基于可信硬件的共识算法
事实上,不论是PoW、POS还是PBFT类型的共识算法,本质上都是要解决区块链系统中存在作恶节点的系统安全问题。这些算法都是企图从软件的思路来解决共识问题,但是如果硬件能够保证安全性的话,那么我们就不需要浪费计算资源来保证系统的正确运行。
Hyperledger Sawtooth应用了基于Intel SGX可信硬件的逝去时间证明(Proof of Elapsed Time,PoET)机制。PoET 理念是由芯片巨头 Intel 于 2016 年早期为解决“随机领导者选举”的计算问题而提出的。这种依赖于特定的硬件SGX,它确保了受信代码(随机等待时间的生成逻辑)的确运行在安全环境中,并不可被其它外部参与者更改。它也确保了结果可被外部参与者和实体验证,进而提高了网络共识的透明度。
5.结语
Algorand 共识机制解决了BFT算法的可扩展性问题,保留了区块链的去中心化的特性;基于区块或者交易的DAG共识机制通过改变账本的组织结构来提升了PoW类型的共识算法的性能问题,从存储上支持节点的并发,最大程度地利用了节点的计算资源;Hyperledger Sawtooth基于可信硬件保证了区块链的共识安全性,降低了资源消耗。可见共识算法未来的趋势,会关注于共识算法的安全性、提升可扩展性和性能、降低资源消耗等方面。我们除了需要不断技术创新外,更要结合实体经济行业中的具体应用场景,为更多的业务寻求切实可行的解决方案,才能为用户创造更大的价值,促进区块链技术的发展。
《迅雷链精品课》第十四课:区块链共识算法前沿分析相关推荐
- 《迅雷链精品课》第四课:区块链技术的发展趋势
上一节课我们系统学习了目前主流的区块链项目的技术架构:思考我们在设计具体的业务架构时,需要决定什么业务应该上链,什么业务应该用链下服务处理:今天我们将深入了解区块链技术发展趋势.在区块链落地应用过程中 ...
- 区块链基础知识系列 第二课 区块链共识算法
共识算法解决的是对某个提案(proposal)大家达成一致意见的过程. PBFT (拜占庭容错)算法 -Fabric 0.6采用 五个阶段:request,预准备(pre-prepare).准备(pr ...
- 第四章 区块链共识机制
第四章 区块链共识机制 1.概述 2.工作量证明共识机制 2.2 交易优先级 2.3 数学难题 2.3.1 数学难题 2.3.2 动态调整难度 2.4 最长链原则 2.5 作用 2.6 缺点 3.其它 ...
- 15种区块链共识算法全面详解
1,摘要 本文尽可能列出所有主要的共识算法,评估各自的优劣之处.共识算法是区块链的核心技术,本文会跟随作者的理解,持续更新.如果读者发现有所遗漏,或是存在错误,希望能通过评论指出. 2,区块链共识算法 ...
- 【区块链讲师会前访谈】结合应用场景 区块链共识算法如何选择?
再过8天,2017中国云计算技术大会将在北京隆重举行. 今年,2017年中国云计算技术大会将继续在技术基石上,更着重行业实践和应用.综合来看,本次大会将围绕"四大主题峰会+八大专题论坛&qu ...
- 区块链共识算法的发展现状与展望
来源:平行区块链 摘 要 共识算法是区块链技术的核心要素, 也是近年来分布式系统研究的热点. 本文系统性地梳理和讨论了区块链发展过程中的 32 种重要共识算法, 介绍了传统分布式一致性算法以及分布式共 ...
- php 区块链算法_PoW/BFT等5种主流区块链共识算法的开源代码实现
共识算法是实现自主产权区块链的必不可少的关键环节,本文列出社区中相对成熟的区块链共识算法开源实现,包括BFT共识.Raft共识.Paxos共识.PoW共识等,可供希望开发自主产权区块链的团队参考学习. ...
- 深入理解区块链共识算法
区块链的概念: 区块链是一种去中心化.不可篡改.可追溯的分布式数据库系统[3].区块链系统中底层网络采用对等式网络(P2P 网络)组织各个独立的网络节点.P2P网络是扁平式的拓扑结构, 网络中的每个节 ...
- 区块链共识算法及应用研究
摘要 作为区块链核心技术的共识算法,为区块链的去中心化.开放自治.信息不可篡改.匿名溯源等功能的实现提供了机制支撑和保障,实现了分布式系统中强一致性和最终一致性的高效达成.以比特币出现为时间节点,将共 ...
- 比较流行的几种区块链共识算法
在每一种的加密货币背后,都有一种伟大的共识算法. 但没有一种共识算法是完美的,但它们各有优缺点.他们的主要目标是防止双重支出. 重要的是要记住,它们都不是绝对完美的,在分散或部分分散化的环境中,不存在 ...
最新文章
- replace 使用函数作为第二参数
- 如何在asp.net mvc3中使用HttpStatusCode
- EP39 全局静态ApplicationContext的问题
- 中秋佳节,这个网络安全 7 年经验的大佬来发福利了!
- 为什么使用数据库从库
- Java案例:泛型用法演示
- [六字真言]1.唵.遁入佛门之异常.md
- OpenCV(一)Mac下OpenCV的安装和配置
- SAS (Statistics Analysis System) 统计分析系统软件
- 泰坦尼克号幸存者预测
- CentOS7中安装屏幕键盘(软键盘)
- opencv保存设像头图片时调整白平衡功能
- 戴尔微型计算机7050配置,小巧彪悍 戴尔 OptiPlex 7050 微型机评测
- 常用的ADB命令有哪些
- python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(上)
- 笔记本电脑外接显示器显示不全
- 一首关于远方和理想的小诗
- 专业物联网数据采集解决方案,专业无线传感器,专业非接触测量数据采集,非侵入式数据采集
- 全力冲unreal了
- 斐讯路由器宽带运营商服务器,斐讯(PHICOMM)路由器
热门文章
- 【手把手带你搞定】第一个C语言猜数字游戏(超详细教程,不仅学如何写代码,更学方法思路!)
- 解读翻译李飞飞-Hiding Data With Deep Networks
- matlab中peaks是什么,Matlab中的peaks函数.doc
- java ldc指令_6.Java JVM_4.JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
- 当区块链遇上“智慧城市”,南京能走多远?
- java基础【十二】外存、内存、CPU、缓存
- Office软件Android无法登录,office mobile(安卓版)无法使用
- nmap扫描工具安装/升级/卸载教程
- Shell脚本语法小记
- 神武3登录显示未能成功连接服务器,T3安装成功后,点击运行显示登录界面,但提示“检测公共组件Protal。exe时未能通过,公共组件可能被破坏”,和”无法连接服务器“。应该怎么处理?求助!...