从当年 PPCoin 的 PoS 模式看 PoS 的演化

Part-1:权益证明与共识机制的未来

- Image by Marina Rudinsky-

上一篇文章介绍了 PoW(工作量证明)向 PoS(权益证明)的转型。

本文研究的是 PPCoin 系统,作为 PoS 模式的案例分析。PPCoin 系统是 PoS 模式的先驱者。从中我们可以了解到,为实现兼具弹性和安全性的区块链系统,PoS 模式必须解决的几大挑战。

PPCoin 发布于 2012 年 8 月 19 日,是第一条真正融入 PoS 模式的区块链。它虽然不是纯粹 PoS 模式的区块链,但是交替使用 PoW 和 PoS 模式生成区块(请看这个区块浏览器)。换言之,PoS 模式生成的区块可以跟在 PoW 模式生成的区块后面,反之亦然。

创建 PPCoin 的主要原因是比特币收益的递减:随着 PoW 模式下挖矿奖励的减少,矿工的挖矿积极性也会下降(除非交易费大幅提高,这是大家都不愿看到的)。由于 PoS 模式下生成区块的成本要低得多,并且,作为一种长期解决方案,相应的挖矿奖励会低得多且恒定不变,旨在将年通胀率维持在 1 %。

PPCoin 铸造新代币的方式不同于 PoW 模式。它的核心理念是在区块中纳入 币龄 消耗量证明(而不是高强度计算量证明)。换言之,如果是 90 天之前创造出的 10 单位代币(即价值为 10 的未花费交易输出(UTXO)),则总的 天数 (即币龄)为 900 。

PPCoin 是如何生成 PoS 块的

进入技术讲解环节,如引起不适,望请见谅。

如上文所述,PoS 模式下出块方式不同于比特币之类的 PoW 模式。

首先,我们发现 PoW 模式基本都采用的比特币的出块方式。PoS 模式的出块方式则不同。每生成一个 PoS 块就要花费一个旧币,消耗掉它的币龄。一个旧 只有满足下列公式才能在 time_in_seconds 生成一个 PoS 块:

其中:

  • coin(代币)指的是创建了一段时间(timeweight(coin))的 UTXO(为防止旧币的权重过大,创建天数以 90 天为上限),value(coin) 指的是 UTXO 的值。二者相乘得出 币龄
  • time_in_seconds 指的是精确到秒的当前时间。和比特币一样,PPCoin 同样要假设诚实的节点拥有同步时钟(偏差很小)。如果一个区块的时间戳晚于节点时钟的当前时间或是早于前一个区块的时间戳,节点应将其视为无效。
  • d 是可调的难度参数,旨在将 PoS 块的出块速度维持在 10 分钟。
  • prev_blocks_data 是这个公式里最有趣,也是最巧妙的参数。它的功能是防止有人预先知道满足上述公式的代币(从而获得生成 PoS 块的资格),并且对选块过程进行操控。这个参数决定了系统的公正性,换言之,从权益者中选出出块者的过程是公正的。(我们有时也会将这一过程称为 出块选举 ——权益者的获选概率应该与其持有代币的总币龄成正比,而且无法提前预知自己会于何时获选)。我们将检验一些 prev_blocks_data 的替代参数,并发现它们的问题所在。

如果满足了上述公式,代币 的所有者就可以生成一个区块,里面包括一个通过花费 代币 创造新的交易输出的 代币权益 交易,它的值略高于 value(coin) (超出每年币龄消耗量的 1/100 ,相当于 1% 的年通胀率)。

PoS 区块和 PoW 区块之间的主要差别在于 随机数(nonce) 字段。 为了生成一个 PoS 区块,区块链中的每个代币每秒都有一次机会参与选举(即符合公式)。如果成功获选,控制 该代币 的权益者可以发布一个区块。否则必须等待一秒后才能再次尝试。此处很适合强调工作量证明挖矿的两大不同之处:

  • 在 PoW 模式下,矿工持有的代币量不会影响找到合法区块的过程。
  • 更重要的是,在 PoW 模式下,为了找到一个合法的区块,矿工在硬件条件允许的情况下每秒可以进行尽可能多的尝试。在上一篇文章中,我们指出到 2018 年 6 月为止,比特币网络每秒可产出大约 3500 万兆个哈希——远远超过 PPCoin 中(每个币)每秒只能进行一次尝试。

公平的出块选举

