在上篇文章中,咱们介绍了Vitalik原始论文中的Casper FFG,其借助PoS对PoW产生的区块进行确认来提升系统的安全性,但这只是一种过渡的方案,在以太坊2.0中会使用一个纯PoS的Casper协议,这篇文章中将为你们介绍在以太坊2.0中将要使用的Casper协议。算法
如何成为Validator安全
首先咱们看看以太坊2.0的架构是什么样子,如图1所示,在以太坊2.0中会有一条称之为Beacon chain的主链,其经过PoS的Casper产生。在beacon chain下,存在1024个分片,每一个分片能够独立地处理数据。架构
图1 以太坊2.0架构区块链
从图1能够看出,以太坊2.0和以太坊1.0将会是两条链,在2.0分片实现以后,1.0将做为以太坊2.0的一个分片继续运行。在上一篇文章中,咱们介绍过能够经过抵押stake成为Validator参与到PoS共识中,为了使以太坊平稳得过分到2.0,如何经过抵押以太坊1.0中的stake成为以太坊2.0中的Validator是Casper须要解决的一个重要问题。spa
在以太坊2.0中,原有的用户能够经过抵押以太坊1.0中的ETH成为Validator,参与到2.0的PoS中,而且能够经过赎回操做,在2.0的以太坊中取回代币。这里须要注意的是,以太坊1.0和2.0中的代币并不相同,用户抵押的是1.0中的ETH(烧毁ETH),赎回的是2.0中的代币(铸造新的token)。设计
用户想要成为Validator,首先要向以太坊1.0中的一个特殊合约发送一笔交易抵押必定数量的ETH(目前最小值为32ETH),而后用户会获得关于这笔交易的一个证实。用户经过向以太坊2.0展现这个证实,在验证经过后成为Validator,如图2所示:3d
图2 抵押以太坊1.0中的ETH成为以太坊2.0中的Validator过程code
为了验证用户抵押交易的正确性,以太坊2.0中须要保存当前以太坊1.0中的区块信息、抵押合约中当前全部交易构成的Merkle的根哈希<root>,用户向以太坊2.0展现其抵押交易,以及该抵押交易到<root>完整的Merkle树的证实,就能够验证这币交易的合法性。经过验证的用户成为以太坊2.0中的Validator。blog
以太坊2.0中Capser的出块过程token
在上一篇文章中,咱们介绍的Casper是经过PoW进行出块,使用PoS对区块进行最终的肯定。所以,纯PoS的Casper一个须要解决的问题是如何产生区块。在正式介绍协议过程前,咱们先明确几个定义:
Validators 集合: V = V1 … Vn,假设每一个Validator拥有相同的stake;
slot:基本的时间单位,目前设定为6s;
epoch:64个slot组成一个epoch;
随机数生成器:根据须要产生一个随机数;
在明确了上述的定义以后咱们来进一步描述以太坊2.0中的Capser出块过程,如图3所示。
图3 以太坊2.0中Casper共识过程
一、每个epoch开始,经过随机数生成器产生随机数,将Validator集合V平均分为64份,获得S一、S2,…,S64。
二、在一个epoch中,每个slot i根据步骤1中产生的随机数,选取Si中的一个Validator提交一个候选区块,在slot i中提交候选区块的Validator写做proposer_i,提交的候选区块写做B_i。
三、对于每个slot i,Si中除 proposer_i 外的剩余Validator对 B_i 进行投票,该投票写做attestation。
四、在每个slot i中, proposer_i 负责将上一个slot中的attestation信息打包到当前slot的候选区块中。即
五、对于每个slot i,Si中除 proposer_i 外的剩余Validator在收到了slot i的block(B_i)或等待了3s后,其公布一个在他看来的当前链的头部。
LMD GHOST(Lastest Message Driven GHOST)
至此,咱们介绍了Casper如何进行出块以及Validator对于候选区块的投票过程。须要注意的是,上文中说起到Validator须要对在它看来为链的头部进行投票,以太坊2.0使用了一种新的最优链选择算法来选择链的头部。
在介绍这种新的最优链选择算法以前,让咱们回忆一下以太坊1.0的最优链选择算法——GHOST。GHOST算法的主要思想是,对于一条区块链由于时间延迟和恶意节点的存在会产生许多的分叉,当发现分叉时,选择子树的总Difficulty最大做为最优链,如图4所示:
图4 GHOST协议
链在红色的点产生分叉,假设每一个区块的Difficulty相同为1,蓝色子树的总Difficulty为8,紫色子树的总Difficulty为4,所以选择蓝色做为最优链上的点。
GHOST协议在在PoW协议中是没有问题,可是PoS协议自然受到 Lang Range 攻击的影响,即攻击者能够经过少许资金购买曾经拥有大量stake可是目前为空的帐户,回到过去,在过去的位置进行分叉产生大量的非法的区块,GHOST协议将没法保证系统的安全性。如图5所示:
图5:Lang Range 攻击
攻击者经过在过去位置产生黄色的区块,子树B的总Difficulty为10,紫色区块将成为最优链上的点。虽然在投票前须要抵押token,可是在赎回本身的token后,攻击者就能够在其仍是Validator的epoch中肆意妄为,不担忧token会被罚没。
所以,为了解决这个问题,以太坊2.0设计了一个新的算法——LMD GHOST(Lastest Message Driven GHOST)。LMD GHOST的主要思想是,对一条存在分叉的链,在找寻链的头部过程当中,当其遇到分叉点时,选择当前epoch中Validator支持多的那棵子树。协议的主要过程为:
对于一条存在分叉的链:
一、H等于创世区块; 二、M=[M1,…,Mn] 是Validator的最新消息; 三、选择M中支持率最多的孩子节点,将其设置为H; 四、重复步骤(2-3)直到没有孩子节点;
虽然LMD GHOST的使用是为了解决Long Range攻击,可是笔者认为, 购买曾经的帐户至关于时光倒流,造成了一个新的平行宇宙,当一个新用户进入时,面对两条分叉链在不借助额外信息(checkpoint)的状况下很难判断哪一个是攻击者构造的链,所以LMD GHOST没法完全抵御Long Range攻击。
至此咱们已经介绍链以太坊2.0中的Casper如何进行出块,接下来将是最后一个部分,如何对候选区块进行最终的确认。
区块确认
在上一篇文章中,咱们解释了justified和finalized的checkpoint,finalized的checkpoint以前的节点被最终确认。归纳的说,以太坊2.0中的Casper将每一个epoch当成一个checkpoint,attestation对checkpoint进行投票,进而肯定checkpoint的justified和finalized状态,肯定justified和finalized的核心逻辑和上文中描述的相似。接下来,来讲明一下block如何进入到justified和finalized状态。
如何 justify block
如今Casper将一个epoch分红64个slot,最后一个slot称之为epoch_boundary_slot,用它的hash写做epoch_boundary_hash表明一个epoch,将一个epoch看做一个checkpoint。让链维护一个map,咱们叫他justified_hashes,存储的格式是<slot, hash>。为Validator 的 attestation增长两个字段 epoch_boundary_hash(上一个epoch中slot最小的block的hash) 和 latest_justified_hash(epoch_boundary_hash引用区块中的justified_hash epoch最新的block的hash),只有当attestation中的latest_justified_hash 等于justified_hashes中的slot最新的hash,这个attestation才合法。
链会跟踪最新的justified hash,所以选择相同epoch_boundary_hash会投票给相同的latest_justified_hash。如今咱们来看看在一个 epoch boundary 中,状态是如何转变的。假设对于一条链,最近的4个 epoch的epoch_boundary_block B1, B2, B3, B4 其中B4是epoch最新的epoch_boundary_block,他们的 slot 写做 B1_slot, B2_slot, B3_slot, B4_slot, B3_slot = B4_slot - 64, etc。若是有超过2/3的Validator选择B4做为epoch_boundary_block,那么把<B4_slot, hash(B4)> 加入justified_hashes。
一个epoch_boundary_block成为justified的条件是超过2/3的Validator在其attestation中epoch_boundary_hash指向该block,当一个block被含在justified_hashes中表示,该block是justified,而且证实该block已是justified的状态被记录到了链上。
如何finalize block
在确认了justified的状态后,下一步须要肯定如何让block进入finalize状态。
若是B4和B3在justified_hashes中,投票给B4做为epoch_boundary_block的attestation选择B3做为latest_justified_hash,finalize B3。
若是B四、B三、B2在justified_hashes中,投票给B4做为epoch_boundary_block的attestation选择B2做为latest_justified_hash,finalize B2。
若是B三、B二、B1在justified_hashes中,投票给B3做为epoch_boundary_block的attestation选择B1做为latest_justified_hash,finalize B1。
能够类比上一篇文章,Validator的投票为<v, s, t, h(s), h(t)>,能够将epoch_boundary_block当作h(t),latest_justified_hash当作h(s),这样能更方便的理解block的确认过程。
其余的一些小事
为了Casper完整的运行,还有一些小事须要解决,因为篇幅比较短小咱们放在一块儿来讲吧。
惩罚条件
为了抵御noting at stake攻击,用户经过抵押token成为Validator进行PoS,当Validator非法操做时,没收其抵押的token,来防止坏人做恶。Validator的惩罚条件为:
一、同一个Validator不能在相同的epoch中发出两个不一样的attestation。
二、同一个Validator不能发出两个attestation,他们的 epoch_boundary_block 分别为t1和t2,latest_justified_hash 为s1和s2,且 s1<s2<t2<t1。
这个惩罚条件和上一篇文章中的惩罚条件是相同的。
Validator更换条件
dynasty(B)表示从block B开始到创世区块之间,finalized epoch的个数。两个dynasty之间能够更换1/64的Validator。
分叉选择条件
从最新的finalized block开始,进行LMD GHOST。
《求真区块链》本系列关于Casper的文章到此为止就结束了,若是你们以为有疑惑的地方能够扫描下方二维码加入社区讨论,Fractal 的技工们在线解疑。