浅谈Casper


众所周知,PoW 算法存在大量资源浪费,算力集中等问题,以太坊从17年开始就一直想要切换到 PoS 算法。但是由于种种客观条件的限制,一直没有实质性的发展。在放了广大区块链爱好者几年鸽子后,以太坊 2.0 终于要使用 PoS 算法了。本着独乐乐不如众乐乐的中国传统美德,Fractal 的技工们决定跟大家分享一下,我们关于下一代以太坊共识协议——Casper的看法。

Casper 其实有两个版本,一个是 Vitalik 领导的 Casper FFG,另一个是 Vlad 领导的 Casper CBC,他们的不同之处就在于 FFG 更多的是作为一个过渡协议,使得以太坊能够从 PoW 成功过渡到PoS;而 CBC 是以太坊切换到 PoS 后一个更好的版本,但从目前来看 CBC 仍有很多细节需要进一步研究和探讨。

本文会分为三个部分,首先为大家解读一下 Vitalik 关于 Casper FFG 的论文,既如何在现有以太坊的 PoW 协议上叠加一个 PoS,在减少矿工挖矿奖励的同时提高系统的安全性;其次,为大家介绍一下以太坊 2.0 中将要使用的 Casper 主要的协议过程,如何利用以太坊1.0(PoW)来构建以太坊 2.0(PoS);最后,和大家探讨几个 Casper 中比较好玩的问题。

Casper FFG ——PoW+PoS

以太坊想要切换到 PoS 已经不是一天两了,但是受到各种外界因素的限制,久久不能实现,为了能够推动以太坊逐步向PoS迈进,Vitalik提出了Casper FFG,还真是个小机灵鬼呢。FFG 主要思想是借助 PoS 帮助 PoW 产生的区块最终确认,进而在减少矿工奖励的情况下来提高系统的安全性。

首先假设有一群参与者,通过抵押超过一定量的stake成为Validator(参与pos的共识节点),Validator负责运行PoS协议,为描述的便利性,假设在协议的过程中(Validator)保持不变。PoW的以太坊,会产生一棵树,如果Validator对每一个区块进行投票,会增加网络传播开销,为了减少Casper中投票的数量,将100个区块压缩成一个checkpoint,如图1所示:
	Figure 1: 区块压缩成checkpoint
Figure 1: 区块压缩成checkpoint

将区块压缩之后我们得到了图2,并且为每一checkpoint提供了一个高度函数 :区块 到根结点 的跳数。
在这里插入图片描述

Figure 2: checkpoint 高度函数

首先,我们从整体上描述一下Casper的共识过程。参与共识的Validator会对上文中所述的checkpoint进行投票。每个Validator投的是一段checkpoint,它是从一个称之为justified的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都被确认。

Validator 投票

在将PoW产生的区块压缩成checkpoint之后,Validator对于这棵树进行投票,投票规则如下其中:

[公式]
在这里插入图片描述

checkpoint 的两种关系

在定义了投票规则之后,定义任意两个checkpoint之间的关系:

supermajority link:对于一对checkpoint(a,b) ,写作(a->b) ,如果有超过2/3的validator投票
, 可称作 是一条supermajority link,并且 [公式]

conflicting:如果两个checkpoint在不同的分支上称之为conflicting。
在这里插入图片描述

Figure 3:Casper结构示意图

如图3所示,其中 [公式]
是supermajority link,b2,b3是conflicting。

checkpoint两种状态

在有了checkpoint之间关系的定义之后,定义checkpoint——c的两种状态:

c是 justified:

  • c = root :checkpoint c是根;
  • 或存在 在这里插入图片描述
    在这里插入图片描述

c 是finalized:

在这里插入图片描述
在图3中, (r, b1,b2,b3) 是justified,(a2,a3) 是 finalized。如果一个checkpoint状态是finalized,那么它以及它之前所有的block都会确认。

惩罚机制

为了防止Validator在运行的过程中作恶,Casper制定了一套惩罚机制如下:对于相同的Validator,发布了两个不同的投票 [公式]
[公式]
,如果存在一下两种情况则罚抵押的stake。

1、 [公式]
:对于同一个目标高度,不能发起两个不同的投票。

2、 [公式]
:两个投票的投票范围不能存在一个包含一个。