到目前为止是不是看起来前途一片光明。接下来让我们从 prev_blocks_data 的角度更深入地研究一下这个系统。 以下是三种潜在的替代方案:

  • prev_blocks_data = 空值。如果将 prev_blocks_data 从公式中去掉,凡是关注该区块链的人都会有“预见”能力,可以找出哪个币在哪个时刻有资格发布 PoS 区块。出块过程的不可预见性荡然无存。然而,问题还不止于此——聪明的权益者会调整 UTXO ,以便尽快获得出块资格。于是,PPCoin 会成为一种昂贵的 PoW 系统,在寻找“获选潜力大的”代币的过程中消耗大量成本。

  • prev_blocks_data = 前一个区块的哈希值。在这种情况下,由于每个区块使用的 prev_blocks_data 都会变化,出现“预见”情况的可能性要小得多。然而,问题在于区块提议者可以选择区块,这样就有一个特定的代币在不久的将来有资格生成 PoS 块。这就赋予了出块选举过程很高的可操纵性。更糟糕的是,如果持有权益较多的权益者将自己的代币正确分割开来,(只需要很低的成本)就可以偷偷创建出一条很长的链,然后使用这条链发起双花攻击。为操控出块选举过程调整区块通常被称为 粉碎攻击(Grinding Attack)

  • prev_blocks_data = 前一个 PoW 区块的哈希值。这种方案理当可以缓解 粉碎攻击 的问题,因为矿工不可能放弃他们找到的合法的 PoW 区块(在 PoW 模式下,自私挖矿 可以被视为一种影响力非常有限的粉碎攻击)。这种方案也有助于抑制“预见”问题——“预见”能力只能持续到下一个 PoW 块出来之前。不过 PoS 模式的问题依然存在。经过简单的分析可知,(如果将持有的币正确分割开来)平均每生成 4⁶=4096 个区块之后,持有全网 1/4 权益的权益者就有资格生成连续 6 个 PoS 区块。对于 PoW 区块来说当然也是如此,不同之处在于潜在的攻击者会预先知道自己是否能够连续生成多个块,从而制定相应的攻击计划。(掌握的算力不足全网 1/2 的矿工)偷偷创建一条 PoW 链需要承担很大的风险,因此矿工为避免经济损失不会试图发动这类攻击。然而,在 PPCoin 的模式下,假设每 6 小时生成一个 PoW 块,如果权益者发现自己接下来有资格生成连续 6 个块,就可以实现长达 6 个块的重组。这样就可以在无成本的情况下发起隐藏链攻击。此外,如果出块率很低的话,会很难留住 PoW 矿工。如果我们提高 PoW 的出块率,所谓的 PoS 系统就名不副实了。

经过上述分析,你应该已经相信公平的权益者选举过程设计起来并不容易了吧。然而,PPCoin 不只存在这一个问题。另一个有趣的问题是 理性分叉

理性分叉

要理解这个问题,让我们重新思考一下 PoW ——如果 PoW 链上的一个矿工发现某个可以开挖的区块点(tip),在上面创建了一个区块,然后验证其有效性,她立马就能得到响应。如果区块是合法的,她会将它发布到网络上。否则她会提高 nonce 值,并再次尝试。关键在于她的计算资源在任何时候都是充分利用的。因此,如果矿工当时还知道另一个具有替代性的可挖区块点,她必须决定如何分割自己资源。她的最佳策略是将自己的资源贡献给最有可能认可她的区块的网络,如果她真的有幸找到一个区块的话。

现在让我们考虑一下 PPCoin 的情况。与 PoW 相似,权益者尝试基于已知 tip 创建了一个区块,并立即得到了回复。如果该区块是有效的,她会将它发布到网络上。反之,她必须等待整整一秒才能进行下一次尝试。在这一秒中,她的计算资源是闲置的。因此,在等待期间,如果她将计算资源贡献给了不太可能认可她的区块的链,她不会遭受损失(不过收益也不高)。具体来说,如果权益者(在相同的区块高度上)知道了两个相互竞争的区块点,她不可能老老实实地只选择其中一个创建区块。她更有可能选择同时维护两条分叉链,以便获得更多(预期)收益。

如果所有权益者都采用上述策略,那么这条链会经常出现重组,整个系统的可靠性就会大幅降低。越是缩短出块的间隔时间,这个问题就会越发严重,因此 PPCoin 的 PoS 系统无法实现扩容或是缩短确认时长。

“无利害关系”问题

上述问题还可以从另一个方面思考,即 无利害关系(Nothing-at-stake) 问题。权益者会试图另外创建一条(隐藏的)链来攻击主链。她们会不间断地试图拓展已有的链条,除非发现在某条链上连续出块的机会。因为这些尝试实际上都是零成本的,他们不会遭受损失。如果他们发现主链比隐藏的分叉链长很多,他们只需放弃这条分叉链,再从距当今更近的点上创建一条链。值得一提的是,当攻击发生的时候,他们可以同时尝试扩展主链,确保无论如何自己都不会遭受任何损失。发动这种攻击最后是会成功的,然而更糟糕的是,攻击者不承担任何成本。

