鏈碼是Hyperledger Fabric技術架構中對智能合約的實現,支援業界流行的程式設計語言Golang,Node.js和Java,並不斷完善支援其他程式設計語言。本文介紹如何為通道部署新的鏈碼。
本章節適用於購買Fabric v2.2 或 v2.5執行個體的使用者,如果您是Fabric v1.4執行個體的使用者,請參見管理鏈碼(V1.4)部署鏈碼。
鏈碼服務化
在2022年9月29日之後部署的鏈碼執行個體,預設會開啟鏈碼服務化功能。
鏈碼服務化之前
Hyperledger Fabric的鏈碼容器基於Docker構建和運行,鏈碼執行個體與Peer執行個體的數量關係是一對一的關係,隨著業務規模地逐漸擴大,容器越來越多,一方面加大了營運人員的工作複雜程度,另一方面也給使用者增加了資源成本。
鏈碼服務化之後
Hyperledger Fabric的鏈碼容器基於K8s構建和運行,在最佳化資源配置、可靠性、穩定性方面都有很大的提升。具體來說,主要包含以下幾個優點:
鏈碼資源的彈性管理
預設情況下,在一個組織內,一份鏈碼啟動一個容器,並將鏈碼作為服務提供給peer調用。基於原生K8s,組織內所有Peer節點通過訪問同一個鏈碼服務,可以共用一個鏈碼容器,從而實現對鏈碼資源的彈性管理。
說明如您在業務上對鏈碼的擴縮容有需求,可通過提交工單聯絡售後工程師為您提供進一步服務。
高可用性
鏈碼容器被部署到K8s後,由原生K8s確保服務可靠性及擴縮容能力。
穩定性增強
鏈碼構建一次之後,即可被組織內的節點複用。當peer節點重啟時,可以省略掉原本的構建鏡像的步驟,快速拉起鏈碼容器,減小抖動。
打包鏈碼
使用者首先要在Hyperledger Fabric開發環境中進行鏈碼的開發,測試及打包:
鏈碼開發指南請參考智能合約簡介
鏈碼測試通過後需要用命令
peer lifecycle chaincode package進行打包。打包時建議包含所需依賴,以Golang鏈碼為例,通過以下步驟將依賴檔案置於vendor目錄下:使用 govendor 載入依賴
安裝govendor工具
go get -u -v github.com/kardianos/govendor進入到鏈碼專案的目錄,初始化vendor目錄;
govendor init將GOPATH中本工程使用到的依賴包自動移動到vendor目錄中;
govendor add +external
使用 go mod 載入依賴
初始化 mod
go mod init將依賴自動打包到 vendor 中
go mod vendor
打包命令具體內容請參見peer lifecycle chaincode命令。注意:
打包 Golang 鏈碼時,-p 參數要指向鏈碼 main package 所在的目錄在 $GOPATH/src 下的相對路徑;打包 Java 鏈碼時,-p 參數要指向Java的工程目錄;打包 Node.js 鏈碼時,-p 參數要指向包含 package.json 檔案的 Node.js 專案根目錄;-p 參數不要使用 “./xxx”的相對路徑格式。
如果鏈碼語言是 Golang, 則可以省略 -l 選項;如果鏈碼語言是 Node.js或者java,則使用參數 -l node 或者 -l java。
使用
--label指定鏈碼的預設鏈碼名稱及版本
以下樣本將 $GOPATH/src/github.com/hyperledger/fabric-samples/chaincode/sacc 目錄下的 Golang 鏈碼原始碼打包為 sacc.tar.gz 鏈碼標籤為 sacc_1_0。
peer lifecycle chaincode package -p github.com/hyperledger/fabric-samples/chaincode/sacc --label sacc_1_0 -l Golang sacc.tar.gzpeer下載地址:
新鏈碼的部署需要經過以下三個步驟,如果要升級通道中已有的鏈碼,請參見升級鏈碼:
上傳鏈碼
登入阿里雲BaaS控制台。
在概覽頁面,找到我的組織地區,找到目標組織,單擊組織的名稱。
單擊鏈碼包管理標籤頁。
單擊上傳鏈碼。
在彈出的對話方塊中,上傳在開發環境已經打包的鏈碼,具體打包方法參見上述的打包鏈碼。
單擊確定。

