Hyperledger Fabric 中智慧合約的基本元件概述

BSN研習社發表於2022-12-02

作者:Matt Zand and Navil Rodrigues

譯者 宋丹陽

Hyperledger Fabric 的架構在設計上,就包含了對執行企業級區塊鏈應用的,至關重要的基本元件。事實上,隨著大型專案開始大規模的安全、實時地管理大量交易,Hyperledger Fabric 的能力得到了充分的理解和讚賞。

正如此,與以太坊等公共區塊鏈平臺不同,Hyperledger Fabric 的學習曲線會相對陡峭;但是,當您的應用投入生產環境或是當您負責擴充套件它的運營時,這些耐心學習將得到回報。

智慧合約,或者叫鏈碼,在 Hyperledger Fabric 中發揮著比其他元件更重要的作用。的確,作為一名專業的 Hyperledger Fabric 開發者,你應該逐漸掌握鏈碼從邏輯設計到開發、測試和部署的方方面面。與以太坊不同,在一個鏈碼中,您可以同時執行多個智慧合約。實際上,在聯盟模型中,每個成員都可以在其節點中擁有自己的智慧合約。這包括了在私有通道內與其他成員通訊的智慧合約,以及連線到 Orderer節點 和系統管理節點的系統智慧合約。正是因為鏈碼如此重要,在本文中我們將簡要介紹其中的關鍵部分。

作為開發人員,您需要知道使用 JavaScript 程式語言,是在鏈碼中編碼和為 Hyperledger Fabric 開發智慧合約的最簡單方法(儘管您也可以使用 Java、Python 或 Go)。同時,您可以選擇任意的文字編輯器來開發。當您完成基本的設定之後,您應該瞭解以下用於開發 Fabric 鏈碼的基本概念:

  • Contract 類

  • Contract 結構

  • ChaincodeStub 介面

  • 分散式賬本資料表示

  • 鏈碼中的日誌

在接下來的部分中,我們將向您簡要介紹這些概念,並向您展示如何以及在何處使用它們。

I - 鏈碼中的Contract類

在 Hyperledger Fabric 中,智慧合約需要繼承Contract類的所有方法,這個類包含在 fabric-contract-api npm 包中。這些不同的方法被呼叫以響應在鏈上的交易。下面是一個從合約 API 繼承 Contract 類的例子,下面是對其關鍵方法的簡要說明:

undefined

建構函式

Contract類中的建構函式有一個name變數作為可選輸入引數,用於為您的智慧合約命名。如果未提供該引數,則建構函式會使用類名。

isContract 方法

該函式用於識別作為輸入傳遞的物件是否為合約型別。它在成功檢查時返回 true。

beforeTransaction 方法

該函式會在呼叫智慧合約中的任何交易函式之前被呼叫。您可以覆蓋預設方法並替換成您自己的邏輯。

afterTransaction 方法

該函式在呼叫特定的交易函式之後呼叫此函式。您可以覆蓋預設方法並替換成您自己的邏輯。

unknownTransaction 方法

當智慧合約中不存在請求交易函式時,將呼叫此功能。您可以覆蓋預設方法並改用您自己的邏輯。

createContext 方法

此函式用於建立您自己的自定義交易物件,在呼叫事務函式時可以訪問該物件以進行額外處理。

getName 方法

這是一個簡單的 getter 函式,它返回合約名稱

II - 鏈碼中的Contract結構

Fabric-contract-api 和 fabric-shim 是在 Hyperledger 結構中編寫鏈碼所需的兩個重要依賴項。當我們使用 node.js 開發鏈碼時,我們需要在 package.json 檔案中新增依賴項,如下所示:

undefined

網路中的peer節點,使用啟動命令 fabric-chaincode-node start 來啟動使用。這條啟動鏈碼的指令匯出在 index.js 檔案中,該檔案也是應用的主入口點。

undefined

lib 目錄可以包含一個或多個從 Contract 類派生的智慧合約。此外,我們還可以有一個測試目錄,其中將包含測試合同的測試用例。鏈碼資料夾結構如下:

undefined

III - 鏈碼中的ChaincodeStub 介面

在 Hyperledger Fabric 中,每個鏈碼都實現了在 Shim 包中定義的鏈碼介面,並定義了兩個在交易被請求時呼叫的重要方法:

undefined

如您所見,該介面實現了兩個方法:Init 和 Invoke。當鏈碼首次部署在 Docker 容器中時,會呼叫 Init 來初始化鏈碼的內部資料。但是,Invoke 方法被後續交易用於修改或讀取賬本;請注意,由於事務操作而修改的狀態變數只有在事務提交時才會提交到賬本。

