eos源码赏析(七):EOS智能合约入门之共识机制初探

2021-11-23 10:28:49 浏览数 (1)

从丐帮帮主及丐帮长老的选举说起。

金庸小说中塑造了众多丐帮帮主的形象,如汪剑通、萧峰、洪七公、黄蓉、鲁有脚、耶律齐、史火龙等。这些帮主在未当选帮主之前大都是丐帮中普普通通的一员,后来经过投票选举---也就是吐唾沫的方式当上了帮主。这和现在eos的各大BP的竞选类似,eos的持有者可以通过投票的方式或者代理投票的方式选择自己意向中的BP,今天我们就从选举和投票的角度来谈谈丐帮帮主选举,来谈谈eos的投票机制以及对共识的理解。

关于共识的理解准备分两篇来解读,本篇只针对在eos中使用到的共识机制做简单的分析,在接下来的文章中会结合eos源码来解读BFT-DPoS共识机制。说道BFT-DPoS我们就要从Pos机制和DPos机制说起,文章文字较多,代码较少,请谨慎阅读:

那么什么是PoS呢?

PoS:Proof of Stake,也称股权证明,类似于财产储存在银行,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。通俗的讲,有个丐帮弟子名为白世镜,曾是丐帮八袋弟子,他持有这八个袋子已经五年了,要知道这些在丐帮都是资历的证明。有一天,白世镜给丐帮立功了,再加上他在丐帮的资历,帮主就提拔他做了九袋弟子并擢升为执法长老。这就是Pos机制,一个丐帮弟子持有的袋子越多,持有的时间越长就越有可能上升到丐帮的长老位。

那么什么又是DPoS呢?

DPoS:Deligated Proof of Stake,也称委托股权证明,eos使用了DPoS的机制,在eos的白皮书中对eos为何使用DPoS进行了详尽的解释,简单摘录如下:

EOS.IO软件架构中采用目前为止唯一能够复合上述性能要求的区块链共识算(DPoS)。根据这种算法,全网持有代币的人可以通过投票系统来选择区块生产者,一旦当选任何人都可以参与区块的生产。 EOS.IO里预计每3秒生产一个区块。任何时刻,只有一个生产者被授权产生区块。如果在某个时间内没有成功出块,则跳过该块。 EOS.IO架构中区块产生是以21个区块为一个周期。在每个出块周期开始时,21个区块生产者会被投票选出。前20名出块者首选自动选出,第21个出块者按所得投票数目对应概率选出。所选择的生产者会根据从块时间导出的伪随机数进行混合。以便保证出块者之间的连接尽量平衡。 如果出块者错过了一个块,并且在最近24小时内没有产生任何块,则这个出块者将被删除。这确保了网络的顺利运行。 在正常情况下,DPOS块链不会经历任何叉,因为块生产者合作生产区块而不是竞争。如果有区块分叉,共识将自动切换到最长的链条。具有更多生产者的区块链长度将比具有较少生产者的区块链增长速度更快。此外,没有块生产者应该同时在两个区块链分叉上生产块。如果一个块生产者发现这么做了,就可能被投票出局。

仍旧以白世镜为例,白世镜和其他二十位长老共二十一位长老被吐唾沫选举出来来维持整个丐帮的发展,这就是DPoS的投票机制,通过持有的布袋投票出自己意向中的丐帮长老。有一天丐帮需要修改帮规的第三十二条:若要当选丐帮帮主必须接受帮内弟子的唾沫洗礼。如何才能修改成功呢,需要这二十一位长老中的2/3以上的人同意修改才可以,也就是十五位或者十五位以上的长老签了字,下一任帮主任职的时候才能免去唾沫的洗礼,这就是DPoS的可以根据协议修改共识参数的功能。

那么如果在修改帮规的那一天这二十一位中的其中一位因为不在场这个帮规还能修改成功么?当然可以,这就是我们所说的委托股权证明,比如护帮长老被西夏一品堂的人纠缠而不能亲临帮规修改现场,那么他可以把自己的权利委托给传功长老,让他替自己行使权利,从而完成帮规的修改,这就是DPoS的股权委托证明机制。

当然,当上了长老就一劳永逸了么?并不是,拿白世镜来说由于他和康敏之间不得不说的关系被丐帮弟子发现之后,群丐不再支持他做丐帮长老,因此他就会被从丐帮长老的位置上除名,这就是DPoS的不作为淘汰机制。

前些天如火如荼的超级节点竞选亦是如此,持有的eos大都冻结在交易所里,而各大交易所纷纷声明自己要参与超级节点竞选的投票,其实他们这些交易所拿的都是eos持有者的权益去投票的。因为币冻结了,相当于eos的持有者将投票权委托给交易所进行了投票。这

些超级节点如果没能正确履行自己的权利和义务,eos的持有者将不再投票支持他们,他们也将从超级节点除名,从而产生下一个新的超级节点。

那么什么又是BFT-DPoS

BFT-DPoS: Byzantine Fault Tolerance- Deligated Proof of Stake,又称具有拜占庭容错机制的DPoS。

仍旧以丐帮众位长老为例,帮主选举之前需要以众位长老的的意见统一才可实现。于是执法长老白世镜选出自己意向中的帮主--萧峰并写在纸条上传给传功长老,传功长老如果同意执法长老的意见则确认之后传递给护帮长老,如果不同意执法长老的意见,则写出自己意向中的长老,就这样依次传递下去直到二十一位长老全部传递完,如果有超出2/3以上的长老同意萧峰当帮主,则萧峰就可以上任丐帮帮主了。假设两位长老之间传递纸条的时间为3s一次,那么要完成2/3以上的长老确认就至少需要15*3=45s的时间。

有没有什么更好的办法呢来缩短这个帮主选举确认的时间呢?在eos的最新版本中采用了BFT-DPoS的机制,即在其中一个节点产生区块的时候就通知其他节点来确认这个区块的产生,也就是说当白世镜在纸条上写下萧峰的名字的同时就大吼一声,让其他的长老再他写下名字的同时就来确认丐帮帮主的人选。接下去传功长老也写下一个名字并喊其他长老来确认,这样一来,只需要3s便可确认一个区块的产生,也就是帮主人选的确认。

这种产生区块就广播出去并让其他节点完成签名确认的过程便称之为BFT-DPoS。但是问题也随之而来,我们有过部署nodeos节点经验的小伙伴们都知道,在eos中产生块的速度为500ms,那么这个会不会因为时间太短导致别的节点还没有签名确认结束就轮到下一个区块生产者产生区块呢?就比如白世镜长老写了一个名字在纸条上吼了一声之后等其他长老来确认,但是其中一个长老年迈,走不快了,还没来得及确认,就轮到传功长老写纸条了。这样就导致了纸条传递的延时,在eos链上就体现为网络延时同时产生分叉,如何解决网络延时及分叉这个问题呢?BM团队放弃了原来按随机顺序出块的设计,改用记账人相互协商后确定的顺序。这样就能保证网络延迟较低的记账人之间能以相邻的顺序出块。

具体eos出块的规则及BFT-DPoS共识机制在源码中的体现,会在下一篇文章中结合着源码进行解读。

0 人点赞