区块链共识算法之DPOS(中)

公链EOS简介

EOS可以理解为Enterprise Operation System,即为商用分布式应用设计的一款区块链操作系统。EOS是一种新的区块链架构,旨在实现分布式应用的性能扩展。EOS提供帐户,身份验证,数据库,异步通信以及在数以百计的CPU或群集上的程序调度。该技术的最终形式是一个区块链体系架构,该区块链每秒可以支持数百万个交易,同时普通用户无需支付使用费用。

上面是类似官方的介绍,就目前EOS全网的TPS MAX也没上4000。也不知道这个“百万”是如何定义的。但是4000TPS也算很优秀的数字了。优秀的TPS表现得益于 EOS的共识算法 DPOS+BFT。下面介绍DPOS的第一步:选举。

选举

顾名思义,就是一群“有资格的群众”通过投票选举出少许“更有资格的大佬”。EOS项目中整个出块节点竞选(DPOS)算法是依托系统合约实现的。系统合约eosio.system中包含了投票的action。

下面来一张流程图,大致看下EOS投票的流程

 

区块链共识算法之DPOS(中)_第1张图片

区块链共识算法之DPOS(中)_第2张图片

源码解读

上面流程图只是大概了解下投票流程,下面深入代码来看看具体是实现。

参数的意思分别为:谁在投票、用的哪个代理、投给哪些人。实现如下:

第一步投票人鉴权,投票时需要投票人的权限。主要实现在函数update_votes中,来看看。

区块链共识算法之DPOS(中)_第3张图片

区分是代理模式还是直投模式 。每种模式都附加限制。不满足直接抛异常。

全局表_voters中查找该投票人信息

区块链共识算法之DPOS(中)_第4张图片

如果为第一次投票,即last_vote_weight 没有,更新全局活跃抵押数量total_activated_stake,如果这时total_activated_stake第一次大于阈值min_activated_stake,则更新thresh_activated_stake_time的值为此刻的时间点,且此后保持不变。

由抵押变换为投票权重。如果这个投票者还是个代理,则他的投票权重还需要加上额外的权重。这个额外权重是其他投票者指定他为代理时所赋予的权重。取所有赋予的权重累计值和--proxied_vote_weight。

区块链共识算法之DPOS(中)_第5张图片

这块代码是在扣除相关权重,为什么要扣除呢?因为重新投票了,原来的这个投票者的权重要重新分配,旧的扣除,新的增加。如果上次投票为代理模式,那么需要更新旧代理的权重,即旧代理权重减去last_vote_weight,因为旧代理直投了一些节点,而旧代理的权重改变了,自然而然,被旧代理所直投的那些节点权重也要重新计算了,连锁反应。第241行函数propagate_weight_change就是在干这个事。
如果上次投票为直投模式,那么变量producer_deltas记录上次直投的每个节点所需要扣除的last_vote_weight,其实第245行的d.first初始值是0,这么一算,直接变 -last_vote_weight。用来后面做扣除。

区块链共识算法之DPOS(中)_第6张图片

和上面那段代码相反,这块代码是在增加相关权重。有扣除,就有增加嘛。

如果这次投票是代理模式,则更新 新代理的权重,即新代理权重加上new_vote_weight。自然而然,新代理的权重增加,那么被新代理所直投的那些节点权重也要重新计算了,第259行propagate_weight_change。

如果这次投票是直投模式,那么变量producer_deltas记录这次直投的每个节点所需要增加的new_vote_weight。如果上次投票和这次投票的节点有重复,那么第265行的d.first的值就有可能是 -last_vote_weight了。

区块链共识算法之DPOS(中)_第7张图片

遍历producer_deltas,在全局表producers_table记录着所有的节点信息,第281行更新节点的权重。第285行更新全局节点权重之和total_producer_vote_weight。第315行更新表voters_table 中该投票人的信息。

至此整个投票结束。总结下就是权重的减减增增。然后把结果放到producers_table中,供其他模块使用。

最后

这篇分析了投票的细节,下节,也是DPOS的最后一节,将分析如何根据每轮投票结果,“做事”。

你可能感兴趣的:(区块链)