Hyperledger Fabric 中智慧合約的基本元件概述
作者: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 類的例子,下面是對其關鍵方法的簡要說明:
建構函式
Contract類中的建構函式有一個name變數作為可選輸入引數,用於為您的智慧合約命名。如果未提供該引數,則建構函式會使用類名。
isContract 方法
該函式用於識別作為輸入傳遞的物件是否為合約型別。它在成功檢查時返回 true。
beforeTransaction 方法
該函式會在呼叫智慧合約中的任何交易函式之前被呼叫。您可以覆蓋預設方法並替換成您自己的邏輯。
afterTransaction 方法
該函式在呼叫特定的交易函式之後呼叫此函式。您可以覆蓋預設方法並替換成您自己的邏輯。
unknownTransaction 方法
當智慧合約中不存在請求交易函式時,將呼叫此功能。您可以覆蓋預設方法並改用您自己的邏輯。
createContext 方法
此函式用於建立您自己的自定義交易物件,在呼叫事務函式時可以訪問該物件以進行額外處理。
getName 方法
這是一個簡單的 getter 函式,它返回合約名稱
II - 鏈碼中的Contract結構
Fabric-contract-api 和 fabric-shim 是在 Hyperledger 結構中編寫鏈碼所需的兩個重要依賴項。當我們使用 node.js 開發鏈碼時,我們需要在 package.json 檔案中新增依賴項,如下所示:
網路中的peer節點,使用啟動命令 fabric-chaincode-node start 來啟動使用。這條啟動鏈碼的指令匯出在 index.js 檔案中,該檔案也是應用的主入口點。
lib 目錄可以包含一個或多個從 Contract 類派生的智慧合約。此外,我們還可以有一個測試目錄,其中將包含測試合同的測試用例。鏈碼資料夾結構如下:
III - 鏈碼中的ChaincodeStub 介面
在 Hyperledger Fabric 中,每個鏈碼都實現了在 Shim 包中定義的鏈碼介面,並定義了兩個在交易被請求時呼叫的重要方法:
如您所見,該介面實現了兩個方法: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容器的日誌可以透過以下命令來輸出:
總結
在本文中,我們學習了鏈碼在透過 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 籌集資金。 nd-64047871
關於 Navil Rodrigues
Navil 是來自 Linux 基金會認證的 Hyperledger Fabric 開發人員 (CHFD)。目前,他在 Mckinley Rice 擔任區塊鏈開發人員,負責為以太坊和側鏈(如 Binance Smart Chain、Polygon 等)編寫和實施智慧合約。他還涉足開發和設計 ICO 合約和橋接解決方案以連線不同的鏈。此外,他還擁有從頭到尾構建全棧和去中心化應用程式的經驗。 odrigues-295784a4/
文章來源:Hyperledger超級賬本
文章原標題:《Hyperledger Fabric 中智慧合約的基本元件概述》
如有侵權請與我們聯絡刪除。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012206/viewspace-2926381/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 2.06 hyperledger fabric智慧合約
- Hyperledger Fabric 2.x 自定義智慧合約
- 區塊鏈100講:Hyperledger Fabric 中的鏈碼(智慧合約)區塊鏈
- Hyperledger Fabric 2.x 動態更新智慧合約
- Hyperledger Fabric 智慧合約開發及 fabric-sdk-go/fabric-gateway 使用示例GoGateway
- Hyperledger Fabric Node.js 智慧合約鏈碼開發Node.js
- Hyperledger Fabric 使用 CouchDB 和複雜智慧合約開發
- Hyperledger Fabric Node.js 智慧合約即鏈碼開發Node.js
- 區塊鏈Hyperledger Fabric 2.x 自定義智慧合約區塊鏈
- Hyperledger Fabric的基本功能
- Hyperledger Fabric(Hyperledger Fabric模型)模型
- 死磕hyperledger fabric原始碼|Order節點概述原始碼
- Hyperledger Fabric部署的坑(更新中)
- Hyperledger Fabric 部署
- Solidity語言學習筆記————31、智慧合約的基本檔案結構概述Solid筆記
- 2.01 hyperledger fabric概念
- Hyperledger Fabric 核心概念
- Fabric 2.x 智慧合約開發記錄
- 【Hyperledger Fabric】Fabric 2.2 手動安裝
- 2.02 hyperledger fabric入門
- 2.08 hyperledger fabric完整案例
- Hyperledger Fabric(分類賬)
- Hyperledger Fabric on SAP Cloud PlatformCloudPlatform
- fabric sdk : org.hyperledger.fabric.sdk.exception.ProposalExceptionException
- 2.04 hyperledger fabric共識排序排序
- 2.07 hyperledger fabric鏈碼案例
- Hyperledger Fabric 2.0 Alpha釋出了!
- 2.03 hyperledger fabric系統架構架構
- 2.05 hyperledger fabric賬本儲存
- Hyperledger Fabric命令詳解之 up
- hyperledger fabric - chaincode fingerprint mismatch data mismatchAI
- Hyperledger Fabric部署與測試(Ubuntu)Ubuntu
- 1-Hyperledger Fabric概念詳解
- Hyperledger fabric 鏈碼篇GO(四)Go
- Hyperledger Fabric系統鏈碼介紹
- 在Ubuntu上部署Hyperledger Fabric環境Ubuntu
- Hyperledger Fabric 2.x 環境搭建
- HyperLedger/Fabric SDK使用Docker容器映象快Docker