查看原文
其他

PoS 是谎言么|Fork It 文字稿(2)

Fork It 字节元 CKB 2023-04-19


接上文:PoS 是谎言么|Fork It 文字稿(1)



3、安全性


Terry:我觉得从不可能三角这个方向去聊是非常合适的。


我现在看到 PoS 一个比较常见的说法,就是它在安全性上是更安全的。如果这一点比不过的话,他们就会指出在同样成本的情况下 PoS 更安全。在抗审查方面,我觉得是 PoS 比较明显的劣势,但在这个时候他们通常又会一起比烂,说在抗审查性上 PoW 也好不到哪去。在去中心化上,他们最早的时候说 PoS 不会有矿池,不会有 stake,但是后来发现这完全是一个非常专业的事情,一定会有 stake。


你能不能整体地从这三个维度去分析一下现在普遍的看法,以及你对他们这些错误看法的评价。


阿剑:我可能要请 Fork It 的观众对我有点耐心,因为我会讲得非常长。上面我已经说过,在我自己接触到的所有关于 PoS 更优的论证当中,都包含着大量缺失性比较,或者选择性比较。


我可以先把结论摆在这里:在任何一个维度上,都无法论证 PoS 比 PoW 更优。 我为这句话负责。


首先我们来说安全性。对 PoS 现有的安全性研究基本上都会提到一个很基础的攻击:Stake Grinding Attack,权益研磨攻击或者理性分叉。


PoS 不是采用 PoW 这种竞争方式来比较谁足够幸运、足够快,来提出下一个区块的工作量证明机制,不是比拼谁更快找出一个符合难度要求的随机数。PoS 的一种出块方式是根据时间,把一段时间分成比如 12 段、36 段,每一段安排一个出块者。


另外一种方式,比如最早的 PPCoin 点点币,它的方式就是每个人都拥有一个 UTXO,每个 UTXO 有一个面值,以及没有被花费的时长,这就叫币龄 Coin age。两个因素决定了你能不能用 UTXO 成为下一个区块的出块者。中间还是需要做一些计算,但是最有意思的点在于,PoW 的出块属性是无过程性的,Progress Free。什么意思呢?就是假设现在出了这个块,不管如何调整这个块的哈希值,不论试多少次,它都不会影响挖出下一个块的概率。下一个块的出块者,还是要经历大量的计算。影响当前这个区块的哈希值,对下一个区块的区块难度实际上没有任何帮助。


但是在 PoS 里,大家都要使用以往历史的区块来作为随机数源头,也就用一个随机数的源头来生产出一个随机数,用这个随机数来决定下一个块是由谁出,或者下十个块分别由谁出,它就损失了无过程性的特点。


这意味着什么?意味着当前谁挖出了这个区块,挖出了这个区块数据上的特征,就可以决定接下来一个块甚至十个块的出块者。


那么大家会做一个事情是什么?是虽然我在这个时间点,比如本来这十秒钟之内只能有一块,但其实我自己在偷偷挖,已经算了 100 个区块,我就看哪个区块能够让我在下一个区块依然是出块者,或者是找哪一个区块,能够最大化我在接下来链条当中出块的机会,这就叫做权益研磨攻击。它会不断尝试在任何一个区块点位上挖矿,并且试图干预未来出块者的选择。


权益研磨攻击在当时非常普遍,而且非常致命。因为虽然我们看到这个时间点,好像网络上只出现一个区块,但实际上大家已经偷偷挖了几百个几千个区块。就等他自己挖出来一条超级长的链,然后等到了某一瞬间啪的一下摆出来给你,大家因为最长链共识啪的一下就跳过去了。


但是最长链共识是稳定的吗?它也不稳定,接下来又会有人啪的一下给你一条更长的链。这是当时出现的权益研磨攻击,后来大家把它归结为一个属性叫 Nothing at Stake,权益无关或者说无利害关系。什么意思呢?就是虽然你只安排我在点出块,但是我偷偷在挖 N 个块,这对我的利益不会有任何影响,它只有好处没有任何的坏处。


