摘要
本文介绍了一种基于网络终端和传输延迟的区块链共识协议,在协议中,我们构造了一种权益投票的共识机制,既没有高能耗的问题,也避免了权益证明的缺陷。这种新的机制有助于创建一种可扩展的多层区块链结构,有可能是加密货币未来的一种发展方向。此外,利用网络终端的数量和分散程度进行的竞争将存量巨大的开发人员引入进来,作为潜在的矿工,为网络的维护和扩展提供了丰富的储备。
关键词
1.网络分散度证明(PoND). 2. 投票. 3. 利益分配. 4. 个人利益最大化.
引言
因为能耗问题,工作量证明(Proof of Work)模式正越来越被人们所诟病。然而抛开能耗问题,PoW模式仍然是所有解决方案里面最高效、最稳定、最体现本质的。工作量证明以其简单直接的“能者多得”逻辑完美的解决了开放式分布系统的共识问题,其它可行的全分布式的共识协议都沿用了这个核心逻辑,比如活动证明(Proof of Activity)、燃烧证明(Proof of Burn)、存储证明(Proof of Storage)、消逝时间证明(Proof of Elapsed Time)等等,其中权益证明(Proof of Stake)共识因为不依赖任何外部资源,而且完全抛弃了耗能的“算力”竞赛而被最广泛的接受。因为POS模式将核心逻辑从“能者多得”的基础上发展为“富者多得”,使得区块链的记账权竞争只需要在一个个静止的内部状态之间进行,不需要消耗电力。但是PoS共识也存在自己的缺陷,比如“nothing at stake”导致的多重投票问题、“stake grinding”攻击问题等等,其中一个无法避免的缺陷,就源于它的核心逻辑“富者多得”:当付出相同的劳动时间后,富人会获得更多,所以富人倾向于花更多的时间工作而穷人则相反,导致富人更富,穷人更穷,这个过程会不断加速,最后成为少数人的“贵族游戏”。尽管有的PoS协议实现了完全公平的利息制度,取代了挖矿活动,但这样的协议“给所有人奖励,相当于所有人都没有奖励”,降低了所有用户参与维护网络的积极性,容易受到攻击。
本文的目的,是想找出另一种不耗电力的能力证明协议替换权益证明,基于一个简单的事实:因为网络延迟的缘故,分散在网络中的终端越多,他们共同收集网络中随机散布的信息的速度越快。而这也是一种“能力”的体现,我称之为“网络分散度”,这是一种无法通过提高单机的性能来提高的能力,因而避免了能耗问题。权益属性由于其无法模拟的特性,在协议中作为度量单位起到重要的作用。持有权益的用户也可以通过权益来参与网络的维护,用户可以自由的选择用权益还是用能力来争夺记账权,用利益分配法则来维持矿力的平衡,最大程度的保证公平性和安全性。
本文中讨论的所有情形均是针对完全开放式的分布系统,故对PBFT、DPoS、Ripple等协议都不在讨论和比较的范围之内。
场景和角色
整个网络可以想象为拉票竞选的场景,节点按照分工不同有以下三种角色
投票节点—网络中每笔交易的广播源节点即为一个投票节点,负责响应第一个向它发起“拉票”请求的工蜂,然后将自己的投票结果打包到交易结构并发布到网络。投票节点的权益视为“选票”,获得选票的多少影响到矿工的竞争力。投票节点还拥有主链的投票权。任何用户都可以成为投票节点。
矿工节点—矿工节点拥有自己的工蜂为他们收集选票,使用选票参加出块权竞争,此外还要验证交易、区块等。任何用户都可以成为矿工节点。
工蜂节点—附属于各个矿工节点,负责侦测附近的投票节点,同时尽快发出拉票请求。工蜂节点多数是以嵌入App客户端或网页源代码的形式运行于网络终端。
网络结构如下图所示:
共识过程
1. 每笔交易发布之前,投票节点发出一个广播信号,附近的工蜂收到广播信号后向投票节点发出“拉票”请求;
2. 收到第一个请求后,投票节点将主链末尾块地址b和工蜂所属矿工节点账户m写进交易结构,广播本次交易;
3. 此交易被某个矿工确认打包到新的区块,并广播到网络;
4. 矿工节点接收到新块的广播后,验证每个交易的同时,检查交易中的m和b。当m指向矿工节点自己时,标记此条交易为x,当b指向当前链末尾区块时,标记为y;
5. 矿工节点取得所有投票节点的权益数,并平均分配到它们各自在块中的每条交易;
6. 逐块累计同时有xy标记的交易分得的权益数,记为X,直到出块为止,最多累计到一个投票周期(假设6000个区块);
7. 统计当前块中y标记的交易分得的权益数,记为Y;
8. 矿工节点周期进行一个基于常量(时间戳、个人签名等)的数学运算,期望结果达到某个目标,满足出块要求,记为:hashProof() < target*d*X*Y(其中target是目标,d是难度调节参数);
9. 当达到出块要求后,矿工节点将这段时间收到的交易打包并广播至全网。同时打包的还有所有xy标记的交易id(为了节约空间,可以在6000个区块范围内编码)、各个节点收益和其它计算参数,以供验证。挖矿所得的收益由矿工和所有参与的投票节点按比例分配。(注: 关于验证参数和收益分配数据所占用的额外空间,至多相当于给每条交易增加4字节的id、4字节的收益,完全在可接受范围之内;验证区块所要做的额外工作则至多是遍历之前6000个区块,只要算法得当,根据目前数据查找速度,也不会造成瓶颈。)
为了便于理解,以上步骤可以进行如下简要描述:
“用户每次交易都用权益对主链和记账节点分别进行投票,获得权益最多的分支或节点获胜的几率最高。”(注:为了将投票活动控制在投票周期之内,需要根据投票频率来控制每个账户的权益大小。)
下图解释了依靠网络延迟竞争出块的原理:
如上图所示,在线用户更多的App,有更高的几率获得选票(权益)7,当前的选票会有助于在将来的竞争中获胜。
而投票的结果将会记录在已经产生的区块中,下面用两张图分别解释出块权投票(x投票)和主链投票(y投票)的工作原理:�
如上图所示,在已产生的若干区块中统计选票,获得选票最多的矿工节点将有最高的几率赢得出块权。
如上图所示,每当产生分支时,投票人会对分支进行投票,并记录在下一个区块中,这些记录决定了下次出块时各个分支所获得的选票(权益)多少,也就决定了出块难度参数Y的大小。因此获得越多选票的分支,产生下一个区块的速度也会更快,而更快的广播出块会在再下一次的投票中获得比上次更多的选票,因此上述过程将加速拉开两个分支的差距,迅速决定出主链。
把主链的投票与记账权投票分离的意义在于,让权益独立的来决定分支。因为矿工争夺的是用户对记账权的投票,主链的投票与其收入没有关系,试图影响投票客观性的行为变得没有必要。而且因为用户只需要根据区块链数据自己判断主链即可投票,要想控制也很困难。这样能保证即使在出现用户很集中的情况,也可以效的防止对分支的攻击。
按照以上共识流程,矿工要想在竞争中获得更大的优势,就必须在物理网络上拥有更多而且更分散的工蜂,以响应随机出现在网络中的投票节点信号。所以此竞争机制无法在单机上进行模拟,避免了无限提高机器性能的装备竞赛,保证了挖矿的公平性。
我们没有在共识过程中借助任何外界的资源,这一点和PoS相同。不同的是,因为所有的投票在统计时都保存在已经存在的区块中,用户做过的选择不能更改,使得双重投票或粉碎攻击的问题得以解决。
和PoS协议的另一个区别是,由于有矿工的存在,持有权益的用户可以把竞争出块的工作交给矿工们去进行,自己要做的只是在规定周期内简单投票即可。对于低权益的用户来说,不用花太多的精力就能保证所持权益不缺席投票活动,这样就能基本避免前面所说的财富分配不均的问题。
同时矿工节点加工蜂的结构可以在普通App和网页开发中进行嵌入,我希望以此能够帮助一些开发者走出只有靠显示广告获得收入的困境,或者能够在使App或网页拥有更佳的用户体验上有所贡献。另外大量的网络开发者和应用程序可提供大量的“矿力”储备,转型非常简单,降低了初期的进入门槛,保证了整个系统的可持续性。
争夺投票节点
为了拥有更强的出块能力,矿工会尽可能的争取到更多的投票节点,虽然我设计的初衷是大家都用更多工蜂来获得选票,例如在App中嵌入工蜂程序,为了有更多的工蜂,就必须不断提高App的品质来赢得使用者。但是不可避免的,会有一些用户相互达成协议,以团队形式合作挖矿(比方说钱包或者矿池)。既然如此,我们干脆在交易结构中提供一个分类选项,你可以选择A.以广播的形式接受工蜂拉票;或者B.指定一个矿工,直接让他赢得选票;甚至C.指向自己,单独挖矿。这样做看似影响了公平性,但实际上这三类矿工节点在竞争时,普通矿工节点和带有合作投票节点的B类矿工节之间是在聚集用户能力上进行竞赛,而C类矿工和前两类之间又是在权益大小上进行竞赛。在本质上这三种矿工是利用在三种不同方式下获取的权益资源对出块权进行竞争,再加上动态调整机制的引入,平衡三种方式的矿力,攻击者通过统治其中一种能力就控制网络的风险就得到降低。这样反而对提高公平性和安全性起到了积极的作用。
钱包应用
因为特殊的用户群体,钱包应用可以引导甚至直接决定交易的类型和投票的目标,基于自身利益的考虑,大部分钱包应用都会选择B类方式为自己挖矿,或者优先响应自己的矿工节点,这样的话普通矿工就基本没有机会参加竞争了。因此我们需要有一个机制来鼓励钱包应用多选用A类交易:给A类交易增加钱包账户字段,把一部分收益分配给钱包应用的运营商,而B类和C类则没有这种奖励。由于给钱包应用提供了正当的收入途径,所有影响A类竞争公平性的行为都被视为恶意的。如果钱包供应商能从系统得到回报的话,会有一个额外的好处:激励开发团队开发优秀的钱包程序,或者更重要的,激励他们开发侧链项目,这样一来为整个系统成为开放式的平台提供了物质上激励的基础。
PoS变种
由此还可以导出一个此共识的变种方式,即只存在C类矿工。这种情况下每个人都凭借自身的权益单独挖矿,变成了纯粹的PoS模式。这样的变种体系也能保证公平性,而且解决了PoS协议下的一些常见的缺陷,当然,除了财富集中化的问题以外。
收益分配
挖矿所得的收益如果分配策略不同,用户在利益的驱使下会造成网络结构和个体行为的变化。这里的分配是指A类挖矿所得的分配,B类的分配完全由矿工来完成,C类则不需要分配。有以下这些问题需要考虑:
1) 为了避免矿工节点将自己拆分后获得更多的利益,矿工应该按照总量的固定比例分成;
2) 权益的分配权重会影响到用户的选择,如果完全按权益分配,绝对公平的分配机制可能不足以吸引更多的普通用户参与其中,但是如果权益权重过低,则会失去太多高权益的用户;
3) 降低权益的比重后,为了避免用户能够无限拆分自己的账户以获得更多收益,需要将手续费作为参考依据,这样还可以为不同需求的用户提供更多的可选策略,起到调节的作用。
所以A类挖矿分配方案最好受权益和手续费两个参数共同影响,比如:矿工分得总收益的20%,剩下分成两部分,1/3按照手续费分配,2/3按照权益分配(这里的权益是指累计到X参数的权益,每个投票节点可以重复计算),投票节点每次获得收入的25%(即总数的20%)分给钱包账户。
而B类挖矿的分配方案由矿工根据和用户的约定在挖矿程序中自行设定,虽然相对自由,但是也有一定的限制:为了保证钱包应用的收益(见“钱包应用”小节)始终大于钱包自己挖矿的收益,B类挖矿的矿工所得必须限制在A类挖矿中钱包收益的比例之下,这里即20%以下。
由于三种矿工的采矿能力可能不同,为了保证A类矿工的人数与其它两种矿工人数的均衡,需要根据参与各个类别交易的总权益大小来做动态的调整:如果参与A类方式的权益数过高,则降低A类矿工的收入比例,减少A类矿工的数量;反之则增加收入比例,刺激更多的A类矿工加入。
用户在不同投票方案下的默认手续费可以根据前一段时间A、B两种矿工人数进行调整。某类矿工越多,则降低交易费,吸引更多的用户,以匹配矿工的数量。实际上即使没有上述调整,经济规律也会让人们自然做出类似的平衡,只不过慢一点。
作弊和攻击
1) 过滤交易,矿工只选取对其有利的交易打包
因为每次出块时包含的交易可以影响之后的竞争环境,所以矿工有可能通过挑选打包的交易试图获得更有利的位置。
首先每个块包含的交易只占统计总量的一小部分,改变一个块的内容并不能对统计结果造成很大的影响。要更好的解决此类问题,需要统计本次打包的所有交易的投票节点的权益之和作为参数,用来调整下一次出块的计算周期,权益越高,计算周期越短,否则越长,比如让计算周期在0.9秒-1.1秒之间浮动,这样会直接影响下一次出块的速度。如此一来,打包尽可能多的交易才是更好的选择,可以减少矿工作恶的动机。该参数每隔一段时间应该根据平均值做一次调整。
2) 同样是过滤交易,但目的是影响分支的发展速度
因为每次出块包含的交易数量也决定了当前链下次出块速度(影响到Y参数),攻击者可以有意减少某条分支的交易数量,影响主链的认定。
解决方法:我们在共识过程第4步检查交易内的地址b时,除了标记指向当前链末尾的交易为y以外,还标记指向当前链倒数第2、3(数量可调整)块的交易为y1,计算Y值时,y、y1两种标记的交易同时统计。这样即使某个攻击者削弱了某个块的出块速度,只要他后面的矿工是诚实的,就会把攻击者有意漏掉的交易补上,这些交易会指向当前链倒数第2+个区块。如果这些交易可以有效的提供给难度参数Y所需要的权益值,那这条支链发展的速度也会由后面的矿工弥补上来。
3) 51%攻击
如果某个用户掌握了50%以上的权益,系统就很容易被其攻击,这点和PoS协议是相同的。但是由于PoS系统下的用户必须运行全节点并且保持在线才能参与出块和维护网络,所以实际上权益无法达到很高的在线率,使安全性打了很大的折扣。但在PoND系统中,用户只需要在规定投票周期内有过一次投票或者交易就能加入竞争,降低了参与的门槛,使得在线权益的比例大大增加,提高了系统的安全性。
4) 模拟工蜂,即试图通过模拟创建大量的工蜂节点在p2p网络中接入许多虚拟节点,从而提高成功拉票的几率
为了应对此情形,我们可以在创建p2p连接的时候加以控制,比如每个客户端都只与和自己响应速度最快的前数个节点建立连接即可。
结论
本协议相对于PoS和PoW,具有以下优点:�
1) 不存在算力竞赛,节约能耗;
2) 不存在无利害关系(nothing at stake)导致的多重投票或者粉碎攻击(stakegrinding)等缺陷;
3) 激励足够的竞争来维护网络的安全,同时不会陷入财富集中化的问题;
4) 能有效的激励开发者开发扩展项目,为系统的可持续性和可扩展性打下基础;
5) 新的挖矿方式有助于改善App和网页的开发环境和用户界面。
利益冲突
本设计已申请专利,专利号:CN2018102289423
参考文献
1) Yj1190590(/yj1190590). “PoND(Proof of Network Dispersity) BlockChain Project.” Github (accessed 29 April 2018) https://github.com/yj1190590/PoND/blob/master/README.md