BlockChain技术系列(五)- 拜占庭共识

obcpbft包是PBFT共识协议[1]的实现,其中提供了验证器之间的共识,虽然验证器的阈作为Byzantine,即,恶意的或不可预测的方式失败。在默认的配置中,PBFT容忍t 处理提供PBFT共识协议的参考实现,obcpbft 插件还包含了新颖的Sieve共识协议的实现。基本上Sieve背后的思想为non-deterministic交易提供了fabric层次的保护,这是PBFT和相似的协议没有提供的,obcpbft可以很容易配置为使用经典的PBFT或Sieve。
在默认配置中,PBFT和Sieve设计运行在至少3t +1 *验证器(副本),最多容忍T个出现故障(包括恶意或拜占庭*)副本。
5.1 概览
obcpbft插件提供实现了CPI接口的模块,他可以配置运行PBFT还是Sieve共识协议。模块化来自于,在内部,obcpbft定义了innerCPI 接口(即, inner consensus programming interface),现在包含在 pbft-core.go中。
innerCPI接口定义的所有PBFT内部共识(这里称为core PBFT并在pbft-core.go实现)和使用core PBFT的外部共识之间的相互作用。obcpbft包包含几个core PBFT消费者实现

  • obc-classic.go, core PBFT周围的shim,实现了innerCPI接口并调用CPI接口;
  • obc-batch.goobc-classic的变种,为PBFT添加批量能力;
  • obc-sieve.go, core PBFT消费者,实现Sieve共识协议和innerCPI接口, 调用CPI interface.
总之,除了调用发送消息给其他 peer(innerCPI.broadcastinnerCPI.unicast),innerCPI接口定义了给消费者暴露的共识协议。 这使用了用来表示信息的原子投递的innerCPI.execute调用的一个经典的总序(原子)广播 API[2]。经典的总序广播在external validity checks [2]中详细讨论(innerCPI.verify)和一个功能相似的对不可靠的领导失败的检查Ω 3.
除了innerCPI, core PBFT 定义了core PBFT的方法。core PBFT最重要的方法是request有效地调用总序广播原语[2]。在下文中,我们首先概述core PBFT的方法和innerCPI接口的明细。然后,我们简要地描述,这将在更多的细节Sieve共识协议。
5.2 Core PBFT函数
下面的函数使用非递归锁来控制并发,因此可以从多个并行线程调用。然而,函数一般运行到完成,可能调用从CPI传入的函数。必须小心,以防止活锁。
5.2.1 newPbftCore 【BlockChain技术系列(五)- 拜占庭共识】 签名:
func newPbftCore(id uint64, config *viper.Viper, consumer innerCPI, ledger consensus.Ledger) *pbftCore

newPbftCore构造器使用指定的id来实例化一个新的PBFT箱子实例。config参数定义了PBFT网络的操作参数:副本数量N,检查点周期K,请求完成的超时时间,视图改变周期。
configuration key type example value description
general.N integer 4 Number of replicas
general.K integer 10 Checkpoint period
general.timeout.request duration 2s Max delay between request reception and execution
general.timeout.viewchange duration 2s Max delay between view-change start and next request execution
接口中传递的consumerledger参数是一旦它们全部排好序后用来查询应用状态和调用应用请求的。参阅下面这些接口的相应部分。

    推荐阅读