這兩種方法都接受一個型別為 chaincodeStubInterface 的 stub 引數。在鏈碼中,每個函式都有一個 ctx 物件。該物件包含 chaincodeStubInterface 實現的上下文物件,它提供了與世界狀態、私有集合、發出事件、跨鏈碼呼叫等互動的基本API。

IV - 分散式賬本資料

在 Hyperledger Fabric 中,Ledger 是一個不可或缺的元件。透過參與網路的節點的共識來向Ledger中新增或修改資料。它有兩個不同但相關的組成——世界狀態(World State)和區塊鏈(Blockchain)。

世界狀態(World State) —— 是一個儲存當前和最新值的資料庫。世界狀態有助於鏈碼快速獲取資料的當前資料,而不用遍歷整個交易日誌然後再計算得出。賬本中記錄的資料或狀態用鍵值對錶達。有兩種可用的資料庫選項——Leveldb 和 Couchdb

區塊鏈(Blockchain)—— 當前世界狀態發生的所有變化都被記錄為交易日誌。形成的交易被收集在區塊內並附加到區塊鏈,允許任何人檢視所儲存資產狀態的歷史記錄。區塊鏈資料結構是不可變的;這意味著一旦進行了修改,區塊鏈上的內容就無法變更;如果進行了變更,它將會形成一個新的狀態。

與賬本資料的簡單互動-putState, getState 和 delState

正如前文所述,賬本的狀態表示為鍵值對。與它們互動的最簡單方法就是使用 chaincodeStub 介面提供的 API。我們將展示最重要的,也是最基礎的,用於查詢、修改和刪除賬本狀態的 API。

putState – API 需要一個鍵(字串)和一個值(位元組陣列)。用於形成要提交到賬本上的資料寫入請求;請注意,只有在網路中的對等方驗證併成功提交交易後,賬本才會受到影響。鍵不應為空,也不應以空字元開頭。

getState – API 需要一個鍵(字串)。它將返回該鍵在賬本中對應的值。如果狀態資料庫中不存在該鍵,則返回空陣列。

delState – API 需要一個鍵(字串)。它會形成一個從分類帳狀態中刪除記錄的請求。操作成功後,鍵及其對應的值從世界狀態中被標記為刪除。但是,該記錄仍將在區塊鏈中可用並且可以重新取回。

V - 鏈碼中的日誌

日誌是軟體開發過程中最重要的部分。它透過分析資料、解決錯誤和及早發現問題來幫助您做出重要決策。鏈碼日誌記錄是鏈碼開發人員的最終責任。

任意能夠將訊息列印到stdout或者stderr的日誌工具,都可以被應用於檢視相關的Docker容器,Docker容器的日誌可以透過以下命令來輸出:

undefined

總結

在本文中,我們學習了鏈碼在透過 Hyperledger Fabric 構建私有區塊鏈應用程式中的重要性。我們還回顧了鏈碼的所有必須的元件,包括它的Contract類、結構等。

如果您正在準備認證 Hyperledger Fabric 開發人員 (CHFD) 考試,那麼本文是一個很好的起點。作為本文的後續內容,您需要探索鏈碼的生命週期,並對帳本資料執行一些從簡單到複雜的查詢。此外,還可以透過 Node.JS SDK 探索 Hyperledger Fabric V2 中引入的鏈碼外部啟動器。

關於 Matt Zand

Matt 是一位連續創業者,也是五家科技初創公司的創始人:RealBig、DC Web Makers、HashFlow、Coding Bootcamps 和 High School Technology Services。他是 O'Reilly Media 的 Hyperledger Fabric 實踐智慧合約開發一書的主要作者。他在 IBM、SAP、阿里雲、Hyperledger、Linux 基金會等網站上為 Hyperledger、Ethereum 和 Corda R3 平臺撰寫了 100 多篇關於區塊鏈開發的技術文章和教程。在 RealBig,他帶領一個區塊鏈專家團隊建立了一個虛擬聯盟,將 NFT 與 DeFi 相結合,同時透過 ICO 籌集資金。

關於 Navil Rodrigues

Navil 是來自 Linux 基金會認證的 Hyperledger Fabric 開發人員 (CHFD)。目前,他在 Mckinley Rice 擔任區塊鏈開發人員,負責為以太坊和側鏈(如 Binance Smart Chain、Polygon 等)編寫和實施智慧合約。他還涉足開發和設計 ICO 合約和橋接解決方案以連線不同的鏈。此外,他還擁有從頭到尾構建全棧和去中心化應用程式的經驗。

文章來源:Hyperledger超級賬本

文章原標題:《Hyperledger Fabric 中智慧合約的基本元件概述》

如有侵權請與我們聯絡刪除。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012206/viewspace-2926381/,如需轉載,請註明出處,否則將追究法律責任。

相關文章