EOS之所以有可能达成百万TPS并且不会分叉的性能目标,主要原因在于BM选择了基于授权证明+拜占庭容错的共识算法(DPOS+BFT),网络中关于这种算法的介绍文章不在少数,但是真正从源码角度剖析的文章可以说一篇也没有!本篇文章,我们将从源码的角度为您深度剖析EOS项目中DPOS-BFT算法背后的代码逻辑。
1、DPOS共识算法背景
首先我们先来简单理解一下为什么DPOS相比于POW算法,性能更优。我们通过类比人民代表大会制度与古希腊公民大会制度来说明这个问题:
古希腊公民大会制度:
概念:(ecclesia,亦可写作ekklesia) 是古希腊城邦和古罗马的最高权力机关。由王或议事会召集,全体成年男子(战时全体战士)参加,讨论、决定部落各项重大问题。通常用举手或喊声表决,并达成对国家重大事务的共识。
优缺点:优点很明显,更加民主!但是缺点也很明显,共识效率是这种制度最大的钳制:对于小国寡民的情况,这种共识模型看起来很美好!很民主!但是,对于一个大国,这种制度就有了很大弊端,任何国家事务(事无巨细)都要组织少至千万,多至几亿的国民参与投票,效率何其低下!
人民代表大会制度:
概念:这个概念大家都很了解,通过由民主选举产生、对人民负责并受人民监督的全国和地方各级人民代表大会,人民代表大会负责国家事务的最终决策。
优缺点:这种制度极大的提升了共识的效率,通过民主投票的方式选举出一组人民代表参与最终的决策,使得最终决策的效率极大的提高(参与共识的人数变小,单单看统计票数的工作都能减小不少的工作量),不可避免的,这种模式中缺点也是存在的,一定程度上降低了民主程度。
类比区块链世界的共识算法,优缺点何其相似:
POW古希腊公民大会制度:去中心化程度高,共识效率极低;
DPOS人民代表大会制度:共识效率显著提高,去中心化程度较低。
这一切的设计,都是从应用需求出发对区块链不可能三角做出的折衷方案:以民主程度换取共识效率!图1.1与1.2简单了展现了两者的关系。
图1.1 POW共识算法
图1.2 DPOS共识算法
2、EOS共识算法代码概述
相信很多阅读者已经对EOS所采用的DPOS+BFT共识算法有了初步的了解,这里我们先简单介绍一下,参考EOS项目白皮书:
EOS.IO软件采用目前为止唯一能够符合上述性能要求的去中心化共识算法,即授权委托证明(DPOS)。根据这种算法, EOS区块链上持有token的人可以通过投票系统持续选择区块生产者,任何人都可以成为块生产,只要他能说服token持有人以获得足够投票。
EOS.IO软件能够精确到每0.5秒生产一个区块,并且仅一个生产者被授权能在给定的时间点生产该区块。代码规定每轮生产126秒(共21个生产者,每个生产者6秒出12个区块)。在每轮开始时,根据token持有者的投票选出21个不同的块生产者。获选生产者按照代码规定的顺序轮流出块。
通过通读EOS代码,笔者将DPOS+BFT共识算法拆分成两个部分,方便大家理解:
出块节点竞选:该功能主要依托于eosio.system系统合约进行:token持有者可以调用系统合约中的投票函数投票给自己信任的节点,投票结果将会保存在指定table中,智能合约每隔126个区块更新一次出块节点权限;
生产区块:该功能主要依托于producer_plugin插件,注册成为候选出块节点在运行该插件时,时刻监听记录着节点获得投票情况的table,每过126个区块(1个epoch),判断一次自己获得的投票数量是否处在前21名,若处在,则在指定round生产区块,否则只同步不生产。
本节最后,让我们看一下两个算法的具体类图,其中图2.1为出块节点竞选算法具体类图,图2.2为生产区块算法具体类图。我想这两张图对有编程基础的同学来说应该会有所助益,看不懂的同学不要着急,下一篇文章中我们将详细讲解这两部分算法的具体代码:
图2.1 出块节点竞选算法具体类图
图2.2 生产区块算法具体类图
EOS源码框架剖析系列于每周一定期推出,下一篇,我们将介绍EOS的共识算法(DPOS-BFT)代码逻辑的第二部分:出块节点竞选算法的代码逻辑,关注获得更多价值文章!
加入EOS开发者社区
微信扫码加群秘进群
更多有价值的悄悄话,欢迎加入知识星球
领取专属 10元无门槛券
私享最新 技术干货