BlockChain技術系列(五)- 拜占庭共識
obcpbft
包是PBFT共識協議[1]的實現,其中提供了驗證器之間的共識,雖然驗證器的閾作為Byzantine,即,惡意的或不可預測的方式失敗。在預設的配置中,PBFT容忍t<n/3的拜占庭驗證器。
處理提供PBFT共識協議的參考實現,obcpbft
外掛還包含了新穎的Sieve共識協議的實現。基本上Sieve背後的思想為non-deterministic交易提供了fabric層次的保護,這是PBFT和相似的協議沒有提供的,obcpbft
可以很容易配置為使用經典的PBFT或Sieve。
在預設配置中,PBFT和Sieve設計執行在至少3t +1 *驗證器(副本),最多容忍
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.go
,obc-classic
的變種,為PBFT新增批量能力;obc-sieve.go
, core PBFT消費者,實現Sieve共識協議和innerCPI
介面, 呼叫CPI interface
.
總之,除了呼叫傳送訊息給其他 peer(innerCPI.broadcast
和 innerCPI.unicast
),innerCPI
介面定義了給消費者暴露的共識協議。 這使用了用來表示資訊的原子投遞的innerCPI.execute
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
簽名:
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
引數是一旦它們全部排好序後用來查詢應用狀態和呼叫應用請求的。參閱下面這些介面的相應部分。