《求真区块链》是 Fractal 思想库倾力打造的系列科普栏目,抱诚守真地输出科普内容,旨在让更多人的了解各项区块链技术的内在价值与差别。算法
今年年初,以太坊进行了君士坦丁堡升级,伴随着升级,以太坊什么时候能切换成 PoS 再次成为了你们热切关注的一个问题。众所周知,PoW 算法存在大量资源浪费,算力集中等问题,以太坊从17年开始就一直想要切换到 PoS 算法。可是因为种种客观条件的限制,一直没有实质性的发展。在放了广大区块链爱好者几年鸽子后,以太坊 2.0 终于要使用 PoS 算法了。本着独乐乐不如众乐乐的中国传统美德,Fractal 的技工们决定跟你们分享一下,咱们关于下一代以太坊共识协议——Casper 的见解。安全
本系列文章将会分为多个部分,这篇文章首先为你们解读一下 Vitalik 关于 Casper FFG 的论文,既如何在现有以太坊的 PoW 协议上叠加一个 PoS,在减小矿工挖矿奖励的同时提升系统的安全性。网络
Casper 其实有两个版本,一个是 Vitalik 领导的 Casper FFG,另外一个是 Vlad 领导的 Casper CBC,他们的不一样之处就在于 FFG 更多的是做为一个过渡协议,使得以太坊可以从 PoW 成功过渡到PoS;而 CBC 则是以太坊切换到 PoS 后一个更好的版本,但从目前来看 CBC 仍有不少细节须要进一步研究和探讨。函数
FFG 的主要思想是借助 PoS 帮助 PoW 产生的区块最终确认,进而在减小矿工奖励的状况下来提升系统的安全性。区块链
参与者经过抵押必定量的 stake 成为 Validator,Validator 负责运行 PoS 协议,为描述的便利性,假设在协议的过程当中 Validator 保持不变。PoW 的以太坊会产生一棵树,若是 Validator 对每个区块进行投票,会增长网络传播开销,为了减小 Casper 中投票的数量,将 100 个区块压缩成一个 checkpoint,如图1所示: spa
图1 区块压缩成checkpointcode
将区块压缩以后咱们获得了图2,而且为每个 checkpoint 提供了一个高度函数h(bi):区块 bi 到根结点 r 的跳数。blog
图片描述
图2: checkpoint 高度函数图片
首先,咱们从总体上描述一下 Casper 的共识过程。参与共识的 Validator 会对上文中所述的 checkpoint 进行投票。每一个 Validator 投的是一段 checkpoint,从 justified checkpoint 开始到若干个 checkpoint 以后的一个 checkpoint。咱们规定第一个 justified checkpoint 是创世区块,当一个 checkpoint 收到了超过 2/3 的从 justified checkpoint 到它的投票,那么这个区块就变成了justified。资源
例如,在图2中存在超过了2/3的从创世块 r 到 b1 的投票,那么 b1 就变成 justified;当存在超过 2/3 从 b1 到 b2 的投票,那么 b2 就是justified,以此类推。当一个 justified checkpoint ,收到了超过 2/3 从它出发到它的某个子 checkpoint 的投票时,那么这个 checkpoint 以及其以前到全部的 checkpoint 都已经被确认。
在将 PoW 产生的区块压缩成 checkpoint 以后,Validator 对于这棵树进行投票,投票规则以下:
vote=<v , s , t , h(s) , h(t)>
其中:
v :Validator的身份信息; s :任意一个justified的checkpoint的hash,能够理解为源checkpoint。关于justified的定义咱们以后会详细讲解; t :任意一个 的子孙节点的hash,能够理解为目标checkpoint; h(s) : s的高度; h(t) : t的高度;
在定义了投票规则以后,定义任意两个checkpoint之间的关系:
supermajority link:对于一对checkpoint (a , b),写做(a→b),若是有超过 2/3 的 validator 投票 vote= , 可称做(a→b)是一条supermajority link,而且h(b)≥h(a)+1
conflicting:若是两个checkpoint在不一样的分支上称之为conflicting。
图片描述
图 3:Casper结构示意图
如图3所示,其中, (r→b1)(b1→b2)(b2→b3)是supermajority link,b2,a3是conflicting。
在有了 checkpoint 之间关系的定义以后,定义 checkpoint——c 的两种状态:
-c 是 justified:
1)c = root :checkpoint c是根; 2)或 存在(c'→c),即 c' 到 c 的 supermajority link,而且c'是 justified;
-c 是finalized:
a)c 是justified; b)存在(c'→c) , c' 到 c 的supermajority link; c) c , c' not conflicting; d) h(c')=h(c)+1;
在图3中, (r , b1 , b2 , b3)是 justified,(a2 , b3) 是 finalized。若是一个 checkpoint 状态是 finalized,那么它以及它以前全部的 block 都会确认。
为了防止 Validator 在运行的过程当中做恶,Casper 制定了一套惩罚机制以下:对于相同的 Validator,发布了两个不一样的投票vote=<v , s1 , t1 , h(s1) , h(t1)> 和vote=<v , s2 , t2 , h(s2) , h(t2)> ,若是存在如下两种状况则罚抵押的 stake。
一、h(t1)=h(t2):对于同一个目标高度,不能发起两个不一样的投票。
二、h(s1)<h(s2)<h(t2)<h(t1):两个投票的投票范围不能存在一个包含一个。
咱们来看一下在合法的交易的状况下,justified 和 finalized 是如何保证 checkpoint 的安全性的。当一个 checkpoint : c 成为了 justified,说明有超过2/3的 Validator 支持 c 以前全部的 checkpoint,配合着第一个惩罚条件,在h(c)有超过2/3的 Validator 惟一支持 checkpoint c。对于 finalized 的checkpoint : f,他会有一个从f出发,链接到f的子节点的 supermajority link。配合第二个惩罚条件,当一个 checkpoint f 成为了 finalized,说明全网超过2/3的Validator不能发出跨越f的投票,这2/3的 Validator 只能对f以后的checkpoint 进行投票。如图4所示:对于任意一个 Validator,在投出了 vote1以后就没法投 vote2,所以 f 以前的 checkpoint 将不会被改变,由于任意对于f以前 checkpoint 的投票都没法得到超过2/3的投票。
图片描述
图4 finalized以前的checkpoint会被确
为了让 PoS 可以提升 PoW 链的安全性,在如何进行分叉选择的时候,FFG 对最重链进行了些许的修改:首先在视图中找到高度最高的 justified checkpoint,并在该 checkpoint 以后的区块上进行最重链选择。这样作有两个好处,第一个是相比于原有的 ghost 算法,区块的确认是几率性的,等了足够多的高度以后,只有很低的几率颠覆以前的区块,虽然几率很低,可是仍是有这种可能性;FFG 中只要是在 finalized 以前的区块都是被确认的,没有被颠覆的可能性。
第二点是一个确认的区块的安全性是须要矿工不断将本身的工做量提供给该区块的,所以为了激励矿工须要更多的挖矿奖励;FFG中,只要是 finalized 的区块都是被确认了的,无需后续的矿工用工做量为已经确认的区块增长安全性,所以能够下降挖矿奖励,下降通胀率。
咱们刚开始说过,先假定 Validator 是固定的,可是一个真正的区块链系统确定是可以让参与者自由进出的,所以 FFG 有一套本身的 Validator 出入原则。首先,定义区块b的 dynasty 为:从创始区块到b的父区块之间 finalized checkpoint 的数量。
抵押:
用户想要成为 Validator 须要抵押必定的 stake,当用户v的抵押交易被包含在一个dynasty=d的区块中,那么定义一个Start Dynasty,写做SD(v) = d+2。
赎回:
Validator v想要取回抵押的 stake,须要发起一个赎回交易,当这个交易信息被包含在一个 dynasty为 的区块中, 那么定义一个End Dynasty,写做ED(v) = +2。为了不处理多个 SD 和 ED,一个用户在赎回以后不能再抵押成为 Validator。同时为了不坏人做恶后马上赎回 stake,在赎回交易执行后stake 仍须要锁定必定时间。
对于一个区块 b,假设其 dynasty 为 d,只有 d 在 ED 和 SD 之间的 Validator 才能够进行投票。
本篇介绍到这里结束,若是你们以为有疑惑的地方能够扫描下方二维码加入 Fractal 官方群讨论,Fractal 的技工们在线解疑,在下篇文章中,咱们将为你们介绍一下以太坊 2.0 中将要使用的 Casper 主要的协议过程。