区块链的共识算法,你学会了吗?
区块链是一种去中心化、不可篡改、可追溯的分布式数据库系统,可确保数据安全,并防止未经授权的访问。区块链技术允许用户在分布式账本中添加、查看和验证交易,并使用共识机制来确保所有交易准确无误。
在区块链中,共识机制用于保证网络上的所有节点都同意网络的当前状态和交易的真实性,这对于维护区块链的安全性和完整性至关重要,图1展示了区块链共识过程的基础模型。不同的区块链平台使用不同的算法,例如POW、POS或POB等,以在网络上的节点之间达成共识。一个好的共识算法可以保持区块链网络的活跃,为整个网络提供源源不断的有效算力,而设计不佳的算法则可能导致整个网络在受到攻击时很容易瘫痪。共识算法可以分为:非拜占庭容错算法与拜占庭容错算法,基于DAG和混合算法,在本次报告中主要介绍拜占庭容错算法。
拜占庭容错算法(Byzantine Fault Tolerance,BFT)是一类分布式系统中用于处理节点故障和恶意行为的算法。该算法的目标是确保在存在节点错误或恶意行为的情况下,系统仍能够达成一致的共识。BFT的概念起源于拜占庭将军问题,其机制的目的是通过一种集体决策过程来防范系统故障,该过程考虑了正确节点和故障节点的输入,旨在最小化故障节点的影响。本报告主要介绍了pBFT、POW、POS、POB、POC、POA、DPOS共识算法。
1、Practical Byzantine fault‑tolerant (pBFT)
实用拜占庭容错算法 (pBFT) 是 Barbara Liskov 和 Miguel Castro 在 1999年提出的一种共识算法[1],解决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。
pBFT可以在保证活性和安全性的前提下提供(n-1)/3的容错性, 其中 n 为节点总数,即只要恶意节点的最大数量小于或等于系统中所有节点的三分之一,pBFT 系统就可以正常运行。在启用 pBFT 的系统中,节点按顺序排序,其中一个节点为主节点,其他节点为辅节点。主节点在每次视图期间都会发生更改,并且如果经过了预定义的时间而没有主节点向辅节点广播请求,则可以通过视图更改协议替换主节点。
pBFT共识分为五个阶段,如图2所示,其中C为发送请求端,0123为服务端,3为宕机的服务端,具体步骤如下:
请求阶段(request): 请求端C发送请求到主节点,这里主节点是0;
预准备阶段(pre-prepare):服务端0收到C的请求后进行广播,扩散至服务端123;
准备阶段(prepare): 服务端123收到后记录并再次广播,1->023,2->013,3因为宕机无法广播;
提交阶段(commit): 服务端0123节点在Prepare阶段,若收到超过一定数量的相同请求,则进入Commit阶段,广播Commit请求;
回复(reply): 0123节点在Commit阶段,若收到超过一定数量的相同请求,则对C进行反馈。
pBFT首次提出在异步网络环境下使用状态机副本复制协议,该算法可以工作在异步环境中,并且通过优化在早期算法的基础上把响应性能提升了一个数量级以上。但该算法仅仅适用于permissioned systems 且通信复杂度使得系统性能随着网络规模的增加而下降。
2、Proof ofwork (PoW)
PoW的优点是完全去中心化 ,节点自由进出;只要破坏者算力不超过网络总算力的50%,交易状态就能达成一致。PoW 的缺点是挖矿造成大量资源浪费;矿池算力高度集中;达成共识周期较长(每秒最多7笔交易);还存在自私挖矿攻击的风险。
3、Proof ofstake (PoS)
PoS 共识算法因其节能特性而被认为是 PoW 有前途的替代方案。PoS 由系统中具有最高权益而非最高算力的节点获得记账权[3]。相对于PoW中 Nonce 字段的大搜索空间而言, PoS 将搜索空间限制在一个计算量可接受的范围; 除此外,PoS 中还引入了“币龄”作为权益,即:
竞争出块记账前,拥有权益的节点将自己的权益放入PoS机制中,同时身份变为验证者,PoS机制根据验证者下注的多少,选出一个记账者进行出块记账。选择算法综合使用候选者的股权(持有的加密货币数量)和其他因素(如币龄和随机化),以确保网络上所有节点之间的公平性。其中一个因素是币龄,它是候选节点成为验证者的时间。节点担任验证者的时间越长,被选为记账者的机会就越大。另一个因素是随机块选择,其中验证器是根据最低哈希值和最高权益的组合来选择的。具有这些因素的最佳加权组合的节点成为新的记账者。如果选出的记账者在一段时间内没有记账,PoS机制重新选择记账节点,当出块完成,开始进入下一轮的记账。
PoS缩短了共识达成的时间,降低了PoW机制的资源浪费。但是破坏者对网络攻击成本低,存在“无利害关系“(Nothing at stake)”攻击问题,且共识受少数富裕账户支配,缺乏公正性。
4、Proof ofburn (PoB)
在 "烧毁证明"(PoB)中,验证者通过 "烧毁 "货币或将其发送到一个永远无法取回的地址来表示自己愿意为了长期投资而承受短期的损失,以及获得在某个随机选择程序系统上进行挖矿的终生特权[4]。这一过程用于确定哪些验证者能够挖掘系统中的下一个区块。验证者可以使用本地社区的货币或比特币等替代链的货币,以增加被选中进行区块挖掘的机会。矿工烧掉的货币越多,被系统选中开采下一个区块的机会就越大。随着新区块的挖出,被烧毁币的能量会略有减少,从而产生一个通缩过程,即货币的总量会随着时间的推移而减少,从而有可能增加其价值。相比之下,数量随时间增加的加密货币往往会贬值。
PoB更环保,因为它并不强调硬件的功率或数量,货币销毁会永久减少被销毁的加密货币的供应,从而导致稀缺性和资产价值增加。虽然在硬件方面,PoB不需要像Pow那样多的资源,但它会破坏通过计算创建的硬币,这也是一种浪费。PoB中,由于销毁是最终的结果,没有任何保证可以收回烧毁的货币的全部价值,这增加了用户的风险。
5、Proof ofcapacity (PoC)
容量证明(PoC)是一种新的挖矿方法,目前在加密货币 Burstcoin 中使用[5]。空间容量证明利用的是计算机的硬盘空间大小而不是电脑的计算能力。硬盘的容量越大,可以储存在硬盘里的方案值就越多,矿工就越有机会匹配到其中所需要的哈希值,从而有更多的机会获得奖励。
PoC 通过在计算机上提供更多解决方案或“图”来增加矿工赢得挖矿竞争的机会。PoC由两个主要部分组成:绘图和挖矿
绘图:矿工使用 Shabal 哈希函数创建一系列预先计算的哈希值并将其存储在硬盘上。这个绘图过程是一次性的,且根据硬盘的大小,绘制周期也将不同,一般为几天甚至数周。哈希值被分组为“scoops”,每个scoop由两个相邻的哈希值组成。
挖矿:挖矿需要计算scoop数,并将其应用于存储在硬盘驱动器上的每个nonce值,以确定一个 "截止日期 "值。如果在该时间段内没有其他人创建新区块,矿工就会选择截止日期最短的 nonce 并使用它来创建新区块。如果矿工在截止日期前创建了区块,就会获得区块奖励。
POC挖矿减少了大量的计算,同时避免了AISC化的矿机出现,大大降低了挖矿的门槛和矿工的成本。
6、Proof ofactivity (PoA)
活动证明(PoA)结合了PoW工作量证明与PoS权益证明的特点并进行了相应扩展[6],PoA共识具有更为复杂的记账节点选取,同时有更为公平的奖励机制。通过考虑矿工的利益,网络可以优先考虑那些对网络建设有长远利益的矿工,而不仅仅是那些拥有最强大计算资源的矿工。其具体步骤如下:
每个矿工先利用自身算力通过工作量证明机制后得出nonce并生成一个空区块头,这个区块头除了没有交易信息数据外其他数据与正常区块一致。
最先生成空区块的节点广播全网节点,全网节点接收到消息后,将此区块的hash值与上一区块的hash值进行拼接,然后加上n个固定后缀值进行再hash,最后得出n个值作为输入,进入follow-the-satoshi程序,然后可输出n个随机权益持有者。拥有大量加密货币的矿工被选为签名者的机会更高。
前n-1个随机权益持有者对空区块进行签名,第n个随机权益持有者即为获取到记账权的节点,他将在空区块的基础上添加交易数据与签名。
第n个随机权益持有者将打包好的区块广播全网,全网节点接收到区块后进行验证,验证成功后上链。
产生空区块的矿工与第n个随机权益持有者以及前n-1个已签名的随机权益持有者共享交易费奖励。
PoA 可以有效地平衡区块链的安全性和效率,但与纯 PoW 或 PoS 系统相比,PoA 的实施可能更复杂,安全性也可能更低。PoA因部分使用PoW和PoS而被诟病,但也防范了51%攻击的风险。
7、Delegate proof of stake (DPoS)
大幅缩少参与验证和记账节点的数量,能达到秒级的共识验证;另外, 区块的产生不需要消耗算力, 相对于 PoS 更加节省能耗。但不合适完全去中心化的场景。
区块链技术的出现代表了数字货币经济时代的到来。但是区块链的共识机制仍然还面临一些挑战,区块链的共识机制还有可进步之处。只有做到各方面的平衡,通过之后的发展以及不断的更迭,才能设计出更加适合实际应用场景的共识机制。