casper协议是以太坊大都会版本采用的共识机制,主要作者和贡献者是Vlad Zamfir和Vitalik,分为2个阶段,第一阶段是Vitalik主导的在PoW基础之上通过PoS对区块进行最终确定性的确认。这里描述的是Vlad Zamfir主导的最终版本的casper的设计思想。
Slasher协议+安全保证金
简单的权益证明PoS存在无利害关系(nothing at stake)的问题,该问题是权益证明机制中的矿工对于当前链上所有存在的分叉都会进行投票(也可以理解为挖矿),因为在所有链上的签名投票都很容易,也没有任何损失,任何一个分叉成为主链都会使得矿工获得或多或少的奖励。
Slasher协议为了解决该问题,设计为:如果你在同一个层级的分叉上同时投了票,那么你就会失去你所能得到的区块奖励和保证金。意味着你的保证金如果使用得当,你就会赚取一部分“利息”,但是如果你使用不得当,你就会失去你的保证金。在经济学上这是理想的,在编程上它是可以实现的。将保证金加入Slasher协议意味着无利害关系问题被正式解决。这样的惩罚可以抑制矿工滥投票的行为。但从协议角度看,解决了无利害关系问题还远远不够。
贿赂型攻击
加入安全保证金的Slasher协议意味着在PoS基础上结合了激励机制。但是在权益证明中,什么样的激励机制是合理的?在假设任何持币者都是不可靠的前提下,加入激励机制的协议安全性如何?
首先了解下什么是纳什均衡。一个纳什均衡包括一个策略组合(参与者的策略选择)和相应的收益(损失以太币或者获得以太币),达到纳什均衡时,没有什么激励可以使得参与者个体偏离此均衡。如果这些参与者有动机去做出偏离规则的行为,例如为了得到更多的ETH,那么他们一定就会以某种方法去改变他们正在做的行动。如果你们记得这条,并且每当你们听到“纳什均衡”的时候能够想到“个人的策略改变是毫无意义的”,那么你就懂得了纳什均衡。
如果通过收买/贿赂博弈参与者能够改变博弈的收益,那么就会改变这场博弈的纳什均衡。你只要地给那些持币验证者一些贿赂,让他们将他们的币转移到一个新的地址,并且提供给原来地址(现在余额为零)的私钥给你。这样,在一笔保证金存款退回给验证者后,执行贿赂攻击的对手就能用最低的价格买到验证者地址的私钥。这种攻击和长程攻击是如出一辙的。它获取旧私钥来控制区块链,这就意味着攻击者能够随意地创建“假的历史记录”。但是这种事情只有在所有的保证金都在同一时间到期的情况下才能发生。所以在我们没有解决长程攻击问题之前,客户端想要获取可靠的信息来知道谁真正地拥有保证金存款,将是不可能的(保证金具有有效期,过期后需要重新确认)。
解决办法是当这笔保证金被取出之后,这些节点的签名将不再有意义,他们的出块数据将被忽视,反过来说,如果一个区块是被当前存有保证金的验证节点创建的,那么这个区块便是有效的。虽然这种方式不尽完善,但是对于基于保证金存款的权益证明(PoS)来说,却是必要的,因为它能解决贿赂型攻击问题。所以,工作量证明安全模型和权益证明安全模型从根本上是不兼容的。
那么如何管理这些验证节点的列表?我们只需要信任一次外部资源的相关信息,即首次导入的验证节点列表,之后就将有能力自己更新列表了。更新时需要使用来自于验证节点的签名去管理验证节点列表的更改,并在验证节点对这些更改达成共识:让所有的验证节点每N个区块签名一次,以更新验证节点列表。为了保证同步和更新验证节点列表,保证金存款时间也需要变得更长。
长程攻击
在一个51%攻击中,有一个新账户持有100个比特币,使用该比特币去购买比如莱特币等数字货物,然后等待交付(例如,在6次确认之后),但随后我从打包发送100比特币交易的区块之前的区块开始计算新的区块链,并将一笔把比特币发给自己的交易打包进区块,然后我用比全网其他节点更多的算力来计算我的分叉,最后我的分叉超过主链,从而成为主链,所以最后我有比特币和litecoins 。这里的攻击可能从交易的前6块开始攻击,而在一次长程攻击中,可能前60000块开始攻击,甚至是在创世块处开始攻击。
这种攻击天然存在于PoS共识中,比如一个攻击者持有1%的币,尽管他被选中出块的概率是1%,但是一旦被选中,他可以生成100倍以上的块甚至更多,很容易产生更长的链,进行分叉攻击,这个问题一种解决方法是对每个block打时间戳,其他节点会拒绝太久远的区块数据。因此,长程攻击必须符合相同的时间长度,但由于它持有币数量要少得多,因此其得分会低得多。
惩罚条件
解决完无利害关系(nothing-at-stake)和长程攻击(long-range attack)问题后,我们准备开始选择我们的惩罚条件(slashing conditions)。
前面的讨论假设客户端最终将选择相同的链,因为它们有相同的分叉选择规则(“共识”)。而完全没有意识到这种机制严重依赖于同步性假设(例如同步时钟和可预测的网络延迟)。
从我们有关解决远程攻击问题的方法中,我们发现我们需要一种方式让区块链的各个客户端对安全存款保证金的一系列更改达成“最终的”一致,也就是说区块一旦被确认,将是不可逆转的。
我们必须为权益证明取得“最终确定的共识”。使用安全保证金本身来给区块链设置检查点,用权益证明检查点替换开发人员设置的检查点。 客户端可以使用这些检查点的哈希值来验证存款列表是否发生过更改。 这些检查点将在每X个块后发生,并且高度在N * X处的块的“检查点”将在高度(N + 1)* X处开始检查(通过它们“最长链”的共享尾端,给予它们时间去同意),在这个过程中将需要绝对多数的绑定权益,因此在同一高度存在的两个有效检查点将肯定会触发惩罚条件。
使用安全保证金本身来给区块链设置检查点,用权益证明检查点替换开发人员设置的检查点。 客户端可以使用这些检查点的哈希值来验证存款列表是否发生过更改。 这些检查点将在每X个块后发生,高度在N * X处的块的“检查点”将在高度(N + 1)* X处开始检查,在这个过程中将需要绝大多数的绑定权益,因此在同一高度存在的两个有效检查点将肯定会触发惩罚条件。
当一个保证金节点在相同高度处创建或签署两个区块时,将扣除他们的存款保证金,并且这种行为会被认为是“明显不良的行为”。如果是两个不同高度上不同的分叉中的两个区块呢? 这就很棘手了。我们需要抑制分叉,而分叉可能是由绑定的权益持有者参与任何(其他)的分叉造成的。但是我们仍然需要允许保证金节点在他看来的最高分叉上进行灵活的验证签名而不被惩罚。
一名权益持有者在分叉1的区块上签名后,又在分叉2的某区块上签名,如果在创建签名之时分叉2的评分高于分叉1,那么权益持有者的做法是没有问题的。这完全类似于以下情况,对一个PoW(工作量证明)矿工来说,当一个区块上的攻击者分叉变得长于它的正确分叉后,他在攻击者区块中挖矿是没有问题。 但是目前我们没有可行的工具让在不同高度的两个分叉签署的权益持有者受到惩罚,又不能因为其签署了最高评分的链分叉而惩罚相应的权益持有者。
所以惩罚规则就是:绑定存款保证金的权益持有者承诺永远不会签署不是“给定”区块链扩展出来的区块,如果所有保证金节点可以对同一分叉作出该承诺,那么我认为这个规则可以非常有效地防止区块链分叉,如果不能保证,那么他们将不再能够参与到其中,或失去他们的存款保证金。
顺带提一下tendermint。Tendermint是“最简单安全的权益证明协议”。 在这里,我理解的“安全”是“安全阻止试图分叉区块链的贿赂行为攻击者”。Tendermint具有这种属性:每个区块在被添加(”委托“)到区块链之前已经被完成。 这保证了,无论分叉多么短,一旦发生分叉或别的情况,至少有1/3的安全存款保证金将被削减。 它在反分叉安全性上比其他方式要强得多。
4. 寡头垄断
Tendermint在未来将会产生一个持有多于三分之二的安全存款保证金的Tendermint验证者卡特尔(垄断联盟),因为构建最终的区块并不需要其余验证者的参与(这些“非卡特尔验证者”只持有少于三分之一的安全存款保证金)。这些少于三分之一的节点将被屏蔽,以至最终被移除出验证者名单。一组新的持有多于三分之二(现在总量会少一点)的安全存款保证金集卡特尔将随之产生,并且这一过程将会一直持续运作到仅剩(最多)两个验证者存在。
这是对贿赂行为攻击者模型的巨大的变革。不再假设每一个节点都愿意并能够接受贿赂,而假设利益最大化的验证者卡特尔将产生,而那些不在该卡特尔中的验证者将不会执行卡特尔的战略选择。在此基础上,以“一个给定规模的卡特尔在破坏一个协议保证金时,会失去多少收益”这一问题为切入口,考虑经济安全性的问题。
就寡头竞争来说,它是很多现实存在的市场之中的常态。一小部分的相对富裕的验证者的合作会比一大批的相对贫穷的验证者的合作要来的更加容易。在这个情况下,验证者卡特尔的形成是完全在意料之中的。
区块链的架构是一种为了寡头市场而作的机制设计。
现在运行的项目中,任何一个工作量证明区块链中的51%的矿工组成的卡特尔会因为直接激励,从而去屏蔽那些非卡特尔中矿工,比特币、以太坊、狗狗币和ZCash都是如此。任何一个不成熟的权益证明协议中的51%的权益币组成的卡特尔也有这个相同的能力,即通过屏蔽非卡特尔一方来获得直接利益。比如NXT,PPC以及NEM。任何一个相容性偏好的传统共识协议中的67%的绑定币组成的卡特尔也因为类似的直接激励,从而屏蔽那些非卡特尔的一方;比如说Cosmos (Tendermint)。
大多数处于这一领域的项目都是依赖于一个假设,那就是“故障节点数量不会超过一定量”(或者是错误权益不会超过一定比例)。在公有链中,故障计数假设是不适用的,因为公有链是存在于寡头垄断的环境中的,其中极少数的矿工或者代币持有者(又或者,在一些特殊的架构里,是名誉持有者)可以通过协商一致,持有大比重的算力、代币或者名誉。
对卡特尔模型中屏蔽的抵抗力
我们要设计的权益证明协议,是能在形成卡特尔后仍稳健发展的权益证明协议。而且必须实现的是,在这个新的协议中,卡特尔没有屏蔽那些不在卡特尔中的验证者的动机。当进行工作量证明共识的卡特尔分析时,一个占有51%矿工的卡特尔有动机去屏蔽那些不在卡特尔中的矿工。这些51%的矿工会立刻得到更多酬金的奖励,并最终会得到更多的区块奖励,而工作量证明协议无法检测出这种屏蔽。
必须构建一个卡特尔没有动机去屏蔽其他验证者的协议。在这样一个协议中,当验证器出现缺失的(被屏蔽)情况时,卡特尔就必须被惩罚。而且惩罚得程度上足够严重,时间上足够长久,从而使它不再为了自身利益而去屏蔽那些非卡特尔成员。
这种协议是怎么执行实施的:如果一个验证者不能将区块纳入到链中的话,那么所有那些成功将区块纳入到链中的验证者都会被惩罚。这同时也明确地告诉我们,在卡特尔模型中的屏蔽的成本是“一个验证者故意脱机以导致其他线上验证者损失资金”。对于协议来说,它是很难清楚得知验证着到底是被屏蔽了,还是出于其自身利益而故意脱机离线,因此,惩罚相关的离线验证者也是必需的。
去中心化的定义
关于去中心化的有趣的定义:
判断一个协议是不是去中心化的,是看这个协议能不能在全部节点都永久性删除后,仅依靠一个节点仍然能够恢复过来正常运作。例如Tendermint,如果在网络中没有三分之二的权益加权验证者去有效地签署区块的话,它并不能在没有硬分叉的情况下实现恢复。相反,Bitcoin、PPC以及NXT在只有一个矿工或者权益所有者保持在线的情况下,是能够实现恢复的(尽管这会花他们很多的时间去创建区块)。
友好GHOST
传统拜占庭容错共识机制仅关注于构建所有遵循协议的节点都能最终达成共识的确定区块,就像Tendermint一样,永远不存在任何分叉。传统的拜占庭容错共识协议需要一个可用的“Byzantine Quorum”,Quorum 系统是指一组节点的一个恒定大小的子集(比如2/3),任何这样的一个子集都保证可以产生最新的数据,从而保证在服务器出现拜占庭错误时,系统还能保证一致性。但是这样的协议不符合上面的去中心化定义。
我们需要一个可用性更强的共识协议,而不是一味强调强一致性,从而即使是在只有一个验证者工作的情况下,这个验证者还能够构建一条区块链。我们期望的协议是这样的:验证者将会制造一个区块和“验证签名“后的DAG(包含分叉信息的有向无环图),这个签名将证明它们有效性和共识权重,DAG是分叉处理协议GHOST所用的数据结构。在这个GHOST中,将有一个函数能够接收任何类似的DAG并返还一个“最简洁的”交易次序。一个包括所有共识行为的记录将会在DAG中被保存,用于激励参考,如果任何的验证者产生的区块经常处于分叉上,那么每一个验证者都会被惩罚。协议还需要具有下面的性质:
- 如果必要的话,一个验证者便能构建区块。
- DAG能够捕捉到所有某一验证者可能发现的对于协议激励机制有用的信息。
- 卡特尔的屏蔽会被惩罚。
Casper就是基于上面简单的“友好GHOST”,并经过改进以适应权益证明,加入能够激励卡特尔对非卡特尔验证者“友好”的激励机制。