- Pow: 工作量证明,主要在 Bitcoin, Ethereum(1.0), Litecoin, Conflux, Dogecoin 等项目中使用。
- dPow: 延迟工作量证明,主要在 Komodo 项目中使用
- Pos:权益证明,主要在 Ethereum(2.0), Peercoin 等项目中使用。
- Poa:权威证明,主要在 Ethereum Kovan Testnet, xDai, VeChain 等项目中使用
- Poh:历史证明,Solana 共识算法
- Dpos:委托权益证明,主要在 BitShares, Steemit, EOS , Lisk 和 Ark 等项目中使用
- Paxos: Paxos 算法,ZooKeeper 使用,ZooKeeper 用于联盟链场景
- Raft:Raft 算法,在联盟链中用得比较多
- PBFT:拜占庭容错算法,在 HyperLedger Fabric(<1.0 版本 ), Stellar, Ripple 和 Dispatch 等项目中使用
- dPBFT:授权拜占庭容错,NEO 项目中使用
- rBPFT:轮流拜占庭容错
- Tendermint-BFT:Tendermint-BFT 算法,使用 cosmos sdk 的很多项目都使用该共识算法
- Avalanche-BFT:Avalanche-BFT 算法,主要在 Avalanche 中使用
- HotStuff-BFT:HotStuff-BFT 算法,Aptos-BFT 算法基于 HotStuff
- Aptos-BFT:Aptos-BFT 算法,主要在 Aptos 项目中使用


- 验证者必须锁定一些代币作为权益。
- 之后,他们将开始验证这些块。这意味着,当他们发现一个他们认为可以添加到链中的区块时,他们将通过下注来验证它。
- 如果该块被附加,那么验证者将获得与其下注成比例的奖励。
- 使用网络并拥有代币的人越多,网络就越安全。
- 成本效益:速度、能源、硬件上都有提效
- 更加去中心化
- 经济不平等,富者愈富
- 攻击者可以根据谁拥有多少币来计算赢得创建区块链奖励的概率。
- 无利害关系攻击
- 在 PoS 中,虽然双方的股份可能相等,但它没有考虑每一方的总持股量,这意味着激励可能不平衡。
- PoW 使用大量的计算能力,这本身就降低了激励。
- 身份必须在链上进行正式验证,并且可以在公开领域中交叉检查信息。
- 资格必须难以获得,有权验证所获得和估价的区块。例如,潜在的验证者需要获得公证员执照。
- 建立权威机构的检查和程序必须完全统一。
- 高吞吐量,可扩展性
- 没有挖矿机制,PoA 使用身份作为权威的唯一验证
- PoA 适用于专用网络和公共网络
- PoA 只允许一个 Validator 进行非连续的区块批准,这意味着风险最小化
- 这是一个比较中心化的系统。
- 它使用编写的加密安全函数,因此无法从输入预测输出,并且必须完全执行才能生成输出。
- 该函数在单核上按顺序运行,其先前的输出作为当前输入,定期记录当前输出以及被调用的次数。
- 然后,外部计算机可以通过检查单独核心上的每个序列段来并行重新计算和验证输出。
- 通过将数据(或某些数据的散列)附加到函数的状态中,可以将数据打上时间戳到该序列中。
- 状态、索引和数据在附加到序列中时的记录提供了时间戳,可以保证数据是在序列中生成下一个哈希之前的某个时间创建的。
- 该设计还支持水平扩展,因为多个生成器可以通过将它们的状态混合到彼此的序列中来相互同步。