上傳鏈碼成功後,鏈碼包管理標籤頁的列表中會出現該鏈碼,其中標籤列顯示的鏈碼名稱是您在本地打包鏈碼時指定的。
安裝鏈碼
前提條件
您已上傳鏈碼。
操作步驟
登入阿里雲BaaS控制台。
在概覽頁面,找到我的組織地區,找到目標組織,單擊組織的名稱。
單擊鏈碼包管理標籤頁。
找到要安裝的鏈碼,在操作列中單擊安裝,即可將此鏈碼安裝在主要組織。
安裝過程中,進行一次鏈碼的先行編譯,檢查鏈碼包可能存在的問題。

此操作根據鏈碼依賴的複雜程度,需要數秒到數分鐘。安裝完成後,狀態由未安裝變為已安裝,操作列中的安裝變為提交定義。
提交鏈碼定義
前提條件
您已上傳鏈碼並安裝鏈碼。
操作步驟
登入阿里雲BaaS控制台。
在概覽頁面,找到我的組織地區,找到目標組織,單擊組織的名稱。
單擊鏈碼包管理標籤頁。
找到要提交定義的鏈碼,在操作列中單擊提交定義。
根據參數說明在彈框中填寫參數資訊。

參數
說明
名稱
系統自動顯示您在本地打包鏈碼時指定的鏈碼名稱。您可以保留該名稱,也可以修改為新的鏈碼名稱。
說明已經使用過的鏈碼名稱不能再次提交鏈碼定義。
版本
您提交鏈碼定義時,需要為鏈碼定義一個版本號碼
部署通道
選擇鏈碼部署的通道,部署成功後,該通道內的所有組織均可看到該鏈碼。關於如何建立通道,請參見建立通道。
是否初始化
支援:如果您的鏈碼實現了Init,需要先通過SDK發送特殊的初始化交易後,鏈碼才能被調用。即在被使用前需要進行初始化,則此處選擇 支援。
不支援:如果您的鏈碼未使用Init,不需要進行初始化,則此處選擇 不支援。
背書策略
背書策略舉例:
OR ('org0MSP.peer','org1MSP.peer')表示此通道中的兩個組織任何一方背書即可。AND ('org0MSP.peer','org1MSP.peer')表示需要此通道中的兩個組織背書。OutOf (a,'org0MSP.member','org1MSP.member','org2MSP.member'):當a為1時表示此通道中的三個組織任何一方背書即可,當a為2時表示至少需要兩個通道中的組織背書才行,當a等於組織數時,背書情況等同於AND。
說明其中
*.peer中的*由上圖中的MSP ID決定。進階
單擊 進階,您可以在 隱私集配置 輸入框中輸入您鏈碼的隱私集JSON定義資訊(如果您的鏈碼不需要使用隱私資料功能,您可以跳過此參數的設定)。隱私集JSON定義舉例:
[{"name": "collectionName", "policy": "OR('org0MSP.peer')", "memberOnlyRead": false, "requiredPeerCount": 0, "maxPeerCount": 3, "blockToLive": 0}]表示鏈碼需要使用一個叫做collectionName的隱私資料命名空間, 只有組織Org0的節點才能擷取該命名空間內的隱私資料。重要一旦隱私集的 name 和 blockToLive 被設定,您將不能在升級時對這兩個值做修改。更多資訊可以參考 Using Private Data in Fabric。
單擊提交。
操作成功後,您可以在鏈碼標籤頁下查看該鏈碼的狀態資訊,即通道狀態變為共識中,組織狀態顯示為處理完成,單擊操作列下的審批詳情可以查看該鏈碼的基本資料。

通道內其他組織確認並完成鏈碼的提交定義。
說明預設需要通道內50%的組織通過確認,才能最終提交鏈碼定義。
其他組織成員登入阿里雲BaaS控制台。
在概覽頁面,找到我的組織地區,找到目標組織,單擊組織的名稱。
單擊鏈碼標籤頁,在操作欄下單擊去處理。
在彈出的鏈碼處理頁中,確認該鏈碼提交的定義是否符合要求,如果符合,可直接單擊提交完成確認。
當通道內50%以上的組織完成確認後,鏈碼部署成功,在鏈碼頁簽下,可以看到通道狀態由原來的共識中變成運行中,操作欄增加了升級和顯示日誌的操作。
說明如果提交的鏈碼定義不符合要求,其他組織可以選擇不執行去處理,重新上傳自己的鏈碼包、安裝並提交鏈碼定義,此時提交的參數與原來提交的參數不一致,在鏈碼頁簽下,會存在多條共識資訊。