共识算法(3) - PoS

PoS(Proof of Stake权益证明)相对于PoW的优点:

  1. 不需要消耗大量电力成本
  2. 发动51%攻击成本更高(PoW矿池或者大量租用矿机集中算力发动攻击,或者快速算法,硬件升级带来的算力提升等,都可能会增加攻击风险。PoS需要收购全网51%的Token,并且持有者的权益在于所持有的Token也更大动力维护系统安全)

    PoS为什么比PoW更能避免51%攻击?

PoS运行过程

  1. 质押stake,声明为验证节点(区别于全节点拥有出块的权利,会有一定的门槛,如持有stake量,占有比例,或者top n等条件,意在控制验证节点数量,缩小选举的范围以及达成bft共识的节点数)
  2. 选举 (周期性选举,以之前已出块的值作为随机种子,选取下一周期的出块节点和顺序,选举算法包含Follow-the-Satoshi选择随机stake的持有节点和RR-BFT轮询算法)
  3. 打包交易 (该论的出块节点从交易缓存池选择,通常为交易手续费高,时间早等,验证,包括签名,账户余额等。如果该论的出块节点没有出块,则跳过该论,并且惩罚)
  4. 广播交易,确认(PoS分为基于链的PoS和BFT风格的PoS。在基于链的PoS中,最长链原则,随机算法选出验证者创建新区块,但是验证者要确保该块指向最长链,通常也需要一定数量的验证节点背书签名后上链。在BFT风格的PoS中,分配给验证者相对的权力,以RR的方式提出块并且给被提出的块投票,从而决定哪个块是新块,并在每一轮选出一个新块加入区块链。在每一轮中,每一个验证者都为某一特定的块进行投票,最后所有在线和诚实的验证者都将商量被给定的块是否可以添加到区块链中,并且意见不能改变)

一文读懂 PoS 共识运行七大步骤

PoS的攻击风险

比较突出的是Nothing-at-stake(无利害关系)和Long-range-atack(长程攻击)两种

  1. 无利害关系 Nothing-at-stake

    Nothing At Stake, a situation where someone loses nothing when behaving badly, but stands to gain everything. 在出现多条区块链相互竞争的情况下,会激励验证者在每条链上都创造区块,以确保利益最大化。因为PoS创造新区块基本上无需成本,只受持有的资产(token)影响,这样使得双花攻击更加容易,而PoW则受算力影响,分散算力反而降低收益期望值,即经济学意义上的机会成本。这个可以一个例子说明。

    如下图所示,仍然是 A、B、C 三个出块节点,假如 A是攻击节点,它在产生分叉时创造两笔交易。一笔将X个币发给自己的一个钱包地址,同时在另外一个分叉上将X个币发到交易所。B、C出块节点因 Nothing At Stake 所以同时会在两条分叉链上出块。当交易被交易所确认后, A 将 X 个币出售兑换成隐私币种,移出交易所。之后 A 通过增加质押币量,或创建多个其他出块节点的方式提升出块权重,只在分叉链继续出块。此时最长链很明显,且逐渐拉开差距,会最终成为最长链,A 成功将 X 个币双花。

    摘自 :PoS背后的Nothing At Stake与Long-Range Attack

    解决方案 : 无成本攻击则引入惩罚机制。验证节点提前抵押一定的stake做为保证金,如果发现验证节点“在多条链上同时出块” 或者 “在错误的链上出块”,立即惩罚扣除一定保证金。只要保证金设置合理,使“双挖”的收益期望值降低,可以从经济学意义上消除这个风险。

  2. 长程攻击 Long-range-atack

    恶意节点从很早以前的甚至是创世块开始重新建造一条链,目的来代替正常运行的主链。由于PoS创建区块的成本极小,新链的构造速度可以很快,赶上主链的高度。如果不考虑timestamp,那么恶意节点可以超前当前时刻,创造大量的未来区块时间,从而增加链高度代替正常链。这种情况加上timestamp即可避免。

    考虑timestamp的主要有两种形态,一种是Posterior Corruption。譬如如果当前区块高度为X,想从之前的区块K开始分支。那么从K到X之间所有的区块的签发者联合起来(或者通过贿赂,盗窃秘钥等方式),将质押的stake全部撤回,然后创建从K开始创建新链(没有质押就不存在签发X之后的新的区块,但是可以签发之前的,而且避开了双签的惩罚措施),此时创建的新链长度就赶上甚至替代正常链。Casper通过“检查点”(checkpoint)机制来应对这种方案。取消抵押保证金有一个“解冻”时期。同时限制区块分叉上限,节点拒绝回滚比保证金被锁定时间更久的区块,特定的上限区块称之为“检查点”,这样这些撤回的stake在可以用来重签时已经过了检查点。(要理解这段需要了解节点随机选举过程的Follow-the-Satoshi算法,选择随机stake的持有节点)。另外也有研究KEC(Key-Evolving Cryptography)即秘钥签发一次即失效的方案防止二次签发。还有的方案是在交易时也带上前任区块的hash值,这样通过检查交易的这个值,可以避免链的中途恶意分叉。

    另一种方式是Stake Bleeding。如图,恶意节点M在正常链选择在M的出块时刻不出块,即Liveness Denial attack,则该轮被跳过,链高度不变,M被惩罚,逐渐的演变下去stake减少,出块机会减少。而在恶意链,M在其时刻出块,其他的则不可能出块,导致M的出块机会增加,演变到最后只有其出块。随着时间的推移会赶上主链。但是研究表明,拥有30%stake的攻击者也需要6年才能实现,现实可行性比较低。

    长程攻击通常与Weak Subjectivity(弱主观性)相关联。区块链网络中的新节点或是长期离线的节点加入到网络中时,会收到当前区块链上所有公开的分支,但是节点并不能分辨出哪些分支是从属于主链的(PoS里最长链原则并不足够,因为PoS里创建区块成本极小,可能存在多条等长链,这与PoW是区别的)。因此,在PoS里,新节点要求验证链外最新状态来解决,节点可以通过询问他们的朋友、区块浏览器等进行区块同步,离线的节点要求在“还原上限”时间内至少要登录同步一次。在线节点因为一直与主链同步,则不存在这个风险。

    Rewriting History: A Brief Introduction to Long Range Attacks