• 沒有找到結果。

2.5 Tendermint

Tendermint[3]為⼀種拜占庭錯誤容忍的複製狀態機,且假設是 partial synchrony 的環境

6,其參考了 [6] 與 [10]。它的概念是每個共識的回合之中根據預先定好的規則,選出 稱作 proposer 的節點由 proposer 負責提案這⼀回合要達成的共識(例如⼀個含有若⼲個 交易的區塊),再由其他節點投票決定是否採⽤此共識,必須超過三分之⼆的節點投票 通過才能達成共識。但因為可能有錯誤或惡意的節點存在,共識可能要幾回合後才能 達成。每個回合會執⾏以下的步驟,如圖 2.5。

1. Propose:Proposer 在此階段提出⼀個 Proposal,並廣播給其他節點。

2. Prevote:每個節點會透過傳遞 Prevote 訊息,告訴其他節點⾃⼰收到的 Proposal資訊。

3. Precommit:如果節點收到超過 2/3 以上的 Prevote,都投給同⼀個

Proposal,則代表該 Proposal 得到認可,傳遞 Precommit 訊息給其他節點,

代表準備提交。

4. Commit:如果節點收到超過 2/3 以上的 Precommit,都投給同⼀個

Proposal,表⽰有 2/3 以上的節點已經準備提交 Proposal,該節點就會進⾏

提交動作。

Tendermint與 PBFT 有許多相似的部分,其對於區塊的共識⼀樣是進⾏兩次的投 票階段來確認。兩個演算法主要的不同在於 Tendermint 利⽤了 Lock 的概念與 PoLC (Proof-of-Lock-Change) 來維護系統的安全性(safety)與活性(liveness)。節點在

6

網路延遲有⼀個上限,但是該上限無法得知,但訊息保證會在時間到上限之內到達。來⾃於

[12] 。

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

Prevote某個區塊之後會進⼊ Lock 狀態,代表其之後只能繼續將 Prevote 投給該 Lock 住的區塊。但是如果節點可能拿到錯誤的區塊,如果沒有⼀個機制讓節點能夠改變它 的選擇,可能會影響安全性。當收到的區塊包含 PoLC,即代表該區塊有⾄少 2/3 以上 的節點同意該區塊的正確性(2/3 以上的 Prevote),也代表這個區塊在當前⾼度是⼤

部份節點的選擇。所以當有節點已經進⼊ Lock 在某⼀區塊,但是在看到包含 PoLC 的 區塊,必須改變其 Lock 的狀態,⽀持包含 PoLC 的區塊。

