PoS共识协议

算法介绍

Posted by Emo on May 4, 2022

共识算法

EMO’s Blog

Proof of Stake

尽管一部分人认为PoW带来的资源消耗是在保障区块链安全上具有重大意义的,但是更多的人则力求寻找一种更加绿色高效的共识机制,于是Proof of Stake便被提出了。倡导利用代币的质押方式解决公链中松散的身份认证带来的女巫问题。解决女巫问题的核心便是将区块链中的权利与账户之间的关联性弱化。PoW中利用算力构建的竞争体系,其实就是将权力与算力绑定,提高了有效身份的门槛来天然的防止女巫攻击。PoS则提倡通过代币质押的方式,也就是将权力与代币绑定,来防止女巫攻击。在这里我们也可以看出,PoW算是一种将权力与物理资源绑定的方式,因为算力其实映射到现实就是矿机,cpu,显卡等物理资源。这种方式在与加密算法结合后,其实天然的具备了一定的防作弊优势,所以他构建的竞争机制的过程可以完全离线进行。但是PoS这一类则是完全将权力与虚拟资源绑定,我们比较难去完全基于此构建一个安全的离线竞争机制。所以PoS其实只是提出了一种倡议,但还不算是一个完备的共识协议。

PoS存在的难点

  • 身份确认:无可信身份的环境下需要身份产于共识
  • 出块节点:如何采用非算力竞争的方式确定出块节点
  • 节点在线:确定节点后如何保证节点在线
  • 分叉攻击:出块节点不需要工作量证明如何防止快速制造分叉
  • 长程攻击:购买历史上的资产账户,然后从历史上的一个节点开始进行攻击。

主流的PoS变种

PoW+PoS (PpCoin)

PoW中的难度所有节点都是相同的,为了提高自己的收益就会不断地去提高自己的算力,虽然系统的安全性一定程度随着算力的提升变大了,但是消耗的资源也更大了。PoW+PoS这种方式,其实就是引入PoS的思想去给了提高收益提供了一条新的门,依旧沿用PoW的算力竞争机制,但是引入燃烧币龄的概念去控制降低算力的难度。这样给纯粹的PoS提供了一种竞争的方式,由给竞争种引入了更多变量,使得人们可以通过提高自己的持币量来提高自己的收益。同时区块链的安全性也是由算力财力共同保证,大家也不需要通过大量的消耗算力来保证自身的收益和系统的安全。防止马太效应,也就是强者越强的现象,提供了燃烧币龄的机制。也就是说,一个节点的竞争力是由(算力+持币量*持币时间)来决定的,但是每一次竞争成功后,持币时间会清零。打包区块的时候,会加入一个将所有币转账给自己的交易,方便认证身份和清零持币时间。

  • 身份确认:由链上记录余额来提供
  • 出块节点:PoW提供
  • 节点在线:出块和获取出块节点是同步的,不需要考虑这个问题
  • 分叉攻击:中心校验机制
  • 长程攻击:checkpoint

DPoS+BFT (EOS, BSC)

用户可以将资产质押给其他节点,获得最高质押的多个节点集合成为委员会,委员会内部通过传统的BFT算法达成共识。

  • 身份确认:由链上记录的账户质押来提供
  • 出块节点:委员会内部轮流担任
  • 节点在线:节点质押代币,离线会受到经济惩罚
  • 分叉攻击:BFT共识防止分叉
  • 长程攻击:分布式共识保证一致性

存在的问题:

  • 委员会的位置是相对暴露的,出块节点一定程度上是可预测的,容易被定点攻击。
  • 一定程度上牺牲了去中心化的程度,因为委员会可以一定程度上控制整个区块链,而且即使委员会成员作恶,受到惩罚后,损失很大一部分也是由下游质押代币的节点承担。
  • 出块奖励是由委员会成员分发给支持他的选民的,所以可能出现贿赂的情况。

Rand+PoS+BFT (Algorand, PlatON)

如何生成一个安全的随机数,已知计算机系统中的随机数是伪随机的,只要掌握种子就可以控制随机数的生成。

VRF & Sortution可验证随机函数

PoS vs. PoW

身份验证

  • PoW和PoS都解决了身份验证的问题,防止女巫攻击
  • PoW种攻击者无法伪造算力,PoS种攻击者无法伪造资产

共识机制

  • PoW协议产生的区块不需要保证一致性,允许分叉的存在,通常依靠最大难度子链或者最大难度子树的方式确定主链。
  • PoS中由于节点出块不需要算力消耗,可以快速制造分叉链,因此需要能保证每个产生的区块都达成一致性,通常使用BFT共识去实现。

节点在线

  • PoW中,共识的过程是伴随着新区块的产生,不存在出块节点在线的问题。
  • PoS中,先决定出出块节点再产生新的区块,可能选出的节点主动/被动放弃出块,因此通常采用经济惩罚的手段避免选出的节点放弃出块。

贿赂攻击

  • PoW中,攻击者可以通过租赁算力的方式来发起51%攻击。
  • PoS中,攻击者可以购买历史上的大额账户(现在已经花光)发起分叉攻击。

{ % if page.mermaid % } { % endif % }