权益研磨攻击直接导致了后来的 PoS 机制几乎都引入了惩罚机制。大家已经发现这种基于奖励的,随意出块的方式并不工作,那么就需要用惩罚机制来约束,让大家不去做理性分叉。它的逻辑是什么呢?就是当人们已经提出了一个区块,如果被发现在另外一条链上也提出了这个区块的话,就需要受到惩罚,以此来约束不去挖分叉链,确保只挖一条链。这个原理基本上贯穿了从 2014 年开始后续的所有 PoS 链的设计。


但是我们会发现其实这个问题没有那么简单,因为我们刚刚讲的惩罚机制好像只是单向的在通向未来的维度上,避免大家大量地去挖分叉链,能够把大家约束在一条链上去,直直地往前出块。这意味着没有问题了吗?不是的。因为一条链它不仅有通向未来的维度,它还有历史的维度,甚至我们认为历史的维度才是更重要的。


为什么?因为如果链的历史可以被随意篡改,那么它如何去担当账本的角色,如何去担当大家的基础交易系统,并且在上面构建各种各样的应用功能?这才是我认为更加关键的要素,如果区块链能够形成一个不可篡改的账本,一个不可篡改的历史,那么我才可以什么都不怕。对于一个普通用户来说,我绝不担心我的钱会丢失,因为所有的历史几乎都是可靠的。而私钥、数字签名这些密码学方案给了我迄今为止可以媲美其他任何财产系统,甚至比他们更优的一种财产属性。


接下来大家就会发现另外一种情况叫做长程攻击,Long Range Attack。 长程攻击的意思是说,虽然好像可以让大家在一条链上出块了,但是这并没有解决问题,为什么?因为我可以从创始状态中挖出另外一条链出来,这条链不一定更长,但重点是我们没有任何形式上有效的方法去对比这一条新挖出来的链,跟历史上大家一直在用的链到底有什么差别。


这是最关键的属性,为什么呢?比如我作为一个普通的 PoS 链用户,当我的节点同步上一条链的时候,我实际上并不知道这条链是不是大家一贯以来,通过 PoS 共识参与的一条链,我也不知道它是不是一些人另外挖出来的。有人说我们可以观察签名,因为每个区块都带有 PoS 参与者的签名。


但这里刚好又可以跟另外一个东西联系起来,大家发现一个很有趣的事情,所有的 PoS 验证者都需要把币锁进去,但锁闭进去是为了什么呢?是为了赚钱对吧?赚了钱就总要有一天要把它拿出来花,总是会解锁。如果不能解锁,它就变成一个单向的过程,没有人会愿意参与这样的算法,因为这意味着完全没有任何好处。


验证者的币会有一个释放的时间点,一旦在释放时间点之后,这个链所有在共识层面设置的惩罚对你来说不再有任何意义。因为我的钱已经取出来了,你们惩罚我什么呢?我的钱已经取出来了,这个时候就没有办法对我施加任何惩罚了。前面说的那种通过惩罚来使得一个人只在一条链上出块签名,这件事情本身就不成立了。


这就是长程攻击跟人们以前发现的一种特殊攻击的形式,叫做旧私钥攻击相结合的过程。就是一旦 PoS 参与者离开了共识层的约束范围之后,你对他的私钥行为实际上就没办法有任何约束。那么这个时候有人完完全全就可以去购买一些旧私钥,购买旧私钥可能是非常便宜的,因为只是购买一个私钥而已,并不需要财产。


有了旧私钥之后,我们就可以伪造跟以前的链一模一样的链条,所有的交易都可以重播一遍,所有的签名都可以重新放上去一遍。那么到底哪一条链是真实的呢?在这种长程攻击的情况之下,我们会发现现有的所有 PoS 算法都不能从技术上解决这个问题,包括以太坊。