我们来看一下在合法的交易的情况下,justified和finalized是如何保证checkpoint的安全性的。当一个checkpoint : c成为了justified,说明有超过2/3的Validator支持c之前所有的checkpoint,配合着第一个惩罚条件,在h©有超过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的投票。
在这里插入图片描述

Figure 4: finalized之前的checkpoint会被确认

分叉选择机制

为了让PoS能够提高PoW链的安全性,在如何进行分叉选择的时候,FFG对最重链进行了些许的修改:首先在视图中找到高度最高的justified的checkpoint,并在该checkpoint之后的区块上进行最重链选择。这样做有两个好处,第一个是相比于原有的ghost算法,区块的确认是概率性的,等了足够多的高度之后,只有很低的概率颠覆之前的区块,虽然概率很低,但是还是有这种可能性;FFG中只要是在finalized之前的区块都是被确认的,没有被颠覆的可能性。第二点是一个确认的区块的安全性是需要矿工不断将自己的工作量提供给该区块的,因此为了激励矿工需要更多的挖矿奖励;FFG中,只要是finalized的区块都是被确认了的,无需后续的矿工用起工作量为已经确认的区块增加安全性,因此可以降低挖矿奖励,降低通胀率。

Validator的更换

我们刚开始说过,先假定Validator是固定的,但是一个真正的区块链系统肯定是能够让参与者自由进出的,因此FFG有一套自己的Validator出入原则。首先,还是先定义区块b的dynasty:从根结点到b的父节点之间 finalized checkpoint 的数量。

抵押:

用户想要成为Validator需要抵押一定的stake,当用户v的抵押交易被包含在一个dynasty=d的区块中,那么定义开始dynasty,DS(v) = d+2。

赎回:

用户在想要取回抵押的stake,Validator需要发起一个赎回交易,当这个交易信息被包含在一个 dynasty为d的区块中, 那么定一个结束dynasty,ES(v) = d+2。为了避免处理多个DS和ES,一个用户在赎回之后不能再抵押成为Validator。同时为了避免坏人作恶后立刻赎回stake,在赎回交易执行后stake仍需要锁定一定时间。

应对长程攻击

长程攻击(long range attack)是指用户从过去对节点自私挖矿收取挖矿奖励,在足够多对区块后,他就能积攒到超过好人拥有对stake就可以为所欲为。为了应对这种攻击,初始的FFG采取的方式还是对历史记录做一个checkpoint,这个checkpoint可以由社区来进行维护。

PoS的Casper

在上一篇文中,我们介绍了Vitalik原始论文中的Casper FFG,它是一个折中的方案,通过PoS对PoW产生的区块进行确认来提高系统的安全性。但是这是一种过渡的方案,在以太坊2.0中会使用一个纯PoS的Casper协议,这篇文章中将为大家介绍在以太坊2.0中将要使用的Casper协议。

如何成为Validator

首先我们看看以太坊2.0的架构是什么样子,如图1所示,在以太坊2.0中会有一条称之为Beacon chain的主链,beacon chain是通过PoS的Casper产生的。在beacon chain下,会存在1024个分片,每个分片可以独立地处理数据。
在这里插入图片描述

Figure 5: 以太坊2.0架构

从图5可以看出,以太坊2.0和以太坊1.0将会是两条链,在2.0分片实现之后,1.0将作为以太坊2.0的一个分片继续运行。在上一篇文章中,我们介绍过可以通过抵押stake成为Validator参与到PoS共识中,为了使以太坊平稳得过度到2.0,如何通过抵押以太坊1.0中的stake成为以太坊2.0中的Validator是Casper需要解决的一个重要问题。

在以太坊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如图6所示:
在这里插入图片描述
Figure 6: 抵押以太坊1.0中的ETH成为以太坊2.0中的Validator过程

为了验证用户抵押交易的正确性,以太坊2.0中需要保存当前以太坊1.0中的区块信息、抵押合约中当前所有交易构成的Merkle的根哈希,用户向以太坊2.0展示其抵押交易,以及该抵押交易到完整的Merkle树的证明,就可以验证这币交易的合法性。通过验证的用户成为以太坊2.0中的Validator。

以太坊2.0中Capser的出块过程

