obcpbft
包是PBFT共识协议[1]的实现,其中提供了验证器之间的共识,虽然验证器的阈作为Byzantine,即,恶意的或不可预测的方式失败。在默认的配置中,PBFT容忍t<n/3的拜占庭验证器。
处理提供PBFT共识协议的参考实现,obcpbft
插件还包含了新颖的Sieve共识协议的实现。基本上Sieve背后的思想为non-deterministic交易提供了fabric层次的保护,这是PBFT和相似的协议没有提供的,obcpbft
可以很容易配置为使用经典的PBFT或Sieve。
在默认配置中,PBFT和Sieve设计运行在至少3t +1 *验证器(副本),最多容忍T个出现故障(包括恶意或拜占庭*)副本。
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.go
, obc-classic
的变种,为PBFT添加批量能力;obc-sieve.go
, core PBFT消费者,实现Sieve共识协议和innerCPI
接口, 调用CPI interface
. 总之,除了调用发送消息给其他 peer(innerCPI.broadcast
和 innerCPI.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共识协议。
下面的函数使用非递归锁来控制并发,因此可以从多个并行线程调用。然而,函数一般运行到完成,可能调用从CPI传入的函数。必须小心,以防止活锁。
签名:
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 |
接口中传递的consumer
和ledger
参数是一旦它们全部排好序后用来查询应用状态和调用应用请求的。参阅下面这些接口的相应部分。