以太坊的 Casper 算法经历过了很多演进,它最核心的概念是基于惩罚约束,来使得人们在同一条链上出块,确保会定期的达成共识。以太坊基于惩罚算法的这一整个概念上,其设计的复杂和精巧程度,应该被列为当前 PoS 机制的第一名。非常的精巧,而且把它基于惩罚的概念发挥得淋漓尽致。


比如说如果有人提出两个互相冲突的区块,那么就要受到惩罚;比如说 Casper 投票,它不是对出块的投票,而是对以往历史区块检查点的投票。检查点就相当于大家要定期刷新它的创始状态。原本的创世状态可能是零号区块链,现在过了 100 号区块之后,大家有 2/3 的同意票,那么大家就把 100 号区块变成一个新的所有状态建构的起始点,那么 100 号区块它就变成了一个新的创始区块。


Casper 惩罚的机制是,但凡出现了一些在检查点投票当中的不轨行为,包括双重投票和环绕投票,具体来说就是你会不会投两个相互竞争的检查点,以及在投票检查点的时候,有没有跳到另外一条分叉点上去,比如一开始投的检查点是在 A 链,但是后面的一个检查点居然跳到 B 链上去了,这就说明是有问题的。


还有一个更加有趣的惩罚是什么呢?是当整条链没有办法达成共识的时候,它会惩罚所有参与者。注意是所有参与者,不只是那些不在线的参与者,而是惩罚所有的参与者。如果大家懂博弈论的话,可以想一想为什么要阻止这些不在线的参与者,通过不转发其他人的区块和签名来陷害其他人?


本身共识算法对不在线参与者的惩罚是比较严重的。在不在线是通过某个时间段出现你的签名去证实的,如果没有任何惩罚,那么我就可以通过不转发你们签名,长期让这条链处在一个没有办法确认共识的状态,一方面罚没了对方,一方面让自己的权重变高。为了阻止这样的情况发生,就会对这样的行为施加惩罚,然后用这种惩罚不断淘汰掉那些不在线的参与者,让他们重新同步。但是就算把这些所有的全加起来,还是没有办法应对我们所谓的长程攻击和旧私钥攻击。


为什么?因为所有参与者总有一天会退出这个系统,退出这个系统之后,旧私钥攻击就变成一个 incentive 上,就是激励机制上可行的一种攻击。只是买一个旧私钥而已,就可以制造出一条超长的链。


这个属性已经得到大家非常充分的讨论,市面上有很多相关的资料。有一篇非常重要的文献,它的原始版本在 2014 年就出版了,后来作者在 2015 年又重新修改了这篇论文,名字叫做 On Stake and Consensus,《论权益与共识》。这篇文章非常重要,它把所有我上面谈到这些攻击都做了总结。最终得到一个结论是:这种长程攻击实际上代表着对 PoS 攻击的最终形式,而且是可以叠加的。


比如说,我还听过有一位朋友提出过一种非常有意思的攻击,叫做散币。就是搭配长程攻击的同时,给这些人空投,让这些人来支持我的链,而不是原链。比如我现在要分叉以太坊,我不仅让你们原本有这么多币,而且还要给你们多发一点币。在这个过程中甚至可以搭配一些其他社会共识上的攻击,比如发动宣传战,和别人说以太坊基金会那帮人把我们的链搞崩了,他们不行,所以我们要革命,罚掉他们的币给大家分钱,我们的币没有任何通胀,它在市面上依然是价值坚挺的,但是我们惩罚了坏人。


我记得前几年,包括 Jan 也提过 PoS 的整个模型有点像衔尾蛇,就是咬着自己尾巴的蛇。你的账本要安全,那么共识机制必须要安全,但是想要共识机制必须安全的话,那么账本又必须安全,所以构成了一个衔尾蛇。


