以太坊DPoS实践及开源DPoS分析
BFTF技术社区联盟
2018-08-10 06:09
本文约1433字,阅读全文需要约6分钟
美图如何基于以太坊实现 DPoS 的共识算法?同时比较分析其他的一些开源 DPoS 实现。

孙小俊

美图云事业部系统研发工程师,主要工作内容包括美图区块链和云直播。

编者按:本文来自BFTF技术社区联盟,作者:BFTF技术社区联盟,星球日报经授权发布。

本次演讲主要分成四部分,第一部分简单介绍以太坊的基础架构,第一部分概述目前几种共识算法,第三部分是美图以太坊DPoS的实践,最后再对比EOS中的DPoS。

以太坊的基本结构如图,包含了对外的HTTP接口,共识算法模块,EVM,存储模块等。

 

其中交易处理模块,节点收到交易后,保存到交易池中,打包过程中从交易池中获取满足条件的交易。发生块回滚等操作,已经打包的交易会被重新放入交易池中。 


以太坊的账号余额数据是存储在由 Patricia Trie 和 Merkle Trie 组成的(MPT)树上,主要利用 Patricia Trie 的特性实现账号余额的快速查找和 Merkle Trie 来证明交易是否被篡改过。 


PoW通过满足一定的工作量证明达到共识,这是一个经过比特币和以太币长期考验的共识算法,但需要消耗大量的计算资源,且交易的QPS较低。PoS是通过引入持有者的权益来完成随机数查找,用户拥有的资产越多,那么就找到正确随机数的概率也会越大。PoS存在账本分叉,长距离攻击,币龄攻击等问题。DPoS被认为是 PoS 的改进版本,DPoS 通过每隔一段时间进行一次选举,然后由这些选举出来的节点来负责出块和互相监督验证,这样就可以大大降低出块以及块确认的时间。 


算法实现主要包含两个核心部分:块验证人选举,块验证人调度。 


在以太坊要增加一个共识算法,就是需要实现共识Engine所定义的接口。 


打包流程:矿工会定时通过 CheckValidator 去检查当前的 validator 是否为当前节点,如果是的话则通过 CreateNewWork 来创建一个新的打块任务。 


某个节点想要成为验证人,首先要成为候选人,接着其他人才能对这个候选人进行投票。不管是投票还是成为候选人,对于节点来说其实都是一笔交易,之前的交易主要是转账或者合约调用,因此现在多增加几种交易类型。 


另外由于 DPoS 为了避免每次选举都从创世块开始回放历史数据,增加了几个全局状态树用来记录选举和投票的状态, 并把树对应的 root 存储到块头。 


选举:判断块的周期;根据上个周期出块的情况把一些被选上但出块数达不到要求的候选人踢掉;截止到上一块为止,选出票数最高的前 N 个候选人作为验证人;打乱验证人顺序。


当接收到一个新块时,需要更新最后不可逆块的信息;最后不可逆块是被三分之二的节点确认的块。 


fast sync 模式下会直接丢弃广播的块,只有在进入 full sync 之后才会接收。如果我们同时以默认同步方式(fast sync)启动多个节点,由于节点之间出块的频率一样导致所有节点都无法进入 full sync 模式,节点之间同步的块都会被丢弃。解决方案是创始节点以 full sync 方式启动。由于验证人的信息在区块体中保存,所以不能仅仅通过区块头来验证一个区块。 


EOS中DPoS中是有21个验证节点;打块的时间间隔时500ms,每个节点连续打12个块,这一方面提高打块的速度,同时保证每个节点在一次的打块时间内可以有块传播给其他的20个节点。EOS最新的白皮书中提到一种BFT-DPoS,在一个节点打出块后,通过BFT算法,向其他节点进行验证,这样可以加快最后不可逆块的确认,提高交易的确认速度,减少链的分叉的可能性。

另附演讲视频地址:

https://v.qq.com/x/page/o0736irezov.html 


BFTF技术社区联盟
作者文库