PoS 系统的无利害关系问题的主要原因是出块成本“很低”,而且无需“工作量”。在 PPCoin 中,这一问题与出块的出块选举方式有直接关联。我们会在后续文章分开讨论这两个问题,及其解决之道。

上述分析基于 Iddo Bentov 等人所著论文的第二节。

去中心化的妥协?如何实现公平和激励?

要确保持有代币的权益者没有操控 PoS 块的选举流程,prev_blocks_data 选用了一种非常复杂的函数(点击此处查看详情)。PPCoin 的开发人员通过对 prev_blocks_data 的设计降低了权益者在出块选举方面的影响力。然而,这种解决方案的效果如何很难评定,在下一篇文章中,我们将讨论另一种解决方案——“低影响力函数”。

此外,PPCoin 的开发人员会通过 检查点机制 解决理性分叉(以及隐藏链攻击)的问题。 检查点会抑制权益者的隐藏链攻击——由于链的合法性实际由检查点机制决定,任何长链重组行为都将无法实现。

当然,检查点机制也存在一个问题,即作为一种中心化手段来实现系统的稳定性。此外,出块选举过程似乎很容易受到权益者的操控。

在后续文章中,我们将提出 PoS 系统设计者真正需要解决的问题:1)为出块选举赋予无法预测和无法操控的随机性以及 2)如何解决出块的低成本问题(以防 链融合隐藏链攻击 之类的短程攻击和 同步新节点 之类的长程攻击)。

另一个需要解决的问题是在 PoS 系统中,至少是在 PPCoin 的 PoS 系统中,权益者获得的收益很少,因此参与出块过程的积极性不高。由于许多权益者可能会在很长一段时间内保持离线状态,参与度会成为一个问题。

后续文章预告

在这部分,我想提一下 PoS 设计中的三大主要演进阶段。最初模仿比特币 PoW 模式的尝试过于幼稚,而且存在很多弱点。这些尝试包括 PPCoin (及后来者 Nxt 和 BlackCoin)和 Iddo Bentov 的行动证明(Proof-of-Activity)和行动链(Chains-of-Activity)。

之后的尝试将 拜占庭容错层(BFT)融入了原始的链选举规则。从某种意义上说,最长链的选举规则被一种更安全的方案替代了,即研究历史达 30 年之久的拜占庭容错共识算法,如实用拜占庭容错(PBFT) 等。拜占庭容错算法通常会满足几个数学特征,不过要依托于不必然能在实际实现中得到满足的特定假设。具体来说,BFT 链的选举规则可以减少为确保一致性而对同步通信的需求(能够极大地提升出块速度),不过是在假设只有极少数参与者没有诚实地遵守协议的前提下。

在后续的文章中,我们会详细探讨这一点,不过在 PoS 模式的设计中,激励正确的参与具有非常重要的意义。 Tendermint 和 Algorand 最先尝试将 BFT 算法融入 PoS 。

在传统 BFT 算法和现代 PoS 模型中,提议区块和确认区块是由同一个实体进行的。Casper FFG 为代表的第三代 PoS 系统将生成区块和确认区块分开。一方面不断生成区块,并通过哈希链构成一个树状的数据结构,另一方面通过 PoS 驱动的 BFT 协议将从该树中敲定一条不断生长的分支。

这种方法通过 PoW 模式下的区块生成来降低实行 PoS 模式的区块链的难度。通过将 PoS 模式融入 PoW 链的运行能够逐渐向 PoS 模式迁移。这就是以太坊计划实行 Casper FFG 的目的所在,之后会用 PoS 模式代替 PoW 模式生成区块。

阿剑按:在看 PPCoin 的运行模式描述时,我完全没意识到还可以像“理性分叉”讲的这样攻击。什么是“honest”呢?太难定义了。在 PPCoin 模式下,人们每秒可以尝试一次出块,但什么是“honest”呢?换一个出块点尝试算是恶意吗?

原文链接: https://medium.com/orbs-network/forget-eos-and-ethereum-how-much-has-proof-of-stake-evolved-since-ppcoin-93a56d734884
作者: David Yakira
翻译&校对: 闵敏 & 阿剑

本文由作者授权 EthFans 翻译及再出版。

你可能还会喜欢:

干货 | 覆写历史:概述长程攻击,Part-2:应对方法
观点 | 智能合约被忽视的一面
科普 | 如何在荒岛上利用纸笔来运作区块链

评论