区块链基础原理:主流共识算法简要说明

为什么需要共识算法?

在回答问题之前,我们首先简要说明下,为什么区块链系统中,必须存在一种共识机制。

区块链系统,维基百科给出的解释:区块链(英语:blockchain 或 block chain)是用分布式数据库识别、传播和记载信息的智能化对等网络, 也称为价值互联网。意味着区块链系统就是一个分布式系统。而在分布式系统研究过程中,大家应该都听说过拜占庭问题

拜占庭将军问题:

一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。

​ —— 摘录自维基百科

在分布式系统中,为了解决拜占庭将军问题,防止部分人作恶,就提出了相关的共识算法。

主流的共识算法

  • PoW:Proof of Work,工作量证明。
  • PoS:Proof of Stake,权益证明。
  • DPoS:Delegated Proof of Stake,委托权益证明。
  • PBFT:Practical Byzantine Fault Tolerance,实用拜占庭容错算法。

PoW:Proof of Work,工作量证明

比特币网络采用的共识算法,即为工作量证明共识算法。工作量证明的技术原理是通过使用区块链中的最近一个区块的hash值,并且选择一个随机数,进行哈希计算,如何想要能够获得记账权,你需要不断枚举随机数的产生,以便能够找到一个随机数使得计算出的哈希值能够满足比特币网络当前要求的N个前置为0的哈希值。而进行这些计算,其实就是使用你的工作量来证明你自己是可以被信任的,因为计算哈希值需要消耗电力等资源,作恶成本高。在比特币网络中,随着算力大小的波动,为了满足能够在平均10分钟内产生一个区块,设计者定义了一个难度值,也就是哈希值前置有多少个零,来改变哈希计算的难度。

假设我们需要计算一个字符串加一个随机数的哈希值,如blockchain+随机数。有一个哈希结果为16进制表示的哈希函数H(x),我们要使得哈希值Y的前缀为N个0,那么我们只需要枚举,从0开始,不断计算,知道找到一个随机数是的H(x)的值Y为前置为N个0即可。

优点:

  • 算法上处理简单粗暴
  • 作恶成本高,减少作恶节点

缺点:

  • 计算结果没有产生实质价值,损耗电力等
  • 计算难度较高,达成共识时间较长。

PoS:Proof of Stake,权益证明

PoS权益证明,实质是就是通过用户持有币的数量以及持有币的时间授予他不同的投票权力。以以太坊即将推出的Casper为例,通过设定一个验证人池子,在这个池子里的验证人,轮流对即将新产生的块进行投票,而每个验证人的投票权重直接取决于这个验证人持有币的数量以及持有币的时间,相当于股份制公司。而每一个验证者在投票产生一个区块时,都会根据权益(持币量&币龄)分配利息。

优点:

  • 无需进行大量计算,减少资源的消耗
  • 散户只要运行客户端即可参与投票,提高网络中节点数量,提升作恶成本

缺点:

  • 节点越多,达成共识时间越长,性能越低

DPoS:Delegated Proof of Stake,委托权益证明

DPoS其实是PoS的变种,PoW和PoS都有一个共同的问题,是随着节点数量的提升,达成共识时间较长,性能较低。为了解决这个问题,相关人员提出了委托权益证明。

在PoS权益证明中,任何在线节点都可以参与投票,而委托权益证明中,利益相关者可以选择将自己的投票权授予任意数量的其他节点,而这些获得投票权委托的人组成一个董事会般的存在,由他们统一进行投票,而这些董事会成员如果不能够履行他们的职责,则会从董事会中被除名,所有持股人会从持股人中重新选出一个人作为董事会成员,作为自己的代理进行投票。

优点:

  • 少量节点参与块的生成确认,提升性能
  • 与PoS一样无需消耗大量资源

引申阅读:比特股中的DPoS

PBFT:Practical Byzantine Fault Tolerance,实用拜占庭容错算法

实用拜占庭容错算法是一种基于消息传递的一致性算法,算法经过三阶段(3PC)达成一致性,这些阶段可能因为失败而重复进行。

算法的简单表述:

1)由全网选择一个节点作为Leader节点,进行提案的产生。

2)三阶段提交第一阶段 提案产生:所有节点可以监听网络内的交易,并且将受到的交易进行广播,Leader节点将收到的交易进行打包,并向全网进行广播。

3)三阶段提交第二阶段 预提交:所有节点收到打包的交易,进行模拟验证执行,执行无误后,将结果进行广播。

4)当主节点收到超过所有节点的一半的执行成功的广播后,则认为该区块可以进行最终打包,并向全网广播,正式执行打包。

5)三阶段提交第三阶段 提交:所有节点在收到主节点要求最终打包的请求后,执行最终确认打包。