区块链共识算法之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投票的流程

 

源码解读

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

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

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

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

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

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

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

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

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

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

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

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

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

最后

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值