共识机制是区块链的灵魂。就像一个国家的法律,维系着区块链世界的正常运作。区块链最早的共识是工作量证明(POW),比特币和以太坊都是采用的工作量证明。现在流行的一个趋势是权益证明(POS)。以太坊2.0就会采用 POS 共识,还有最新的公链如 Tezos,Polkadot,Algorand 等等。权益证明还包括委托权益证明(DPOS),代表公链有EOS。大多其他公链采用的共识都是从 POW 或者 POS 中衍生出来。我们暂时把联盟链共识不放到讨论范畴中,从 POW 到 POS,来研究一下区块链共识的发展。
区块链共识的目的是决定出块权。工作量证明的基本思想就是用算力来决定出块权。如果你能第一个解出 POW 的计算难题,你就可以出块。在每一个时间点,大家都在算题,然后在差不多的时间里,大家把题算出来,再把计算结果发布出去。这其实就是一个投票的过程。发布的块就是投的票。最后被选中的票,就是来自于那个最快算出结果的矿机。至于没有发布块的节点,相当于弃权了。工作量证明的一个最大优点,就是所投的票和投票权是绑定的。而且一旦投票成功以后,即使是投票者本人也修改不了投票的内容。因为一般在出块前,节点就已经打包好一个块,然后才对这个块做工作量证明,做完后马上投出去。这个时候打包的块已经没有办法修改了。
矿机跑一天可以投出很多票,但是不可以把所有的算力集中到一个块上;另一方面,如果想要回滚掉自己出的块,也必须付出和回滚别人的块时所需的同等的算力。这是不可能的,所以 POW 共识是非常安全的。
基于POW机制去做共识算法的最主要缺点就是延迟比较高,因为我们把交易打包到区块以后,还要完成一个工作量证明,这个区块才能称为候选区块。工作量证明的时间还不能设得特别短,否则容易分叉。于是,至少从打包好区块到做完区块的工作量证明这一段时间内,交易是能被确认的。
工作量证明的时间为什么不能设置太短?因为在网络条件一定的情况下,广播速度是有限制的。如果出块速度设置得比广播速度快,使得节点在收到别人新出的块之前,自己就挖到了,这样就会出现分叉。如果这个差距比较大的话,分叉就会特别多。分叉多会降低安全性。我们说对比特币的攻击需要51%的算力。这个前提是大家都集中在同一条链上。好人有49%,坏人要有51%就能攻击。但如果真的出现频繁分叉的情况,比如说我在分叉A上有30%的算力,在分叉B上有40%的算力。这个时候坏人想把分叉B给回滚改到分叉A,只需要11%算力就可以。只要比全世界的诚实的算力最多的两个分叉之间的差稍微多一点,攻击者就可以让最长链在这两个上面分支上跳来跳去。大大降低安全性。
POW 机制另一个被人诟病的点就是能耗特别高,不环保。因为哈希运算耗电。所以,要想让区块链支持大规模的商用,POW 需要改变。所以,就有了 POS。
权益证明基本的思想是:把持有的币做质押,来获取记账权和投票权。投票权和持币的数量是成正比的,一币一票。钱越多,投票的权力就越大。
跟 POW 不知道有多少矿机参与挖矿不同,POS 协议必须知道所有共识参与者的数量和它们的持币量,然后去分配打包权和投票权。另外在 POW 里面,打包权和投票权是一起的,但是在 POS 里,这两者是可以分开的。分配完打包权以后,拿到打包权的人就有资格出一个候选区块。这个区块里面包含要处理的交易,并且有他自己的签名。候选区块并不意味着就会被马上加入共识,在广播候选区块以后还需要由那些有投票权的人去投票。如果能得到多数票的支持,候选区块就会最终被加入共识,变成一个有效的区块。当然投票的过程我们可以用很多方式执行,比较常见的就是用少数服从多数的共识算法。因为现在我们知道一共有多少人有资格投票、一共有多少票,所以用这个共识算法我们很容易算出来多数,比如超过1/2或者2/3。
在去中心化机制中,我们需要选举谁负责打包,谁负责投票。有时候为了效率,大家会先选出一个比较小的委员会,然后由他们负责投票。这样的委员会通常是随机选取的,而且为了公平性还要经常轮换。或者还可以用代理权益证明的 DPOS 机制,选取相对固定的委员会负责打包和投票。这样虽然损失一些去中心化程度,但是可以大大提高效率。
在 POS 系统中,如果检测到有参与者违反了 POS 共识的协议,比如一票多投,或者放弃投票,就可以对他们做出一些惩罚。凡是对系统的安全性造成影响的行为都应该收到惩罚。
相对 POW,权益证明有哪些优点呢。
第一个优点:矿工和持币者的动机是一致的。POS 的矿工都必须持币,在整个的生态环境里减少了一个不持币单靠机器来挖矿的角色。在 POW 的社区中,持币者、开发者、以及矿工三方的利益不是完全一致的,经常会有冲突。到了POS 中,至少矿工和有钱人的利益更为一致了。在一定程度上冲突和分歧就减少了。
第二个优点:POS 的延迟可以做得非常低,确认可以非常快。在 POS 系统里,拿到一个交易就可以马上打包,打包以后就可以广播,这个时间是不需要等待的,不像 POW,必须等至少做一次哈希运算的时间。实际上,POS 共识的延迟主要是受限于网络和参与投票的人数。网络越慢,投票的人越多,等待的时间也就越久。
第三个优点:POS 比较环保,因为它不需要用算力做工作量证明。投票实际上就是做个签名,最多再做一些简单的运算,比求解 POW 难题容易多了。所以 POS 节点硬件成本很小,也不耗电。
但是,POS 也有自己的问题。
第一个就是通讯复杂度跟投票的人数相关,而且通常是平方的关系。参与投票的人数越多,通讯越复杂,达成共识需要的时间就越久。不过,现在通过RBFT,BLS签名等技术,可以大大减少投票数量。这个问题基本上算是得到了很好的解决。
还有一个比较本质的问题,就是投票权的决定时间是早于生成候选区块的。POW 是先打包,再投票,最后决定出块权。投出的票就不能改了。在 POS 里,决定投票权和行使投票权是分离的,没有绑定在一起。有区块以前,我们就知道谁有投票权了。所以拿到投票权以后,我可以随便地去投,这就意味着我可以选择的策略空间更大,整个博弈会变得更复杂。通常来说,策略空间大对于安全性是不好的,因为给攻击者留出了更大的操作空间。攻击者如果操作空间大,能干的事儿就很多,想保证安全性也会变得更难。越复杂的系统的安全性越难保证,一方面是分析证明起来会更困难,另一方面是攻击者也更容易在复杂的系统里找到漏洞。所以在 POS 系统里面,有很多种攻击方式,比如无利害攻击、长程攻击等。
再来简单介绍几个有名的POS共识,主要了解他们的基本原理和各自的差异。
这是跨链平台 Cosmos 采用的共识。可以做为了解 POS 的入门共识。Tendermint 每次由不固定的节点发布新块,然后通过 PBFT 的方式让其他所有节点对区块进行投票验证。超过2/3的赞同票就通过,而且是对区块的终极确认,不像 POW 还要等好几个块。但缺点就是,如果投票通不过,就要一直等着。详情还可以看我早期写的一篇简书博客:https://www.jianshu.com/p/52932431de06
波卡也是一个跨链的平台,它的中继链采用的是 Nominated Proof of Stake,既 “提名权益证明”。参与者通过质押成为提名人,然后从提名人里选举出验证者,验证者再负责出块。验证者的数量可以控制,民主集中,这样效率会高很多。NPOS 跟 DPOS 很像,都是选出少数被选中节点出块,但是 DPOS 选出来的都是大财阀,需要做大量质押。NPOS 更民主,草根更容易参政,而且验证者轮换也更频繁。
前面提到,POS 共识的一个本质问题就是出块权由大家投票决定的,所以在出块前大家就知道谁是出块节点,这样容易被攻击;而出块节点也可以选择各种打包策略将自己的利益最大化。那如果有一种机制,可以随机的产生一个节点,这个随机性是不可以被轻易预测到,但可以是大家很容易验证的,那就可以采用这样的方式来选举出块节点了。Algorand 就找到了这样一个产生随机节点的方式。这种方法其实就跟 POW 的方式很接近了。大家都可以打包提交候选区块,但最后不是看谁最快算出题,而是通过一个真随机数,选出唯一的下一个出块。
Casper是以太坊 2.0 将要采用的共识方式,Casper有了权益质押,有了投票机制,但现在还是一个 POW 和 POS 的混合体,将来要慢慢发展成一个完全的 POS 协议。因为要对现有的基于 POW 的以太坊进行升级,它考虑更多的是链的可用性而非最终一致性。Casper出块还是会通过 POW,然后再由 POS 节点投票,投票的节点有点像是在赌博,可以随便投任何块,但是如果你没有投中最后被选中的块,会受到惩罚,所以最后大家都会趋向投最长的链上的一个块。
我们可以探讨一下未来区块链有哪些方面还可以改进。当吞吐量做到带宽和网络容量的上限以后,如果要进一步的扩容,有如下几种方式。
有一种考虑是从结构上来改变区块链,把区块从链的结构改成 DAG 的结构。DAG 是有向无环图,每个父块可以有多个子块,如果用 DAG 的方式,就不怕分叉了,出块速度可以大大提升。但是 DAG 对共识机制的挑战也很大,因为 DAG 把链状结构变成网状结构,最终还是需要一个好的共识对这个网状结构进行收敛,才能朝着一个方向前进。Conflux 就试图采用 DAG 的结构对 POW 共识进行优化。
还有一个思路是采用第二层的扩容方案:不用每笔交易都在全网上验证,可以采用分片(sharding),一个交易只需要在一个分片中局部验证即可;还可以采用侧链解决方案,交易在侧链中进行后,定期把结果写回主链即可;甚至还可以直接生成子链,在子链上采用不同共识,这样的架构更灵活,对应用的支持更好。这些方法都可以节省全网的带宽,提高整个系统吞吐量。
采用分层的结构以后,一条链实际上就可以使用混合共识了。在一条多层架构的公链上,POW 安全可靠,可以用来发行通证,POS 效率高,确认快,且能耗低,可以用来做应用。著名公链 MOAC 其实就是采用了这样的共识。
但是,即便在 MOAC 上,POW 和 POS 也是分开的。有没有可能采用一种 POW+POS 的混合共识机制,即保证链的安全性,又可以提高出块效率。还可以通过 POS 质押与算力挖坑的矿工制衡,遏制住耗能的军备竞争呢?
Decred 是为数不多的一个已经混合使用了 POW 和 POS 共识机制的公链。也类似于 Casper,每个块都是通过 POW 产生,但是需要通过 POS 投票确认。Decred 主要是从链上治理的角度出发选择的这种方式,然后让 POS 利益相关者成为区块链治理中的主导决策力量。只有通过投票才能对网络共识规则进行修改。Decred的出块速度并没有很高的提升,而且因为POW 和 POS 挖矿收益比例固定,POW 的耗能挖矿也没有很好的受限制。
从多链架构的角度出发,POW+POS 的混合机制有一个很大的优势就是,链上会出现很多低耗能的 POS 节点,这些节点可以为分片,侧链和子链服务,所以不用担心子链在经济激励不够时出现没有足够多节点为它服务的情况。在经济模型的设计上,也可以把 POW 和 POS 的出块奖励做成动态分配。在算力太多的情况下,就把 POW 出块奖励降低,POS 出块奖励提高,让 POS 的回报率更高。但是当算力太低影响安全性的时候,就把 POW 的奖励增加,这样就可以使得算力回升。如果能实现上面这两点,一条环保,高效,安全的新一代区块链公链就诞生了。