《读懂区块链PoS共识》第九章 PoS目前存在的问题

PoS共识从2012年发展到现在,6年有余。这些年,PoS暴露的问题也比较多,但这些问题和PoW的51%攻击在一个方面很类似,即理论可证,但是实际发生的概率很小。这些年间真正因PoS共识发生的事故屈指可数。PoS的严重缺陷大都都是在研究披露后,才意识到的。但不可否认的是,PoS共识和区块链一样,日新月异的在变化。每一个新的PoS共识出来,都是站在了前人的肩膀上,PoS共识演化出来了很多新型的特性,使得现在我们看到的PoS共识,已经比SunnyKing的一代PoS共识,强健了不少。
PoS共识从提出时,本质上就是希望用持币人的Voting Power(投票权重)代替掉PoW里面的算力权重,来解决能源消耗问题,但是就是这么一个简单的初衷,把很多基于PoW共识设计的原则性平衡都打破了,PoS开始要面对由自己本身带来的各种问题。
首先,从代币分发开始,PoW是算力工作获得初始分配,而PoS的代币却没有初始分发方案,怎么发,发多少,发给谁都是问题,代币分发不下去,用VotingPower代替算力权重的初衷就实现不了。
就是初始代币以非常合理的方式分配出去了,PoS的验证人选举又有了问题,如何选择节点,选择哪个节点又是新的问题了。PoW中通过算力竞争,以解谜题的方式选出了出块节点,付出最多算力的节点获胜,PoS中没有这套啊,难道让Voting Power最多的人一直出块吗?
后来倒是有很多项目设计了选举算法,但是很多算法后来被证明是有可被攻击性的。选举算法都和随机数发生有关,只要是伪随机数,那么肯定就又存在被操作的漏洞,这些漏洞,大则会摧毁整个系统,小则会被利益者操纵,获得更多选举权,从而获得更多的奖励。
PoS的奖励系统又是另外一个问题,PoW一般是固定总量,后通过挖矿分发,PoS的代币早已分发完毕,后续的挖矿动力不足,很多PoS共识的项目用增发的方式来激励挖矿,但增发多少,怎么分发,以怎么样的速率同样是新的问题。
同样是验证人,PoW的验证人作恶是有成本的,因为很可能付出了成本(电力,算力),最后却没有得到奖励。而PoS的作恶,早期是没有成本的,因为很多项目上只要持币用客户端运行节点出块了,这样带来的问题就是,心存恶意的验证人会频繁的尝试出块,签名,出块,签名,甚至不在自己的出块周期内,亦或是在多条链的分叉上签名,无休止,无成本的攻击网络,企图获得更多的奖励,这就是PoS共识上,著名的无利害攻击(Nothing at Stake)。
类似的问题还有很多,都是修改PoW共识机制后引出来的。在PoS上尝试解决这些问题后,又带进来了很多新问题,很多问题是PoS上独有的,甚至理论无法证明的。在相信大部分的人都是诚实的情况下,PoS就是这么一步步走到了现在。
PoS共识发展到现在,机制中会遇到的问题可以分成很多类别,我尝试以外部和内部的分类方式去列举PoS发展过程中碰到的问题。其中外部问题指的是使用PoS共识后,外部可能攻击共识的方式;内部问题指的是PoS共识本身设计,可能引起被攻击的方式。
外部问题
分发
前面讲到过,PoW的分发是通过挖矿,比如BTC总量是2100万枚,以一个块N个BTC奖励的方式不断分发出去,这种分发相当于将BTC分发给了给这个网络做贡献的人,而且谁都可以来做贡献,在分发范围上并没有丛限制,同时BTC的2100万枚,以4年减半的速度降低分发,也在时间维度上给了参与人机会。PoS没有这种机制,所以PoS的分发就成为了问题。
最早的PoS代币分发方式是通过捐赠的方式,像Peercoin,Nxt都是采用这种方式,都是创始人在Bitcointalk上发帖子,说要做什么什么项目,然后希望获得捐赠,以此来作为开发的一些费用。
起初这些项目获得捐赠都是很少,因为Bitcointalk里面充斥着很多可能以骗局为目的项目,捐赠人往往需要冒着很大的风险。所以那些个通过捐赠活下来的项目,最后分发代币的时候,每个捐赠人可以获得非常非常多的项目代币,就比如Nxt的捐赠,21天,有73个用户参加,总共捐赠了21个BTC,这73人一起瓜分了10个亿Nxt。
后来随着区块链项目的热度起来,很多团队开始开发区块链项目,而不再是以一个人为主,所需要捐赠的钱就开始变多了,2014年后,ICO变得被大众接受,发起点同样还是Bitcointalk。ICO成为首次代币发行销售,意思就是在主网没上线前,先销售代币来获得开发收入,开发团队往往会给自己留10%~20%的代币,剩余的进行ICO。
后来ICO的样式变成了多种多样,但都充斥着同一个目的,就是在自己保留越来越多的代币情况下,又能获得足够多的开发资金。所以我们看到后来的ICO项目,留给自己的代币就不是10%~20%了,而是有了越来越多的名目开始保留代币比例,比如初始投资人,基金会等等。
所以PoS的代币分发是经历了一个非常集中,到较为分散,再到较为集中的这么一个过程。理论上,代币分发的越分散,去中心化程度越好,形成对系统有威胁的成本也会比较高。但是PoS代币分发发展到现在,我们看到一个趋势,就是PoS共识里的代币大户非常的集中,往往前10名持币人持有了超过50%,甚至60%的代币总量。
虽然这符合现实世界的经济分配规律,但是还是不免有点让人寒心。不过,寒心背景下,好像也没有很好的办法来解决代币的合理分发问题,就连我们觉得很公平的BTC分发,现在看来,最终大量持有BTC的人,还是现实中的非常有钱的人。
参与度
PoS当中,需要有足够的代币进行Staking才能维护网络安全,因为Staking的量充当着系统中出块人被选择的重要因素。想象一下,如果系统中的Staking量相当低,那么极有可能出现一个大户就几乎可以获得全部的出块机会(分发不均也会出现这样的问题),这样,一个网络就毫无去中心化可言,并且攻击网络变得极其简单,只要大户自己愿意,或者是外部因素直接攻击这个大户就可以了。
典型BFT+PoS的混合共识,加入了系统的容错程度,使得只要超过2/3的Stak拥有人是诚实的,那么系统就不会崩溃,任凭其余人怎么攻击。如果PoS代币分布比较分散的话,要求大量的代币参与到PoS共识中来Staking,将变得一件极其困难的事情。
早期像Peercoin,PoS挖矿设计的想法很多是源于PoW的模型,这导致了PoS奖励对Stake吸引力极其微弱,Peercoin的PoS铸币是根据在币利交易中所消耗的币龄产生利息币。设计时设定了每1币一年将产生1分(利息),这样的设计问题就是动力不足,而且币龄这个事情本来就比较难持有,所以在Peercoin上,PoW出块的数量还是要比PoS的要多得多。
现在很多纯PoS共识对Staking的处理办法就是:增发。用增发的代币去奖励为系统工作的节点,并还造出了一个概念,叫做是非稀释通胀。如果持币人想避免被增发的代币稀释,那么将持有的代币Stake到系统中,那么你就有机会获得超过稀释率的价值。
通常情况下,100%代币Stake的情况下,你Stake能获得的奖励比例和增发的比例是一样的,如果不到100%的代币Stake,那么你获得的奖励比例会随着Staking的比例而变化,成反比,也就是说,你Stake了,别人不Stake,你肯定能获得更多奖励。由此带来的激励会让很多人对Stake有兴趣,更有动力。
目前这种非稀释通胀的方法,是吸引Stake量比较成功的办法。
激励问题
由参与度的问题引出来了激励的问题,天下没有免费的午餐。一个网络要变得健壮强大,离不开众人的维护。PoS的维护众人就是所有的持币人,激励更多持币人来维护网络,变成了PoS一项主要的使命。
和PoW不同,PoW是要激励更多的人,而非必须是持币人。这点造就了PoS上激励模型的不一样,加上现在越来越多的PoS项目加入了链上治理,希望持币人社区能来决策项目前进方向,使得投票激励变成了除区块激励外,另外一个比较重要的激励方向。同样的,还有像开发激励,社区大使激励,空投激励等等,越来越多的方向需要被激励,PoS的激励模型已经变得越来越复杂。
现在PoS项目的做法也各有不同,有通过增发覆盖全部激励的,有通过交易手续费抽成来覆盖部分激励的,还有通过抽成区块奖励来奖励部分工作的。这些治理方案就像是一个个国家,每个国家治理的政策都不一样,最终也导致了不一样的结果。
很难判断这些方案谁好谁坏,仁者见仁智者见智了,实践出真知。
内部问题
无利害攻击(Nothing at Stake)
Nothing at Stake是PoS上著名的攻击问题,我们都知道持币人通过Stake来参与PoS共识,获得出块机会。验证人在这个过程中执行了出块和验证两个动作,一般情况下,这两个动作合起来是一个铸币的过程,新的币会被奖励给验证人。
验证人为了获得足够多的奖励,会找更多的机会来出块和验证,其中,通过在分叉,并在新分叉上签名验证,是PoS早期一个非常好的尝试方式。无论哪条分叉链胜出,验证人都可以获得奖励,甚至获得双倍奖励,在PoS上发起这样的攻击,是没有成本的,只需要Stake。
Nothing at Stake中的Nothing指的就是这种无成本攻击攻击网络的情况,Nothing at Stake就可以理解为在Stake时没有成本的攻击网络。无利害攻击发生的概率是比较大的,因为不容易检测,所以很多验证人会暗地里尝试,但因为持币人的总体利益问题,大规模,成群的实际发生不太有可能。
一条链有频发的分叉攻击是恐怖的,所以很多方法前有币龄,后有Slash。币龄的方案成本太高,对Stake的意愿有所抑制,抵押金+Slash的方式非常好的解决了这个问题。验证人在做出块和验证时,需要向系统缴纳抵押金,如果系统检测出验证人的双签情况,验证人的抵押金将会被Slash。
对抵押件的Slash是比较严格的,这样可以有效抑制频繁发生的分叉攻击,保证系统稳定。
长程攻击(Long Range Attack)
长程攻击指的是从创世区块开始,创建一条比原主链还要长的链,并篡改全部(部分)交易历史,来代替原来的主链,长程攻击也称作为覆盖历史攻击。
区别于短程攻击,长程攻击必须从创世区块开始构造交易,从中间点构造交易分叉链攻击称作为短程攻击。
长程攻击所利用的点在于,新加入的节点或者长期不在线的节点在同步新的区块数据时,并不能很清楚的知道哪条链是真正的主链,如果根据最长链原则来决定的话,很有可能出现真正的主链被篡位的情况,被修改了历史的主链变成了最长链,成为了新节点的同步接入点。长程攻击的制胜点在于,在分叉链生成的区块长度大于主链时,所有节点将会接受最长链的交易。
理论上,因为验证人在分叉链生成区块是没有代价的,而且是不需要等待时间,基于创世区块生成一条比主链还要长的链变得简单,唯一条件就是造出来的链比主链还要长,才能发起攻击,有很多理论都可以证明,但是实际操作很困难。有博主在文章中说过:
这样的攻击只能针对非常长区块时间的区块链来实施。根据研究,持有 30% 权益的攻击者在长约 6 年的区块链上才能发动这种攻击
随着PoS的发展,各个阶段发起的长程攻击各不相同,针对策略也不相同,以下是几种典型的攻击方式:
简单攻击(Simple Attack)
简单攻击指的是分叉链在单位时间里面尽可能都的创造区块,以此来超过原主链长度所形成的攻击。在分叉链上,往往只有主导分叉的验证人一个,所以他完全可以忽略别人生成的区块,只生成自己的区块,并加快单位时间内自己区块的生成速度,那么分叉链的出块速度就有可能超过主链。
解决这种攻击的方法也很简单,用验证时间戳的方式来解决,对每个区块时间的时间戳进行验证,对于不合理的时间戳,比如同一时间里出现的多个区块,直接认定为不合理,进而决定哪条链是主链。
变节攻击(Posterior Corruption)
变节攻击是比简单攻击更高级一点的攻击方式,变节攻击指的是分叉链验证人通过获得旧验证人的私钥,在分叉链上加速完成区块超越的一种攻击方式。
发展较长的区块链项目,可能已经更换了好几拨验证人,旧的验证人私钥依旧可以签署以前的旧区块,分叉链验证人通过购买,行贿或者破解的方式获得旧验证人的私钥,从而签署合理的区块,来达到加速的目的。
这种方案可以通过,用密钥演进加密技术(Key-Evolving Cryptography)和移动检查点技术(Moving Checkpoint)来解决,使用KEC的方式会让签名的私钥动态生成,旧私钥签名将不在可用,这可以有效阻止旧私钥被获得的情况发生。
权益流损(Stake Bleeding)
权益流损指的是分叉链验证人通过延长主链出块时间,同时通过累计分叉链权益,以加快分叉链出块速度的攻击方式。
一般分叉链上的验证人也是原主链上的验证人,当验证人在原主链上获得出块机会时,验证人会通过各种策略来延迟出块,甚至不出块,而分叉链上往往只有少数验证人,主导分叉的验证人可以获得大量出块机会,累计的权益又能加大其出块的几率,这样一慢一块,就可以达到赶超原主链的目的了
这种攻击可以通过采用移动检查点的策略来应对 ,在指定的区块高度设定检查点,并确定检查点之前的区块交易不可变,这样可以有效防止这样的策略。
总的来说,现存提出的解决长程攻击的方案有很多,但是没有一种是可以完美解决的。长程攻击在理论上都是可证的,但是其攻击的难度也是比较大的,像第二种变节攻击,你需要找到旧的验证人,还需要从他手中获得私钥,这种难度还是可想而知的。
短距离攻击/行贿攻击(对数日到数月不等跨度的区块进行重组)
短距离攻击是相对长距离攻击而言的,短距离攻击指的是对数日到数月不等跨度的区块进行重组,从而修改部分对自己有利的区块数据,达到攻击的目的。
举一个简单的例子,A购买商家B的一个商品,用代币支付后,商家B未等待区块确认,即让A拿走商品,完成交易。此时A立即贿赂网络中的大多数节点,让他们接受修改过后的交易记录,只要贿赂成本比商品价值低,那么攻击成功。
当然,这个例子只说明了短距离攻击的可能性,但在实际中,A贿赂多个PoS节点的操作可能性很小,只要节点分布足够分散,那么贿赂将变得极其困难。另外,如果有多个PoS节点的Staking权重较大,那么A只需要贿赂大权重的节点就可以了。
商家B如果在等待安全确认后,再将商品给A,那么这种情况发生的可能性会变得小很多。51%的概率攻击才有可能重改超过多个区块安全确认以上的历史数据,这个我会在51%攻击中说述。
51%Stak攻击
51%攻击源于PoW,全称为51%的算力攻击,意思是拥有超过51%算力的矿池,拥有修改或者重写旧历史的能力。在PoS里面,因为没有了算力,所以51%代表的就是51%的币量,其成本也从电力,机器变成了币值。
同样拥有51%攻击能力的情况下,在PoS中发起51%攻击要比PoW中的51%攻击要简单一点,因为不需要进行算力计算,拥有51%权重的验证人极有可能连续出块,那么伪造一条分叉链,包含了篡改数据的区块,替代原有的主链非常容易成功。只要发起攻击的成本比获利低,那么这种攻击就有操作空间。
实际上,51%这是一个相对值,并不是说只要到了51%的币量,发起攻击就一定成功,而是说51%是相对比较容易成功的,51%被选中出块的概率已经超过了半数,所以概率会比较高。当然,理论上,20%也有可能发起类似的攻击,并获得成功,但是这种可能性更低了。
发起51%攻击的结果可能是糟糕的,对于已经持有超过51%代币的持币人来说,攻击系统,极有可能导致系统性的风险,通过这种攻击获利很有可能导致整个大盘受到打击,这样说来,这种攻击是动机是比较弱的,像是捡了芝麻丢了西瓜。
卡特尔组织攻击(Cartel Attack)
Cartel是针对BFT拜占庭容错的体系来说。现在很多共识都采用了混合共识,特别是PoS+BFT的组合,BFT给系统带来了容错,抗风险能力提高了。
只要系统中超过2/3的人是诚实的,任凭其余人怎么作恶,怎么攻击网络,网络都可以稳定的运行。现存区块链项目,往往存在着因代币分布不均或者有钱人统一收购的情况,经常在各种项目中看到大户的存在,他们俩俩成群就可以达到1/3以上的持币量,甚至有些大户自己就拥有了超过1/3的持币量。
一些验证人为了获利,往往会和较大的持币人形成联盟,以达到系统的破坏门槛,这种组织我们称作为卡特尔组织,这种组织的攻击会让系统变得招架不住,或者停止出块,或者是网络崩溃,亦或是会在出块时拒绝某些交易等,结果是惨痛的。
目前这种攻击无法解决,只能相信我们当中大部分的人是诚实的。
女巫攻击(Sybil Attack)
女巫攻击指的是攻击者通过大量生成节点,以拖慢整个网络,或者使用垃圾交易对整个网络发起攻击的方式。
这种攻击在PoS共识的公有链中比较容易发生,因为PoS共识当中不需要大量的硬件来获得算力,只需要运行节点程序就可以了,这样在PoS中就可以以非常低的成本,来创建大量的节点,完成对系统的攻击。
后来有了抵押金的方式后,这种攻击就能得到遏制。所有节点必须要拥有一定量的Stake才能获得出块机会,大量生成节点也需要大量的抵押金,这样的攻击并不会给攻击者带来很多的利益,所以女巫攻击在PoS共识中就很少存在了。
Grind Attack 粉碎攻击
粉碎攻击指的是攻击通过寻群系统选举算法偏好,使用或者联合计算资源让自己偏向被选中出块的攻击方式。更具体的解释如下:
在熵未被引入PoS的验证人选举中之前,验证人可以通过模拟选举的方式,来找出系统偏向,从而利用自己的计算能力或者联合一部分验证人的计算能力,改变系统选举偏向,这种对PoS系统的攻击叫做是Grind Attack,也叫做是粉碎攻击。
举个例子,有大户控制一组了利益相关者,他们联合一起,尝试模拟协议执行,尝试不同的利益相关者参与者序列,来找到有利于对他们的操作方式, 这就是PoS当中所谓的“磨损”漏洞,这些验证人可以使用计算资源来操纵领导者选举。
这种攻击也是通过对验证人选举操作来获利的,关于针对验证人选举的随机算法攻击,我们在下个例子中有讲到。
解决粉丝攻击的方法就是尽可能的让验证人选举算法足够随机,保护好随机数源的生成方式,不能使用固定的生成方式,只要随机数源是足够随机的,此种攻击能预计到随机偏好是无意义的。现在有很多项目都公布了自己的随机数算法,也有足够多证明其算法是无偏差,不能被操纵的。虽然宣传多有夸张,但是都有数学可证,起码预测的难度是非常大的。
随机算法的攻击
理论上,验证人的选举算法都有被攻击的可能性,选举验证人的过程比较复杂,里面综合了多方面权重,也给与了攻击者可以下手的点。比如按照权重选择验证人,或是验证人抵押金交付与否的判断逻辑,以及奖金池分配等,都会产生代码漏洞出现。
数学验证的选举算法在Cardano上有比较明确的证明过程,但是其他大部分项目都是没有对选举算法进行验证的,很多项目沿用了开源的算法,只是添加了更多不确定因素的随机源来产生选举随机数。
在第三章 PoS运行原理当中,验证人选举的方法我列了几个,大多都是比较成熟的算法,从运行开来,想要直接成功攻击这些算法,还是比较难的。不过,一般情况下,这种攻击不难被发现,就算是被发现了也不好证明,所以这种攻击几乎无法追溯。
抗审查能力(Censorship Resistance)
抗审查能力指的是区块链项目创建了价值交换网络,可以随时随地不受管制的和另外一方进行价值交换的能力,这种管制某种意义上特别指的是政府管制。
初始说的抗审查能力来源于比特币,BTC的价值交换一出来,就打破了地域和政府的管制,使得交易变得极其自由,这点在PoS共识的价值交换中,得以延续,这是广义上的抗审查能力。
但是随着区块链项目的进行,越来越多的管制开始伸向价值交换,从交易所的KYC,到区块链的可追溯数据,人们通过千丝万缕的联系将个人实体和虚拟地址关系建立了起来,于是乎,我们现在看到了狭义上的抗审查能力的出现。
狭义上的抗审查能力有两个指向
1. 在现在这种情况下,人们依然可以不受管制的进行价值交换
2. 指验证人可以不针对打包某些交易的能力受到限制
第1种上面已经阐述过,现在的解法有通过接入隐私技术,如zk-SNARK或者环形签名的方式来解决的,也有通过混币方式,混淆发起人和接收人的方式,总的来说,这些解决方法目前比较小众,还不够普及。
第2种就是针对现在的PoS验证人来说的,本质上,PoS上的验证人除了以手续费最大为优先打包交易的,超过区块大小限制则会在下个区块打包,而不应该以审查地址或者大额交易这种条件来进行打包,但是现在的验证人是有选择性的,并且可以决定不打包某些交易,大的Cartel组织可以直接拒绝某些交易,让这些交易失败。
目前也没有直接的方法解决第2种抗审查情况,大部分人诚实的情况下,肯定有诚实的验证人会打包被Cartel组织拒绝的交易。
拒绝交易攻击(Transaction Denial Attacks)
拒绝交易攻击指的是攻击者针对某一个地址发起的攻击,致使其不能参与区块链网络的价值交换。
我们知道区块链网络本质上是一个点对点的价值网络(P2P),交易一旦广播,节点的无偏差性使得交易广播实际上被阻止的成功率很低很低,成功阻止的范畴我们可以转化为51%的攻击方式,这种攻击在PoW和PoS上都存在。
所以我这里说的是在交易被广播前,发起的拒绝交易攻击。这种攻击可能出现在任何轻节点SPV,或者使用其他全节点API的广播的钱包,交易所,或者是某些服务,当你发起交易是,提供服务的工具有可能通过审查你的条件,来决定是否将你的交易广播到P2P网络中。
这种问题的解决办法是,尽可能的使用全节点服务,特别是钱包。如果一定要选择轻节点,请选择社区比较信任的全节点作为接入点。
无法同步攻击(Desynchronization Attacks)
无法同步攻击指的是P2P网络中,攻击者攻击某些节点,让其无法和其他节点一样保持同步的攻击方式。
无法同步到最新区块的全节点钱包,会出现无法转账的情况。这种攻击的发起者可能是其他节点,因为这样攻击会使得被攻击节点无法获得预期收益,而且长期处于掉线,甚至会被Slash,这样发起攻击的节点就可以获得更高的被选举概率。
这种攻击可以分为内部攻击和外部攻击,外部攻击就是典型的DDoS攻击,在区块链不断同步新区块的时候,如果你的服务器被DDoS攻击了,那么节点服务器就无法同步情况;而内部攻击就是黑客直接hack进你的服务器,做了一些不友好的事情,导致你的节点服务器无法同步。
这两种攻击预防的方案也很多,和服务器的安全架构有关系,无法彻底杜绝,但是可以提高攻击代价,比如通过购买一些防护方案提高服务器的安全级别等。