(圖⽚來源:https://tendermint.com/intro/consensus-overview)

Figure 2.5 Tendermint 共識流程圖

Proposer,由其建⽴與廣播⼀個區塊後,當其他節點收到區塊後可以進⼊ Vote 階段,

即是以投票來表⽰⾃⼰收到的區塊是哪⼀個。最後每個節點蒐集完節點之間的訊息投 票之後進⾏檢驗,如果有超過三分之⼆的票投給同⼀個區塊,則進⾏提交;如果沒 有,但是有超過三分之⼀的票投給同⼀個區塊,下⼀個 Proposer 可以提出

VotingInstruction,讓其他節點投給此區塊;如果沒有任何區塊得到超過三分之⼀的 票,則下⼀位 Proposer 可以重新建⽴⼀個新的區塊。與 Tendermint 的差別在於,

Hydrachain經過第⼀階段的投票過後,會直接檢查投票結果,即⽐ Tendermint 少了⼀

個投票階段。

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

有收到超過三分之⼆以上的票在同⼀個區塊,並不會提交任何區塊,⽽且對於節點

4,其收到的⿊⾊區塊的票還⽐紅⾊區塊的多,造成之後有可能會提交與紅區塊不同的 區塊。如此結果可能會造成區塊鏈的安全性,即節點提交出不同的區塊,導致分⽀出 現,⽽分⽀出現也造成共識節點分散,也威脅到了整個網路的活性。

也由於 Hydrachain 可能會發⽣安全性與持續性的問題,所以我們對其演算法進⾏

改進,最後改進為相似於 Tendermint 的演算法。

Figure 2.6 Hydrachain 演算法⼤綱

Figure 2.5描述 Hydrachain 演算法的⼤綱

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

Figure 2.7 Hydrachain 可能導致之共識問題

2.6 Istanbul BFT

Istanbul BFT為另⼀個實作拜占庭容錯演算法於 Go-Ethereum 的區塊鏈平台,其拜 占庭容錯演算法同樣參考了[6],也參考了 Tendermint。其共識演算法步驟如 2.8 所

⽰,基本上與 PBFT 相似,會經過三個階段為⼀回的步驟進⾏共識,分別是 Pre-Prepared、Prepared、Committed。與 PBFT 不同的地⽅在於 Istanbul BFT 沒有 view-change的概念,⽽是當回合共識失敗時,會直接開始⼀個新的回合,並提出新的區 塊,且每個回合的 Proposer 也是輪流替換。由於每個回合並不會參考其他回合的共識

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

結果,所以如果有區塊在 Pre-prepared 有達到共識,但是沒有在該回合進⾏ Commit,

則該區塊就會被捨棄,浪費了其共識結果。

另外 Istanbul BFT 也參考了 Go-Ethereum 另⼀個共識⽅式 Clique,利⽤ Clique 機 制中將區塊鏈可以做共識的名單記錄在區塊上,可以進⾏未來進⾏新增或修改的動 作。

(圖⽚來源:https://github.com/ethereum/EIPs/issues/650)

Figure 2.8 Istanbul BFT 共識流程圖

● Validator:能夠參與共識的節點我們稱為 Validator。

● Vote:Vote 為⼀種訊息,在共識期間節點之間會互相廣播 Vote。此外分為兩種型

合所要進⾏共識的區塊,我們稱 Proposer 其所需提出的訊息為 Proposal。Proposal 有兩種型態 NewBlock 與 VotingInstruction。我們以 ProposalX, H, R, u

(B)

表⽰此

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

■ Quorum(LocksetPrecommit, H, R’, u

)

不存在。

3.2 共識流程

每次 R 的共識的流程主要分為四個階段分別是:

1. Propose 2. Prevote 3. Precommit 4. Commit

圖三描述出四個流程之間的順序與關係。以下我們分別解釋每個節點在這四個階段需 要進⾏的規則與步驟。

Figure 4.1 共識流程圖

3.2.1 Propose

Propose 是每個回合開始的第⼀步驟,每次回合開始時都會從 Validators 選出⼀位 Proposer 來提出 Proposal。因為 Proposer 所提出的 Proposal 與區塊關係到整個共識結 果,可以說是在整個共識過程中很重要的決定,我們以 Round-Robin 的⽅式讓

Validators循環擔任 Proposer,才不會讓提出 Proposal 的權⼒掌握在某⼀個 Validator ⼿ 上。由於每次回合開始時,每個 Validators 都會知道這個回合是哪⼀個 Validator 當 Proposer,所以也可以防⽌⾮ Validators 提出其他 Proposal 混淆。

3.2.2 Prevote

Prevote 階段是各節點之間確認區塊正確性的投票階段。每個節點依照收到的 Proposal 進⾏投票。

對於節點 u 在第 H ⾼度、第 R 回合會遵守以下規則:

3.2.3 Precommit

Precommit 階段是各節點透過上⼀個步驟的投票結果,判斷各節點收到的 Propoal 與區 塊是否相同並且透過廣播 VotePrecommit, H, R, u

(B)

將結果告知其他節點。

3.2.4 Commit

Commit 階段是各節點根據上⼀個步驟的投票結果,判斷是否可以進⾏提交區塊的動 作。

對於節點 u 在第 H ⾼度、第 R 回合會遵守以下規則:

• 收集 Precommit 直到 LocksetPrecommit, H, R, u合法。

等待直到 TimeoutPrecommit的時間,讓 LocksetPrecommit, H, R, u蒐集更多

Precommit

如果存在 Quorum(LocksetPrecommit, H, R, u

) = B

,則提交區塊 B ⾄區塊鏈上完成

⾼度 H 的共識。

如果 Quorum(LocksetPrecommit, H, R, u

)

不存在,則進⼊第⼀階段 Propose 且令回 合為 R+1。

3.3 Timeout

共識中的 Timeout 會隨著 R 的增加進⾏指數型成⾧其成⾧公式為:

Timeout

X, R

= Timeout

X

* TimeoutFactor

R

其中 X 為 Propose、Prevote 或 PrecommitTimeoutX則為每個 timeout 在 R=0 的起始值。

此⽬的為讓整個網論在傳遞訊息時可能的延遲不會成⾧的⽐ Timeout 時間還快,讓整 體網路可以處於 partial synchrony 的環境。

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

假設網路中有 F 個節點為拜占庭錯誤節點且整個網路有 N = 3F+1 個節點。當某⼀

節點在第四步驟成功提交⼀個區塊 B 時代表他已經收到⾄少 2F+1 個 Precommit 投給

B,也代表⾄少 F+1 個誠實節點已經有 Quorum(LocksetPrevote

) = B

的共識。在這個狀況 下如果有令⼀個區塊 B’被提交成功代表有另外 F+1 個誠實節點有

Quorum(Lockset

Prevote

) = B’

,那整個網路就會與先前的假設 N = 3F+1 產⽣⽭盾。

3.5 活性(Liveness)

假設有⅓ N 以上的節點存在不同的 Quorum(LocksetPrevote

)

,則 Proposer 所提出的

Proposal

VotingInstruction, H, R, u

(B)

會指⽰收到此訊息的節點投給其區塊,讓整個網路的

Prevotes

收斂⾄其中該區塊。

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

第四章 系統架構

本論⽂透過詳盡研究以太坊提供的開放源碼與徹底理解 Hydrachain 共識演算法,採⽤

重構(Refactoring)的⼿法,就以太坊的架構與演算法的特性實作出模組化的共識引擎。

再依實作過程的發現,反饋與修正現有的共識演算法。並設計效能評估實驗,執⾏效 能評估實驗蒐集實驗數據,檢討實作或架構,進⾏必要的精進步驟以推出具 BFT-like 共識引擎的以太坊版本。⽬前以太坊有許多實作版本,本研究選擇 Golang 版本,稱為 Go Ethereum (geth),是⽬前實作最完善也最多⼈使⽤的版本 ,以下提到的以太坊即指 Go-Ethereum。

4.1 以太坊基本架構

NetWork。其中 BlockChain 實作區塊鏈的核⼼技術包含區塊、區塊鏈、交易與它們的 驗證機制,以及狀態資料庫等實現區塊鏈主要功能的部份。

由於原本以太坊就是以 PoW 為主,包含其共識⽅法、驗證機制原本是分布在不同 的模組底下,包含 Blockchain 模組與 Miner 模組。在 1.6 版本以後,開發⼈員新增了⼀

個 Consensus 模組,讓開發⼈員可以實作不同的共識機制。此模組包含了⼀個共識機 制介⾯,開發⼈員透過實作該介⾯所定義的函式,可以與其他模組溝通。當區塊要進

⾏驗證,或是如何取得共識的內容皆會在此模組底下。 Blockchain 模組或是 Miner 模 組可以透過呼叫共識引擎的介⾯取得該共識機制的演算法。⽬前此模組包含⼯作量證 明機制(ethash)與 Clique。Clique 為⼀種透過授權⽅式進⾏的共識機制,主要⽤於以 太坊的公有測試網路。NetWork 處理節點與節點之間的訊息包括如何傳遞交易、區塊 如何與其他節點同步等。除了上述核⼼架構之外以太坊最重要的⼀項技術即是可以透 過 EVM(Ethereum Virtual Machine) 執⾏智能合約,以便鏈上每個節點執⾏相同程式得 到相同結果,提供使⽤者以智能合約建⽴去中⼼化的應⽤程式。

我們的主要⽬標在於取代以太坊中的⼯作量證明共識機制,改⽤⽐較適合聯盟鏈 需求的 BFT-like 共識演算法。但有鑒於不同類型(偏同步與⾮同步)的 BFT-like 算法 有不同的優缺點,我們透過將 BFT-like 共識演算法實作於 Consensus 模組,建⽴⼀個 新的共識引擎,最⼩化對其他模組的影響。

的 BlockProposal Hash、Height、Round,也包含 Validator 的簽章。

l PrecommitVote:當進⾏ Precommit 階段時需要傳遞的訊息結構,表⽰該節 點已經準備進⼊ Commit 階段,PrecommitVote 包含該節點所要提交的 Proposal Hash、Height、Round,也包含 Validator 的簽章。

l Lockset:儲存 Vote 的結構,包含多個 Vote,每個回合會有⼀個 Lockset 去

l PrecommitLockset:儲存 PrecommitVote 的結構,包含多個 Vote,每個回合 會有⼀個 Lockset 去儲存 PrecommitVote。Lockset 也要負責判斷其是否包含 Quorum。

l BlockProposal:BlockProposal 包含⼀個要進⾏共識的區塊、當前進⾏的共 識 Height 與 Round。BlockProposal 可能會包含⼀個 Lockset 或

PrecommitLockset,以證明⾃⼰所提出的 BlockProposal 是合法的。

l VotingInstruction:VotingInstruction 包含⼀個要進⾏共識的區塊、當前進⾏

的共識 Height 與 Round,且也包含⼀個 Quorum 的 Lockset 以證明此區塊已 經經過超過 2/3 以上的節點⽀持。

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

共識,只收到新的區塊卻沒收到該區塊的證明,該節點必須向其他節點要求它看到的 區塊證明,如果的確收到該區塊的證明,則可以將之提交⾄區塊鏈,反之則驗證失 敗。

4.3 共識模組架構

本章節介紹我們實作拜占庭容錯共識的架構與機制。如圖 3.3,共識模組底下包含處理 訊息的 message handler、同步訊息的 synchronizer、與三個主要做共識的模組,

ConsensusManager、HeightManager 與 RoundManager。

引擎需要交換彼此的資訊才能完成共識,所以在引擎中加⼊此 message handler。由於 以太坊在原本使⽤共式引擎的基礎上也有⾃⼰定義的通訊協定,所以此 message 執⾏共識,必須先與其他節點同步到最新狀態,所以需要 Synchronizer 進⾏這動作。

引擎需要交換彼此的資訊才能完成共識,所以在引擎中加⼊此 message handler。由於 以太坊在原本使⽤共式引擎的基礎上也有⾃⼰定義的通訊協定,所以此 message 執⾏共識,必須先與其他節點同步到最新狀態,所以需要 Synchronizer 進⾏這動作。

相關文件