- 使用生成区块的 Witnesses 进行工作。
- Witnesses 由每个 Witness 一股一票选出
- DPoS 中,代币持有者不会对区块本身的有效性进行投票,而是投票选举代表,代表他们进行验证。
- DPoS 通常有 21-100 名代表,代表会定期进行洗牌,会收到交付其区块的命令。
- 代表数较少可以让他们有效地组织起来,为每个代表创建制定的时间段来发布他们的区块。
- 如果代表不断错过他们的区块或发布无效交易,利益相关者就会投票淘汰他们,并用更好的代表取代他们。
- 在 DPoS 中,矿工可以合作出块,而不是像 PoW 和 PoS 那样竞争。通过部分集中化区块的创建,DPoS 的运行速度比大多数其他共识算法快几个数量级。
- 便宜的交易
- 可扩展
- 高效节能
- 币龄无影响,代币权重相同
- 仅对活跃且少量投入的钱包才产生稳定一致的收益
- 停机时间和大量投入欧蕙影响收益
- 没有任何利害关系
- 部分中心化
- proposer 提出提案, 提案信息包括编号和内容。
- acceptors 收到提案可以 accept 提案,若提案获得多数派的 acceptros 的接受,则称该提案被批准。
- learners 只能「学习」被批准的提案。
- 提案只有在被 proposer 提出后才能被提准。
- 一次 Paxos 算法的执行实例中,只能批准(chosen)一个提案。
- learners 只能获得被批准提案的值
- prepare 阶段:
- proposer 选择一个提案编号 n 并将 prepare 请求发送给 acceptors 中的一个多数派;
- acceptor 收到 prepare 消息后,如果提案的编号大于它已经回复的所有 prepare 消息 ( 回复消息表示接受 accept),则 acceptor 将自己上次接受的提案回复给 proposer,并承诺不再回复小于 n 的提案;
- 批准阶段:
- 当一个 proposer 收到了多数 acceptors 对 prepare 的回复后,就进入批准阶段。它要向回复 prepare 请求的 acceptors 发送 accept 请求,包括编号 n 和根据 P2c 决定的 value(如果根据 P2c 没有已经接受的 value,那么它可以自由决定 value)。
- 在不违背自己向其他 proposer 的承诺的前提下,acceptor 收到 accept 请求后即批准这个请求。
- 针对每一个要确定的值,运行一次 Paxos 算法实例(Instance),形成决议。每一个 Paxos 实例使用唯一的 Instance ID 标识。
- 在所有 Proposers 中选举一个 Leader,由 Leader 唯一地提交 Proposal 给 Acceptors 进行表决。这样没有 Proposer 竞争,解决了活锁问题。在系统中仅有一个 Leader 进行 Value 提交的情况下,Prepare 阶段就可以跳过,从而将两阶段变为一阶段,提高效率。
- 领袖选举 Leader Election
- 记录复写 Log Replication
- 安全性 Safety
- 选举安全性:每个任期最多只能选出一个领袖。
- 领袖附加性:领袖只会把新指令附加(英语:append)在记录尾端,不会改写或删除已有指令。
- 记录符合性:如果某个指令在两个记录中的任期和指令序号一样,则保证序号较小的指令也完全一样。
- 领袖完整性:如果某个指令在某个任期中存储成功,则保证存在于领袖该任期之后的记录中。
- 状态机安全性:如果某服务器在其状态机上执行了某个指令,其他服务器保证不会在同个状态上执行不同的指令。
广播时间 << 超时期限 << 平均故障间隔就能达到稳定性。这三个时间定义如下:
- 广播时间 是单一服务器发送消息给集群中每台服务器并得到回应的平均时间,需要测量得到。
- 超时期限 是发动选举的超时期限,由部署 Raft 集群的人选定。
- 平均故障间隔 是服务器发生故障之间的平均时间,可以测量或估计得到。
- Leader/Primary:共识节点,负责打包称区块和区块共识,每轮共识过程中有且只有一个 Leader,为了防止 Leader 伪造区块,每轮 PBFT 共识后,均会切换 Leader。
- Replica:副本节点。负责区块共识,每轮共识过程中有多个 Replica 节点,每个 Replica 节点的处理过程类似;
- Observer:观察者节点,负责从共识节点或者副本节点获取最新区块,执行并验证区块执行结果后,将产生的区块上链。
节点 ID : 共识节点签名公钥和共识节点唯一标识, 一般是 64 字节二进制串,其他节点使用消息包发送者的节点 ID 对消息包进行验签考虑到节点 ID 很长,在共识消息中包含该字段会耗费部分网络带宽,FISCO BCOS 引入了节点索引,每个共识节点维护一份公共的共识节点列表,节点索引记录了每个共识节点 ID 在这个列表中的位置,发送网络消息包时,只需要带上节点索引,其他节点即可以从公共的共识节点列表中索引出节点的 ID,进而对消息进行验签:
节点索引 : 每个共识节点 ID 在这个公共节点 ID 列表中的位置视图PBFT 共识算法使用视图 view 记录每个节点的共识状态,相同视图节点维护相同的 Leader 和 Replicas 节点列表。 当 Leader 出现故障,会发生视图切换,若视图切换成功 ( 至少 2f+1 个节点达到相同视图 ),则根据新的视图选出新 leader,新 leader 开始出块,否则继续进行视图切换,直至全网大部分节点 ( 大于等于 2f+1) 达到一致视图。 当 Node3 节点为拜占庭节点时,视图切换过程如下:

- 前三轮共识:node0、node1、node2 为 leader,且非恶意节点数目等于2*f+1,节点正常出块共识;
- 第四轮共识:node3 为 leader,但 node3 为拜占庭节点,node0-node2 在给定时间内未收到 node3 打包的区块,触发视图切换,试图切换到view_new=view+1的新视图,并相互间广播 viewchange 包,节点收集满在视图view_new上的(2*f+1)个 viewchange 包后,将自己的 view 切换为view_new,并计算出新 leader;
- 为第五轮共识:node0 为 leader,继续打包出块。
- Pre-prepare:负责执行区块,产生签名包,并将签名包广播给所有共识节点;
- Prepare:负责收集签名包,某节点收集满2*f+1的签名包后,表明自身达到可以提交区块的状态,开始广播 Commit 包;
- Commit:负责收集 Commit 包,某节点收集满2*f+1的 Commit 包后,直接将本地缓存的最新区块提交到数据库。
- 共识委员:执行 PBFT 公式流程的节点,有轮流出块权限。
- 验证节点:不执行公式流程,验证公式节点是否合法、区块验证,经过若干轮共识后,会切换共识节点。

- epoch_sealer_num:每轮共识过程中参与共识的节点数目,可通过控制台发交易方式动态配置该参数
- epoch_block_num: 共识节点替换周期,为防止选取的共识节点联合作恶,rPBFT 每出 epoch_block_num 个区块,会替换一个共识节点,可通过控制台发交易的方式动态配置该参数

- 校验区块签名列表:每个区块必须至少包含三分之二共识委员的签名
- 校验区块执行结果:本地区块执行结果须与共识委员在区块头记录的执行结果一致

- 网络复杂度:O(epoch_sealer_num * epoch_sealer_num),与节点规模无关,可扩展性强于 PBFT 共识算法
- 性能:可秒级确认,且由于算法复杂度与节点数无关,性能衰减远小于 PBFT
- 一致性、可用性要求:需要至少三分之二的共识委员节点正常工作,系统才可正常共识
- 安全性:未来将引入 VRF 算法,随机、私密地替换共识委员,增强共识算法安全性
- Propose step
- 从验证者集中选择一个验证者节点作为给定高度的区块提议者。
- 验证者节点收集交易并将它们打包到一个区块中。提议的块被广播到其余节点。
- Pre-vote step
- 每个节点都会进行预投票并进行侦听,直到提交来自验证者节点的 +2/3 预投票。
- 块可以被预投票为预投票(即有效块)或 nil (当它无效或达到超时时)。当超过 2/3 的验证者对同一个区块进行预投票时,我们通常称为 Polka。
- 此外,从验证者的角度来看,如果验证者投票支持 Polka 中引用的区块,那么验证者现在在特定高度和轮次中拥有所谓的锁更改证明或简称 PoLC (H, R)。
- Pre-commit step
- 一旦达到 Polka,验证者就会提交一个预提交块,否则他们会预提交 nil 。广播后,他们等待同行的 +2/3 预提交。
- 最后,当验证者提交超过 +2/3 的预提交(又名提交)并且新选定的区块提议者达到新的区块高度时,提议的区块就会被提交。如果没有,网络将执行新一轮,并且该过程从头开始 Propose step。
- Pre-Vote step
- 首先,如果验证器从 LastLockRound 开始就锁定在一个区块上,但现在在 PoLC - Round 轮(其中 LastLockRound < PoLC - R < R )有一个 PoLC 来锁定其他东西,然后它解锁。
- 如果验证器仍然锁定在某个块上,它会对该块进行预投票。
- Pre-commit step
- 如果验证器在特定块 B 的 (H, R) 处具有 PoLC ,它会(重新)锁定(或更改锁定)并预提交 B 并设置 LastLockRound = R .
- 否则,如果验证器在 (H, R) 处有 nil 的 PoLC ,它会解锁并预提交 nil 。
- 否则,它保持锁定不变并预提交 nil 。
- nil 的预提交意味着「我没有看到本轮的 PoLC ,但我确实获得了 +2/3 预投票并等待了一会儿」。
- 指定的提案人不在线。
- 指定提议者提议的区块无效。
- 指定提议者提议的区块没有及时传播(即超时)。
- 提议的区块是有效的,但在到达预提交步骤时,没有及时收到足够多的验证节点对提议区块的 +2/3 预投票。尽管需要 +2/3 的预投票才能进入下一步,但至少有一个验证者可能投了零票或恶意投票给其他东西。
- 提议的区块是有效的,并且足够的节点收到了 +2/3 的预投票,但是足够的验证者节点没有收到提议的区块的 +2/3 的预提交。