论权益与共识的作者也得出同样的结论,为什么权益证明的共识机制是不安全的?因为它要依赖自己想要形成的账本来施加它的成长。大家可以跳到另外一个账本上去,发动长程攻击分叉这条链。在这条分叉链上,原链所有的惩罚措施都不奏效。在这种情况之下,怎么能说你的共识机制是安全的呢?所以大家把它归结为一种循环论证:账本需要安全,就需要共识算法是安全的,共识算法是安全的,又要求你的账本是安全的。


注意我这里用了两个「安全」,假设这两个安全在定义上完全一样,这意味着什么?意味着它就是个循环论证。但是实际上现在的以太坊 PoS 算法,包括 Vitalik 本人都认为这不是一个循环论证,为什么?因为这一句话当中前后两个「安全」的定义是不一样的,他认为后一个账本必须安全的定义,跟共识算法必须安全的定义是不一样的。他认为这个账本要安全,是基于所谓的社会共识,是一个社会过程,这个社会共识决定了我们都认可这一条链就是以太坊。所以基于这一点,我们再在这个基础之上形成一个以太坊 PoS 共识参与的流程,进一步决定接下来这条链是处理哪些交易。


但是他没有办法否认的是,所有人如果不是一直在同步这条链,不是整个流程从它创始块开始一直在同步这条区块链的话,那么确确实实没有办法分辨一段时间以前,两条同样形式上相同的链,到底哪一条链是真正的以太坊。这是技术上没有办法做到,没有办法达成共识的。


所以他提出了弱主观性概念,就是节点必须保证每四个月时间上线一次,一旦超过四个月时间掉线,就要向一个你信任的,注意,是你信任的节点来给你同步。也就是说不管是跟谁同步,四个月以前断掉的这条链,在事实上都是需要相信这个给你提供区块链数据的节点,这个就是弱主观性。


它没有办法达到像 PoW 一样的客观性, PoW 上压根不必信任任何提供区块链数据的节点,为什么?因为我可以独立地从创世块开始验证,而且是轻量级的验证到最新的区块,谁想骗我都没有用。PoW 整个通过竞争的共识模型,使得大家最终只会凝聚在一条链上,这是 PoW 在安全性上的证明。


但是在 PoS 链的整个共识算法运作当中是做不到的,最终得依赖于社会共识,依赖所谓的信任。只要长期掉线,那么就会受困于弱主观性,必须信任一个向你提供区块链数据的节点。这一点为什么重要?因为它意味着共识是会不断衰弱的,最终来说大家的信息源会中心化地趋向于那些长时间以来都没有掉线的人。


而 PoW 会不断地累积共识,大家会把工作量不断地累积到同一条链上,所有加入的节点都不需要信任其他人。他们只需要用计算机把所有的数据都验证一遍,验证它形式上的有效性,就能够断定这是一条有效链。所以 PoW 在社会共识上是一个不断累加、不断凝聚的过程。


这两者到底意味着什么?我觉得大家可以仔细想一想,我们想要区块链来解决什么问题?我们是不是仅仅需要一个大家经常去检修的机器,还是希望找到一个最基础的原则,在最基础的原则之上,区块链可以当成一个全时无休的处理系统,持续出块来向我们提供最基本的服务,在这个过程当中持续的凝聚共识。我们希望区块链做的是这一点。


所以 PoS 在安全性上和 PoW 根本就没有办法比,我最痛恨的也是最常见流传的一个谎言,就是 Vitalik 自己提出的一种论证说为什么 PoW 不安全,因为只要租 51% 的算力,就能发动 51% 攻击。但是攻击 PoS 需要买下 51% 的币,或者买下 51% PoS 参与者手上的押金。


这不是赤裸裸的缺失性比较吗?这是在比较什么?比较的是对 PoW 发动一个短暂的,比如几小时或几十个区块的临时性审查,跟永久摧毁一条 PoS 链的成本。这明显比较的就是两种不同的事情。


