Hyperledger Fabric 筆記(二)
Hyperledger Fabric 交易的儲存與驗證
本系列文章是以 Blockchain with Hyperledger Fabric, Second Edition 書中的內容為基礎,配合一些實務上遇到的問題所做的筆記。
在區塊鏈系統中,帳本與資料庫的運作雖然看似相似,但兩者間存在一個關鍵的不同點。帳本僅允許交易的添加,不允許修改和移除。正因為如此,我們將寫入區塊鏈的交易視為不可變的。
驗證
所有記錄在帳本上的交易都會經過兩個完整性檢查:
- 業務對象的更改是有效的:需要確認修改前的狀態與帳本狀態一致。
- 所有必要的組織都同意變更:需要所有必要的背書節點背書。
所有被寫入區塊中的交易都會被確認,並標記為有效或無效的交易。所有交易都會被記錄在區塊中,但只有有效的交易會影響後續流程。
MVCC(多版本控制)
Hyperledger Fabric 使用 MVCC 機制來確保帳本的一致性並避免雙重花費產生。例如,攻擊者可能透過手段讓同一枚代幣被多次使用,這會造成帳本結果不一致。傳統的中心化系統可能會透過鎖定機制避免同一鍵值被重複修改,但在去中心化的 Fabric 網路中無法做到這一點。
MVCC 是一種用於處理交易的並發執行和隔離的機制。它允許在一個數據庫中同時存在多個版本的數據,並且允許用戶在不干擾其他用戶的情況下執行交易。數據庫在執行交易時會在背景中創建一個新版本的數據,並在交易完成後將該版本提交到數據庫中。當另一個用戶執行交易時,數據庫會再次創建一個新版本的數據,從而同時存在多個數據版本。在讀取數據時,數據庫會選擇最新版本並返回給用戶。這樣,用戶就可以在不干擾其他用戶的情況下安全地讀取數據/執行交易。版本的儲存是透過讀寫集來進行的。
帳本
區塊儲存的是交易資料,物件狀態則儲存在狀態資料庫中。這兩者是應用程式與智能合約主要互動的對象。區塊鏈是帳本的核心組件,即使狀態資料庫被刪除或遺失,我們仍然可以透過區塊鏈的交易資料重新生成物件狀態。但如果區塊鏈遺失,則無法再重新獲取過去的交易歷史。
狀態資料庫(State Database)
狀態資料庫儲存所有物件的狀態,因此是最常被讀取的帳本組件。它被稱為世界狀態(World State)。與比特幣等區塊鏈不同,帳本不必每次都計算過往的交易來獲得現有狀態,而是直接從狀態資料庫讀取。
狀態
狀態的結構是一組鍵值對(key-value pairs),鍵值為物件的名稱(例如:CAR1),而其值則是名稱值對(name-value pairs),記載該物件的詳細資訊(例如:Owner: Sara)。
狀態集合(State Collections)
我們將世界狀態視為帳本的預設集合。此外,也可以創建指定的集合。例如,將車子的品牌、型號等資訊儲存在世界狀態中,而將擁有者、車輛編號等私密資料儲存在另一個集合中。
交易流程
-
應用程式提交交易:應用程式提交交易到區塊鏈網路中,這裡可以想像應用程式實際上是在說「我希望將 CAR1 的擁有者由 Sara 轉移給 Bob。」應用程式只能完成交易流程中的提交部分。
-
背書請求:Fabric 確認背書策略(endorsement policy),並將交易發給相應組織的節點上的智能合約。
-
合約執行:智能合約訪問帳本,透過輸入的值計算輸出結果。合約回傳的內容包含before-image和after-image,但不會對帳本產生更改。
-
簽名與交易組裝:節點上的合約傳回結果後,每個節點將結果簽名並組裝。交易會被放進塊中,通常節點回傳結果一致,否則會根據大多數相同結果來決定。
-
共識與寫入區塊鏈:最終的共識發生在第五步,所有交易被放入區塊鏈,但只有有效交易會改變物件狀態。即使節點無權參與交易,也可判斷交易簽章是否合法。
如果交易結果不一致,則會根據endorsement policy做出判斷,如果endorsement policy規定需要所有簽章,則即使大部分相同,該交易依然為無效交易。
智能合約
背書政策(Endorsement Policy)
背書政策是隨著智能合約一起運行的,每個智能合約都有特定的背書政策。這是 Hyperledger Fabric 與比特幣或以太坊區塊鏈的不同之處。雖然背書政策與智能合約綁定,但兩者可以分開處理。例如,當有新的組織加入網絡時,可以單獨更改背書政策,而無需更新智能合約。
背書政策可以設為以下幾種形式:
AND('ORG1.Member', 'ORG2.Member')
OR('ORG1.Member', 'ORG2.Member', 'ORG3.Member')
OUTOF(2, 'ORG1.Member', 'ORG2.Member', 'ORG3.Member')
儘管背書政策是對所有組織公開的,但合約本身則不是,這確保了合約內部的業務邏輯對所有組織保持隱藏。
基於狀態的背書(State-based Endorsement)
背書政策甚至可以針對單獨物件進行設定。舉例來說,如圖所示,CAR1 如果要更新狀態,則必須由 Sara 簽章。如果 CAR1 被轉移給了 Bob,背書政策也需要相應地修改。