POCBFT共识机制详解

POCBFT共识机制详解

什么是POCBFT

POCBFT实际是POC + PBFT结合的一种共识算法,在POC共识的基础上,通过拜占庭容错机制,实现最终一致性的一种共识算法。
如果不了解POC共识机制可以看这里:https://niels.wang/2019/06/02/POC/

为什么要做POCBFT

最终一致性!
通过拜占庭容错算法实现区块链的不可回滚特性。
减少交易确认需要的时间,扩展业务场景。

出块流程

保留POC出块流程,在节点收到区块后,继续正常进行区块的校验,校验通过后进入BFT流程。校验不通过则直接丢弃该区块。
出块节点就是BFT中Request的角色

BFT流程

验证人

BFT中的验证人就是POC中的共识节点。

流程

precommit

验证人节点验证了一个区块的正确性后,对该区块的hash+flag(precommit)进行签名,并将签名进行广播。
验证人节点接受其他验证人的签名,并验证签名正确性,累计正确签名的数量。
当签名数量小于66%时,视为区块确认失败,当签名数量达到66%后,precommit流程完成。

commit

当签名数量超过66%时,对该区块的hash+flag(commit)进行签名,并将签名进行广播
验证人节点接收其他验证人的签名,并验证签名的正确性,累计正确签名的数量
当commit签名数量超过66%时,区块确认完成,进行区块存储。

超时机制

NULS的出块时间设计为当一个区块被确认后,从区块时间起20s内可以提交和确认新的区块,区块发出后最多允许10s时间进行BFT确认。
当超时未接收到新区块时,将发送一个对空块的precommit确认,等价于对一个区块的确认,当最终空块被66%以上确认时,高度不增长,可以作为一个黄牌惩罚的凭证。
当precommit收集超时,但并没有达到66%比例时,进入下一轮投票
当commit收集超时但并没有达到66%时,进入下一轮投票

分叉处理

投票有三种类型

  • 投给空块
  • 投给确认某一个区块
  • 投给跳过该出块人,原因是恶意分叉(同一高度除了两个以上的块)

当投票结果出现分歧,不能达到66%确认时,会超时并进入下一轮投票,新的一轮投票依然在同一个高度上进行投票,所有验证人都可以重新投票,投票逻辑是分叉>有块>空块,(前一轮投了空块的节点,在收到块后可以可以在下一轮修改投票内容,投给区块。前一轮投给一个区块那么同高度的下一轮必须投给同一区块,除非所投区块的出块人恶意分叉),直到最终达成一致后,才继续出块。即:每一次分歧,都必须以66%以上确认为结束。

黄牌惩罚逻辑修改

符合黄牌的情况如下:

  1. 应该出块时未能正确出块,确认了空块
  2. 第一轮未能确认,在后续的重新投票中才成功确认区块,多几轮就发几张黄牌
  3. 当确认区块两轮及以上都依然是投给了空块时,给出1张黄牌
  4. 本轮投票可以出结果的情况下,发起了下一轮投票的节点
  5. 没轮到此节点出块时,却出了块

    红牌惩罚逻辑修改

    符合红牌的情况如下:
  6. 100轮内存在3次尝试分叉的情况
  7. 同一轮投票中,签名了两个同类型的结果
  8. 信用值为-1

    非验证人节点

    节点本身不进行签名操作,但一样收集验证人节点的签名来验证区块,验证逻辑和验证人相同。
-------------The End-------------