如果只是租用 51% 的矿机,相当于只能临时发动一个审查攻击,或者短暂的发动双花攻击。那么我们要问的是接下来呢?


首先能租到 51% 的算力这一点在现实中是不成立的。我们可以看到一个 51% 攻击成本的网站 2,显示了租用 51% 矿机到底需要多少成本,几千美元到几万美元都有。如果攻击成本真的这么便宜,为什么没有人这么做呢?因为他还有很多不可克服的困难,比如说网络实现的困难等等。


假设真的能租,那么攻击的结果是什么?大家经历过几个小时的混乱,然后结束了。PoW 最长链共识会推进大家继续凝聚在同一条链上。PoW 系统没有被崩溃,没有完全被毁灭。除非能够保证自己永续地掌握 51% 的矿机,否则就没有办法永续的发动 51% 攻击。这是一个很明显的道理。


如果你真的买下了 PoS 51% 的权益,你能怎么做?答案是可以为所欲为。因为如果占据了 51% 的权益,那么就可以完完全全统治出块这个过程。同时也意味着那些想要参与 PoS 流程的新人,也必须得到你的同意。因为他们必须通过一笔交易来把自己的押金锁到系统当中,如果他不能把资金锁到系统当中,就没有办法成为一个 staker,就没有办法参与出块,他的签名是无效的、没有意义的。只要你能掌握 PoS 51% 的权益,就可以永续地摧毁一条 PoS 链。


有人就会说了,我们不是还有社会共识吗?如果出现这种情况,我们罚他就好了。这是一个很荒谬说法,且不说这是一个缺失性比较,如果要在这个层面上比较,并不能比较出 PoS 比 PoW 更优。其次是如果你真的认为这是一种可行的方案,这就显得很可笑。因为我们需要的是一个全天候 7×24 小时无休的系统,但这个系统居然需要全民参与,并且经常要检查它有没有出问题。而且真出问题的时候,你确定能凝聚出这么多社会共识来惩罚它吗?还是说从共识机制的角度上来看,这种社会共识是可以被利用的一个方式?


因为但凡如果有人通过宣传战,让人相信我们现在有一个共识,我们想要罚一帮人,那帮人就会被罚的话,你想想作为一个 PoS 共识链的参与者和用户有没有安全感?这意味着你资产的安全完完全全受制于那一个虚无缥缈的社会共识,没有机制可以保护你。而且重点是每个人发动社会共识的能力是不一样的,这是一个很显然事实。 你是不是就要让自己的资产安全置于那一小撮人的意志之下?那一小撮人能够发动社会共识,就意味着他们随时可以攻击你的财产,这是一个你想要的系统吗?这是一个你想要的把自己的资产放在里面的系统吗?这是个非常荒诞非常可笑的说法。


(未完待续)


本文提到的部分链接:

  • Stake Grinding attacks 权益研磨攻击:https://dyor-crypto.fandom.com/wiki/Grinding_Attack
  • Nothing at stake attacks:https://medium.com/coinmonks/understanding-proof-of-stake-the-nothing-at-stake-theory-1f0d71bc027
  • Long range attacks:https://blog.positive.com/rewriting-history-a-brief-introduction-to-long-range-attacks-54e473acdba9
  • Poelstra:论权益与共识
    • 英文:https://download.wpsoftware.net/bitcoin/pos.pdf
    • 中文:https://www.btcstudy.org/2021/09/23/on-stake-and-consensus-by-Andrew-Poelstra/
  • PoS的根本缺陷在于循环论证:https://www.bitpush.news/articles/2460124
  • social consensus:https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51
  • Weak Subjectivity 弱主观性:https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/weak-subjectivity/



   



END



Nervos 网址:https://www.nervos.org/ 
中文电报群:https://t.me/NervosNetworkcn
中文推特:https://twitter.com/CKBMeta 
中文Discord:https://discord.gg/f2qa52tJnz 
《Nervos 入门手册》:ckborg.bit.host

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存