什么是共识机制
在计算机科学中,共识算法是一种用在分布式过程或系统中,实现单一数据值的协议。
通俗来说,就是多个人(节点)对某些事情达成一致,我们生活中充满了共识机制,比如,一个公司要做决定需要股东们集体商量,签合同需要甲方乙方坐下来协商,这个过程就是达成共识的过程。
共识算法被设计用于涉及多个不可靠节点的网络中实现一致性,这对于区块链这样的分布式系统中至为重要,因此共识算法的使用是区块链最重要的特征之一。
拜占庭将军问题
在传统的分布式系统中,由于节点之间没有信任机制,容易受到恶意节点的攻击,导致系统崩溃或者数据被篡改,这又被称为拜占庭将军问题。
拜占庭将军问题是 Leslie Lamport 在 10 世纪 80 年代提出的一个假想问题。拜占庭是东罗马帝国的首都,由于当时拜占庭罗马帝国国土辽阔,每支军队的驻地分隔很远,将军们只能靠信使传递消息。发生战争时将军们必须制定统一的行动计划。
然而,这些将军中有叛徒,叛徒希望通过影响统一行动计划的制定与传播,破坏忠诚的将军们一致的行动计划。因此,将军们必须有一个预定的方法协议,使所有忠诚的将军够达成一致。而且少数几个叛徒不能使忠诚的将军做出错误的计划。也就是说,拜占庭将军问题的实质就是要寻找一个方法,使得将军们在一个有叛徒的非信任环境中建立对战斗计划的共识。
在区块链网络环境中,和拜占庭将军的环境类似,有运行正常的节点(类似忠诚的拜占庭将军),还有故障或作恶的节点(类似叛变的拜占庭将军)。
共识算法的核心是在正常的节点间形成对网络状态的共识。如果有 f 个问题节点,而总节点数小于 3f+1 时,拜占庭将军问题无解,因此 3f + 1 也是区块链中重要的安全假设。
共识机制的分类
根据容错假设的不同,共识算法可以分为CFT 类共识算法 ( 非拜占庭容错,即不考虑恶意节点 ) 和 BFT 类共识算法(拜占庭容错,也就是说考虑恶意节点)。
根据同步假设的不同,共识算法可以分为半同步共识算法和异步共识算法。
另外还可以根据一致性分为两大类:概率一致性算法和强一致性算法。
- 概率一致性算法指在不同分布式节点之间,有较大概率保证节点间数据达到一致,但仍存在一定概率使得某些节点间数据不一致,这种数据不一致的行为又被称为分叉。一般 Proof of X 类共识算法都属于概率一致性算法。
- 强一致性算法则指在任意时间点,不同分布式节点之间的数据都会保持绝对一致,不存在不同节点间数据不一致的情况,即不会分叉。例如 PAXOS 算法及其衍生出的 RAFT 算法。
强一致性算法由于通信轮次较高,在大规模共识节点的网络中往往性能不佳,因此公链一般采用概率一致性算法。
Proof of X
区块链中的 Proof of X 共识机制是通过特殊节点的投票,全网在很短的时间内完成对交易定序,区块验证和区块上链,一般流程如下:
- 主节点选举
- 主节点生成区块(交易定序)
- 其他节点对区块进行验证投票
- 区块上链
在投票中需要对抗女巫攻击(Sybil attack)的恶意刷票,由于身份可以廉价制造,因此需要依托某些不能被廉价制造的东西,例如算力,权益等,因此最常见的 Proof of X 算法是工作量证明算法(Proof of Work, PoW)和权益证明算法(Proof of Stake, PoS)。
下面主要介绍 PoW 和 PoS,其他 Proof of X 还有 EOS 为代表的委托权益证明(DPos),Solana 的历史证明(PoH) 和 Chia 的时空证明(PoST) 等,本文就不多做介绍了。
工作量证明(PoW)
算法简介:最早用来对抗垃圾邮件的一种计算机技术。2008 年,中本聪在比特币白皮书中提出了比特币与区块链,创新的设计了 PoW 算法,被应用在比特币上,用来解决一个数学难题来参与共识。算法的核心内容是利用算力来寻找一个满足区块哈希的 nonce 值。
使用案例:Bitcoin, ETH1.0, Litecoin, Conflux, Dogecoin。
基本流程:矿工自行打包交易,但必须通过计算寻找一个数值 Nonce,使得拼凑上交易数据后内容的 hash 值满足规定的上限。在节点成功找到满足的 hash 值后,会马上对全网进行广播打包区块,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会验证交易、nonce和哈希值正确性
优点:安全性由算力保证,至少掌控全网51%以上算力才能制造分叉和翻转,攻击成本高,自 2009 年以来得到了广泛测试,目前依然得到广泛的使用。
缺点:能源消耗巨大;矿池导致的算力中心化,易受「规模经济」(economies of scale)的影响。交易吞吐量低、交易确认延时高。
权益证明(PoS)
算法简介:2011 年,Quantum 在 Bitcointalk 论坛上提出。2012 年 8 月,首个基于 PoS 共识的区块链项目点点币(Peercoin)诞生,点点币(Peercoin)是第一个实现 PoS 算法的应用。点点币中权益即为币龄,币龄是节点所持币的数量与其持有时间的乘积,发起交易会消耗一定的币龄,每消耗一定币龄时也将获得利息。
使用案例:ETH2.0, Peercoin,Cardana,Avalanche,Algorand。
基本流程:在主节点选举阶段,根据各节点所拥有的代币比例和持有时间计算该节点成为下一个出块者的概率,节点通常可以根据VRF(可验证随机数)在本地计算自己的角色是领导者还是验证者,并且在每轮共识前,VRF的结果无法被提前预测。被选中的领导者进行提案,验证者验证后进行签名,达到签名的阈值后达成共识。如果验证者有恶意或不称职的行为,将通过“削减”的流程失去他们的权益和对网络的访问权。
优点:不需要强大、昂贵的挖矿设备。减少资源消耗,减少 51% 攻击的可能性。相比于 PoW 更高的吞吐量。
缺点:可能导致富人囤积加密货币,形成马太效应,可能产生加密货币通胀问题。
以太坊2.0的共识机制
以太坊2.0 POW 转 POS 后引入了信标链,信标链中的每一个 epoch 包含有32个 slot,slot 间隔周期为12s, 每个 slot 对应原以太坊1.0中的一个区块。
如果一个节点想要参与信标链的共识,首先需要质押 32 个ETH,出于安全考虑,需要经过一段时间的等待,质押者就会被激活成为验证者,即可参与信标链的共识。
在每个 epoch 开始的时候,会将当前网络中所有验证者随机分配到某个 slot 中组成委员会。委员会内又会再确定一个验证者为提议者,其他的为则为证明者。
轮到指定 slot 出块时,提议者会向网络中广播一个新的区块,然后其他的证明者负责验证和投票,每个证明者的票数根据质押数量加权。如果收集到的赞成票数超过2/3,则新的区块会被加入到信标链中。特别的,如果出现分叉,节点只会选择票数最高的块,并根据这个区块去构建下一个区块,这个分支选择规则称为 LMD GHOST 投票。
每个 epoch 中的第一个 slot 作为检查点,每个验证者在每个 epoch 中发起一次委员会投票的同时还要对 epoch 的检查点发起一次投票,称为 Casper FFG 投票。在提交 Casper FFG 投票时,需要包括当前 epoch 的检查点(称为 target)和前一个 epoch 的检查点(称为 source)。
如果一个 epoch 的检查点表决通过,则该 epoch 称为被证明(justified)了。更进一步,如果某个 epoch 的下一个epoch也被证明了,那么该 epoch 则称为被确定(finalized)了。
正常投票和提议区块都会有激励(Mint),而不发、迟发或错发的投票则会有惩罚(Penalty),只有针对明确的作恶行为会罚没(Slash)所有质押的 ETH,共有三种情况:
- 双重提议(double proposer):即提议者在一个 slot 中提议了两个不同的区块;
- 双重投票(double vote):即验证者针对同一个target 发了相对于不同 source 的两次 FFG 投票;
- 环绕投票(surround vote):指一个 FFG 投票的区间包括了另一个 FFG 投票的区间。
写在最后
这一篇是我公众号(公众号名:小猪Web3)的一篇发表,探讨了共识机制。共识机制是保证区块链安全的核心机制,好的共识算法需要综合考虑安全、性能、效率、激励、公平等多种因素, 还需要衡量应用场景和环境,保持可扩展性和中心化的平衡。共识算法本身是纯粹的数学研究,在实际的区块链系统中由于很难保证有足够多利益不相干的矿工或验证者,因此只有比特币,以太坊等少数的区块链系统的共识机制才是真正安全的。Layer2 本身没有共识机制,而是依赖 Layer1(也就是公链)的安全性、数据可用性和去中心化,从过去的公链之争到这两年的 Layer2 之争,可以看出性能已经逐渐取代共识成为区块链大规模采用更为关键的问题。
笔者来自蚂蚁链,也是一名以太坊/Solana/Sui上的开发者,熟悉主流公链技术和 Web3 项目,拉了一个学习交流群,欢迎对 Web3 有兴趣的同学加入(戳我微信号 go15810306120)。
Web3朱大胆 更新于 2024-05-07
https://learnblockchain.cn/article/8073