更新时间:2022-09-16 11:27
区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成。共识层主要封装网络节点的各类共识算法。如何在分布式系统中高效地达成共识是分布式计算领域的重要研究问题。正如社会系统中“民主”和“集中”的对立关系相似,决策权越分散的系统达成共识的效率越低、但系统稳定性和满意度越高;而决策权越集中的系统更易达成共识,但同时更易出现专制和独裁。区块链技术的核心优势之一就是能够在决策权高度分散的去中心化系统中使得各节点高效地针对区块数据的有效性达成共识。早期的比特币区块链采用高度依赖节点算力的工作量证明 (Proof of work, PoW) 机制来保证比特币网络分布式记账的一致性。
随着区块链技术的发展和各种竞争币的相继涌现 , 研究者提出多种不依赖算力而能够达成共识的机制 , 例如点点币的权益证明 (Proof of stake, PoS) 共识和比特股发明的授权股份证明机制 (Delegated proof of stake, DPOS) 共识机制等。区块链共识层即封装了这些共识机制。例如以太坊,在一个高度自治的去中心化分布式系统中,如何使各节点达成共识是以太坊的核心内容,也是分布式系统所面临的不可避免的问题。以太坊采用了基于工作量证明的共识机制,让一个决策权分散的系统达成一致。各个节点通过算力竞争解决一个数学难题,并对第一个解决出来的节点进行奖励,从而促进整个网络实现算力竞争。在以太坊中使用的工作量证明哈希函数是Ethash,该哈希算法已经被证明没有有效的办法进行逆向运算,只能通过尝试求解。每一次的挖矿过程首先根据区块头中的难度系数计算出一个目标值,然后对区块头中的信息和一个随机数进行哈希,得到的哈希值小于目标值则认为挖矿成功,该随机数则是这次运算的解。因为哈希算法的特点,所以每次输入即使只有一位不同也会造成哈希值差异很大,因此通过哈希算法的不可逆性使该求解过程只与计算机算力有关。该求解过程虽然会消耗大量算力,但是对解的验证却十分简单,只需要进行一次哈希运算后与目标值进行比较便可校验。而攻击者倘若想要伪造区块信息并添加到区块链中,则需要联合全网51%的算力来同时进行伪造,因此通过工作量证明的共识机制实现了以太坊一致性的问题。
工作量证明 (Proof of work,PoW)共识:中本聪在其比特币奠基性论文中设计了PoW 共识机制 , 其核心思想是通过引入分布式节点的算力竞争来保证数据一致性和共识的安全性 。比特币系统中,各节点 ( 即矿工 ) 基于各自的计算机算力相互竞争来共同解决一个求解复杂但验证容易的 SHA256 数学难题 (即挖矿), 最快解决该难题的节点将获得区块记账权和系统自动生成的比特币奖励。该数学难题可表述为:根据当前难度值,通过搜索求解一个合适的随机数 (Nonce) 使得图1中区块头各元数据的双 SHA256 哈希值小于或等于目标哈希值。比特币系统通过灵活调整随机数搜索的难度值来控制区块的平均生成时间为 10 分钟左右。一般说来,PoW 共识的随机数搜索过程如下:
步骤1。搜集当前时间段的全网未确认交易,并增加一个用于发行新比特币奖励的Coinbase 交易,形成当前区块体的交易集合;
步骤2。计算区块体交易集合的Merkle 根记入区块头,并填写区块头的其他元数据,其中随机数Nonce 置零;
步骤 3。随机数 Nonce 加1;计算当前区块头的双 SHA256 哈希值,如果小于或等于目标哈希值 ,则成功搜索到合适的随机数并获得该区块的记账权;否则继续步骤3直到任一节点搜索到合适的随机数为止;
步骤4。如果一定时间内未成功,则更新时间戳和未确认交易集合、重新计算 Merkle 根后继续搜索。符合要求的区块头哈希值通常由多个前导零构成,目标哈希值越小,区块头哈希值的前导零越多,成功找到合适的随机数并“ 挖 ”出新区块的难度越大。 据区块链实时监测网站 Blockchain。info 显示 ,截止到 2016 年2月,符合要求的区块头哈希值一般有 1前导零,例如第 398346 号区块哈希值为“0000000000000000077f754f22f21629a7975cf ···”。按照概率计算,每 16 次随机数搜索将会有找到一个含有一个前导零的区块哈希值,因而比特币17 位前导零哈希值要求 16 17 次随机数搜索才能找到一个合适的随机数并生成一个新的区块。由此可见,比特币区块链系统的安全性和不可篡改性是由PoW 共识机制的强大算力所保证的,任何对于区块数据的攻击或篡改都必须重新计算该区块以及其后所有区块的SHA256 难题,并且计算速度必须使得伪造链长度超过主链,这种攻击难度导致的成本将远超其收益。据估计,截止到2016年1月,比特币区块链的算力已经达到800000000Gh/s, 即每秒进行8×10 18 次运算,超过全球 Top500 超级计算机的算力总和。PoW共识机制是具有重要意义的创新,其整合了比特币系统的货币发行、交易支付和验证等功能, 并通过算力竞争保障系统的安全性和去中心性;PoW 共识机制同时存在着显著的缺陷,其强大算力造成的资源浪费 (如电力) 历来为研究者所诟病,而且长达10 分钟的交易确认时间使其相对不适合小额交易的商业应用。
权益证明 (Proof of stake, PoS) 共识:中本聪在2010 年提出的币龄概念,币龄的定义是货币所持有的时间段,即将货币的金额与所持有的时间进行数学运算后得出的结果。而PoS 机制正是基于币龄这个概念提出的,PoS共识机制也可以保证区块链去中心化可信的运行。PoS 共识机制的目的是提供一种在分布式系统中达成共识的方法。不同于工作量证明的共识机制,该机制中节点生成一个新的区块时会提供一种证明,证明该区块在被网络接受之前获得过一定数量的货币。生成一个区块需要输入一定数量的货币,这样可以证明该节点对货币的所有权。而这些货币将影响到生成区块时挖矿过程的难度系数。在基于权益证明的区块中定义了一种新的交易称之为利息币交易。利息币的交易与传统的交易不同,利息币交易过程中会消耗交易者的币龄从而获取在网络中生成区块的权利,同时也获得对 PoS 机制下的造币的权利。利息币中首先要输入一定的核心(Kernel),接下来的过程与 PoW 机制中挖矿过程类似,同样是通过求解随机数,使其经过哈希计算满足目标值。但是 PoS 共识机制中,哈希计算对随机数求解时,会降低求解难度,这样会极大的缩小寻找随机数的空间,从而减少能源的消耗。因此 Kernel 消耗的越多,哈希计算空间则会越小,随机数的计算则越容易。与PoW 机制中所有节点的目标值一样不同,PoS 机制中各节点的目标值不同,因此权益大的节点要更加容易挖矿。在校验方面,该机制中对主链的判断不再是通过难度系数判断,而是通过对币龄的消耗进行判断。因为在区块中的每笔交易都会消耗币龄,最终区块链选择币龄消耗最多的链作为主链。这样的设计也降低了基于PoW 共识机制所提出的51%的算力攻击问题,因为在 PoS 共识机制中,节点首先要控制众多的货币达到足够的币龄后才可以伪造区块进行攻击,而这个过程所要消耗的成本要远高于集中全网51%的算力的成本。同时攻击者在攻击主链时会消耗币龄,对于攻击者来说也是一种损失。PoS 共识机制中,挖矿的过程不仅和节点的算力有关,也和节点的权益相关。权益大的节点的挖矿过程会比权益小的节点更加容易,从而提高了挖矿效率,减少算力浪情况,PoS 机制的出现也说明人们逐渐意识到 PoW 机制所带来的算力浪费的问题。然而PoS 机制从本质上并没有摆脱挖矿的束缚,节点仍需要进行挖矿,因此还是会造成较大的算力浪费。
区块链可以被看作是一个去中心化的共享数据库,并且可以抵御任何节点的攻击和恶意行为。通常来说,拜占庭容错(Byzantine Fault Tolerance,BFT)共识协议是可以容忍恶意行为的共识协议。该共识机制叫做拜占庭的原因是这种容忍恶意行为的问题和历史中拜占庭将军尝试通过使者来通知其他将军一同攻打罗马,然而其他将军中可能存在叛徒的场景非常相似,因此采用了拜占庭共识机制这个名字。
当一个进程停掉了,该进程只是无法继续工作。但是拜占庭错误,程序错误可以是任意形式的。系统崩溃的处理过程很简单,因为在这个过程中进程不会对其他进程传送假消息。系统只需要容忍这个错误并通过半数以上的进程同意,便可以达成共识,因此在这种情况下系统可以容忍一半的程序停掉。如果发生错误的进程是f,那么要求该系统至少有 2f+1 个进程。但是拜占庭错误更加复杂,假如一个系统中有 2f +1 个进程,其中个进程发生拜占庭错误,那么他们可以协商并发送相同的信息给另外 f+1 个没有错误的进程,在这种情况下,系统仍会发生错误。因此一个拜占庭系统中可以容忍错误进程的数量要小于不是拜占庭系统的进程数量。实际上,这个系统的限制条件是 f< 1/3N,其中N是系统中所有的进程数。该机制便是拜占庭机制。
在 1999 年,Castro 和 Liskov提出了实用容错拜占庭(Practical Byzantine Fault Tolerance,PBFT)机制,首次提出了实用的拜占庭容错机制,该机制下 TPS可以达到 10 万以上,因此该机制在工业系统中得到了广泛的应用。而 Hyperledger区块链项目也正是使用了该机制,但该项目仍处于开发阶段,同时该项目更加注重的全球化账本的管理工作。一方面,PBFT共识机制可以很好的解决分布式系统中的共识问题,尤其在联盟链中对容错率不太高的情况下。然而另一方面该机制会在发生拜占庭错误时进行大量消息传递,这对于网络开销是昂贵的。
授权股份证明(Delegated Proof of Stake, DPoS)机制是在可信的加密货币网络中,提供事务处理和去中心化的共识协议的一种方法,目的是为了减少基于PoW 共识机制中的算力浪费和资源开销。DPoS共识机制和董事会投票表决有些类似。在一个去中心化系统中,将决策权力分发给所有股东,而当股东投票超过 51%时,则认为该决定被通过,并且该决定不可逆。在该机制中有一个重要角色叫做代表,代表是生成区块的节点,想要成为代表首先要支付一定的保障金来保证代表的可信性。而用户则拥有选举代表的权利。每个用户可以投票选举一个值得信任的代表,在全网中获票最多的前 n 个代表则有生产区块的权利,这 n 个代表持有的票数相当于该节点持有的股数。这 n 个代表将按时间表进行轮流生产区块,生成的区块通过的股票数超过51%则认为区块生成成功,代表每生成一个区块将从区块中交易的手续费中获得收益。而这些收益也将是代表维持在线参与的奖励机制。DPoS 共识机制中,代表的可靠性显得格外重要,在股东选取代表时,股东可以看到代表出块的错误率,从而股东可以正确的选择代表。另一方面,代表出块是按时间轮流产生,因此当一个代表错误的产生一个区块时,只要不得到 51%的认可,那么该区块将会在下一个时间段由其他的代表生成。可以说 DPo S 共识机制相比与 PoS 共识机制更加有效。DPoS 共识机制是真正意义上摆脱挖矿的共识机制,然而该机制依赖于所有参与者的投票,当参与度不够的时候,那么代表往往会集中在全网中持有大量选票的持有人手中,从而失去了去中心化的特点。