斜槓工程師的問題筆記

Hyperledger Fabric 筆記(七)

Hyperledger Fabric 的應用程式建置

本系列文章是以 Blockchain with Hyperledger Fabric, Second Edition 書中的內容為基礎,配合一些實務上遇到的問題所做的筆記。

網路運作與分散式應用程式建置(Network Operation and Distributed Application Building

根據先前的基礎知識,我們終於來到了實際的建置階段。對於一個區塊鏈網路來說,可能會涉及多個不同的組織或個人,每個組織或個人可能有著不同的業務邏輯需求。因此,為了滿足這些需求,開發人員需要為每個組織或個人開發不同的應用程式。這導致了單一區塊鏈網路能夠向不同的利益相關者提供不同的賬本視圖和合約功能。此外,這些應用程式可能運行在由不同組織獨立維護的企業安全域中。儘管如此,整個智能合約和更高層次的應用程式集合依然可以被視為在一個共同資料存儲層上操作的分散式應用程式。

應用程式模型與架構(Fabric application model and architecture)

在 Hyperledger Fabric 的架構中,我們可以將應用程式開發分為三層結構:

  1. 底層網路層(Network Layer):由節點、排序節點和證書授權中心(CA)組成,是應用程式的基礎設施。
  2. 服務層(Service Layer):中間層由一組服務組成,通常構建為提供 REST API 的 Web 服務器。每個服務都管理 Fabric 網絡的身份並使用 Fabric SDK 觸發智能合約上的交易和查詢。
  3. 表現層(Presentation Layer):通過終端機或瀏覽器作為用戶的接口,來調用中間層的 API 。

Fabric application model and architecture 如上圖,可以看到最底層是合約,中間層由一組服務組成,通常構建為可提供 REST API 的 Web 服務器,每個服務都管理 Fabric 網絡的身份並使用 Fabric SDK 觸發智能合約上的交易和查詢。最上層是表現層,透過終端機或瀏覽器作為用戶的接口,以調用中間層的 API 。

應用程式開發概覽

與傳統應用程式不同,每筆交易都是非同步的。交易結果不會在同一個溝通階段中回傳。根據前面的討論,可以知道他會經過三個不同的獨立階段。

  1. 用戶提交交易提案給節點背書
  2. 已經過背書的交易提案會提交給背書節點。並由背書節點分裝在區塊中。
  3. 網路中的節點驗證交易的有效性後將交易存入帳本資料庫中。

簡單來說,這是一種共識協議,網絡節點通過該協議共同批准一項交易,並且每個實例都可能花費無限的時間。因此,提交交易請求到智能合約就像提交工作請求,並且請求者會透過發布-訂閱機制使用事件獲得回應。 但上面的步驟可以隱藏(包裝)在 Fabric 提供的 SDK 中,分別有 Node.js、Java以及Go。 SDK 讓應用程式可以透過 gateway 以及 connection profile 提交交易並透過 gateway API 同步取得結果。SDK 也可以提供身份管理和在錢包中存儲憑據的功能,並且提供 API 功能來動態註冊具有所需角色和屬性的客戶端(通過連接到會員服務提供商 (MSP) 並自動將憑證存儲到錢包中)。Gateway的運作需要讀取錢包中的有效憑證。

網路設置

network setup and bootstrap 在啟動完節點之後,接下來要設定通道以及合約。

通道

一旦確定好通道的數量,並且為每一條通道設定了一個不重複的名稱後,就可以向排序服務提交創建通道的請求。此創建請求會被打包為塊放進由排序節點維護的系統通道中。

當通道成功創建後,每個該通道包含的組織的節點便可加入該通道,且這個過程會初始化該節點上屬於此通道的帳本(區塊鏈以及世界狀態)。在此階段,印為尚未安裝合約。每個加入通道的節點都只是提交節點。節點加入的行為是一個向排序節點提交的請求,並且會在通道帳本上生成一個新的區塊。

合約

接著會將合約安裝到通道中。首先,合約程式碼會被以一定的格式打包。一部分通道中的節點會被指定為具有合約背書資格的節點,且打包後的合約會安裝在這些背書節點上。接著,每個組織中負責維護通道的管理員必須各自允許(approve)該合約的定義,這個允許的行為也是向排序節點提交請求,並且會在通道帳本上生成區塊。最後,任何來自通道組織的管理員必須提交(commit)合約的定義到通道中,同樣的,這個動作也是提交至排序節點並生成通道中的區塊。 最後,每個合約都可以透過提交設置合約狀態的交易來完成初始化,這個步驟並非必須的。(在 Fabric 中是必須的)

指令順序

因為 Hyperledger Fabric 2中移除了透過 SDK 操作網路建置的方式,僅保留使用CLI,這裡就單純紀錄一下所需步驟。 註:現在依然可以使用 fabric-client 來操作這些功能,但比較複雜且該插件已棄用。

  1. 創建通道(Creating channels):創建通道並產生初始塊。
  2. 將節點加到通道中(Joining organization peers to channels):
  3. 在通道上設定組織的錨節點(Setting organization anchor peers on channels):錨節點是組織中負責與其他組織節點溝通的節點。
  4. 打包合約(Packaging a contract)
  5. 在節點上安裝合約(Installing a contract on peers)
  6. 允許通道上的合約定義(Approving a chaincode definition on the channel):合約定義包含一些屬性如下
  • Name:必須為通道中唯一的名字
  • Version:新版本,必須為對於該合約不重複的值
  • Sequence:紀錄合約被定義的次數
  • Endorsement policy:設定該合約上的交易必須經由哪個組織的簽章,透過AND以及OR。例如:AND('ExporterOrgMSP.member', 'ImporterOrgMSP.member', 'RegulatorOrgMSP.member').
  • Initialization:此為非必要選項,設定是否需要執行初始函式,在初始函式執行前,其他函式都無法被調用。嚴格來說,如果是使用 Fabric contract API 開發的合約是非必需的。(如果使用Fabric chaincode shim API 開發的則為必要)
  1. 提交合約定義到通道中(Committing a chaincode definition to the channel)
  2. 初始化合約(Initializing the contracts)

應用程式執行生命週期(Application runtime life cycle)

Application runtime life cycle

All rights reserved.