在上一篇文章中,我们介绍的Casper是通过PoW进行出块,使用PoS对区块进行最终的确定。因此,纯PoS的Casper一个需要解决的问题是如何产生区块。在正式介绍协议过程之前,我们先明确几个定义:

  • Validators 集合: V = V1 … Vn,假设每个Validator拥有相同的stake;
  • slot:基本的时间单位,目前设定为6s;
  • epoch:64个slot组成一个epoch;
  • 随机数生成器:根据需要产生一个随机数;
    在明确了上述的定义之后我们来进一步描述以太坊2.0中的Capser出块,如图7所示
    在这里插入图片描述
    Figure 7: 以太坊2.0中Casper共识过程

每一个epoch开始,通过随机数生成器产生随机数,将Validator集合V平均分为64份,得到S1、S2,…,S64 [公式] 。
在一个epoch中,每一个slot i根据步骤1中产生的随机数,选取 [公式] 中的一个Validator提交一个候选区块,在slot [公式] 中提交候选区块的Validator写作 [公式],提交的候选区块称写作 [公式] 。
对于每一个slot [公式] , [公式] 中除 [公式] 外的剩余Validator对 [公式] 进行投票,写作attestation。
在每一个slot i中, 负责将上一个slot中的attestation信息打包到当前slot的候选区块中。即 [公式] 。
对于每一个slot [公式] ,[公式] 中除 [公式] 外的剩余Validator在收到了slot [公式] 的block( [公式])或等待了3s后,其公布一个在他看来的当前链的头部,写作 [公式] ,其中 [公式] 。 [公式]

LMD GHOST(Lastest Message Driven GHOST)

至此,我们介绍了Casper如何进行出块以及Validator对于候选区块的投票过程。需要注意的是,上文中提及到Validator需要对在它看来的链的头部进行投票,以太坊2.0使用了一种新的最优链选择算法来选择链的头部。

在介绍这种新的最优链选择算法之前,让我们回忆一下以太坊1.0的最优链选择算法——GHOST。GHOST算法的主要思想是,对于一条区块链因为时间延迟和恶意节点的存在会产生许多的分叉,当发现分叉时,选择子树的总Difficulty最大作为最优链,如图8所示:
在这里插入图片描述
Figure 8 :GHOST协议

链在红色的点产生分叉,假设每个区块的Difficulty相同为1,蓝色子树的总Difficulty为8,紫色子树的总Difficulty为4,因此选在蓝色作为最优链上的点。

GHOST协议在在PoW协议中是没有问题,但是PoS协议天然受到 Lang Range 攻击的影响,即攻击者可以通过少量资金购买曾经拥有大量stake但是目前为空的账户,回到过去,在过去的位置进行分叉产生大量的非法的区块,GHOST协议将无法保证系统的安全性。如图9所示:
在这里插入图片描述
Figure 9: Lang Range 攻击

攻击者通过在过去位置产生黄色的区块,子树B的总Difficulty为10,紫色区块将成为最优链上的点。虽然在投票前需要抵押token,但是在赎回自己的token后,攻击者就可以在其还是Validator的epoch中肆意妄为,不担心token会被罚没。

因此,为了解决这个问题,以太坊2.0设计了一个新的算法——LMD GHOST(Lastest Message Driven GHOST)。LMD GHOST的主要思想是,对一条存在分叉的链,在找寻链的头部过程中,当其遇到分叉点时,选择当前epoch中Validator支持多的那棵子树。协议的主要过过程为:

对于一条存在分叉的链:

  1. H等于创世区块;
  2. M=[M1,…,Mn] 是Validator的最新消息;
  3. 选择M中支持率最多的孩子节点,将其设置为H;
  4. 重复步骤(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。
  • 如果B4、B3、B2在justified_hashes中,投票给B4作为epoch_boundary_block的attestation选择B2作为latest_justified_hash,finalize B2。
  • 如果B3、B2、B1在justified_hashes中,投票给B3作为epoch_boundary_block的attestation选择B1作为latest_justified_hash,finalize B1。
    可以类比之前对FFG,Validator的投票为 [公式] ,可以将epoch_boundary_block看成h(t),latest_justified_hash看成h(s),这样可以类比上一篇文章,更方便的理解block的确认过程。
其他的一些小事

为了Casper完整的运行,还有一些小事需要解决,由于篇幅比较短小我们放在一起来说吧。

惩罚条件

为了抵御noting at stake攻击,用户通过抵押token成为Validator进行PoS,当Validator非法操作时,没收其抵押的token,来防止坏人作恶。Validator的惩罚条件为:

  1. 同一个Validator不能在相同的epoch中发出两个不同的attestation。
  2. 同一个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,对就是以太坊对PoS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yitahutu79

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值