鏈碼是Hyperledger Fabric技術框架中對智能合約的實現,支持業界流行的編程語言Golang,Node.js和Java。本文介紹如何為通道部署新的鏈碼。
本章節適用于購買Fabric 1.4版本實例的用戶,如果您是Fabric 2.2 版本實例的用戶,請參見管理鏈碼(V2.2)部署鏈碼。
用戶首先要在Hyperledger Fabric開發環境中進行鏈碼的開發,測試及打包:
鏈碼開發指南請參見Chaincode for Developers
鏈碼測試通過后需要用命令
peer chaincode package
進行打包。打包時建議包含所需依賴,以Golang鏈碼為例,通過以下步驟將依賴文件置于vendor目錄下:安裝govendor工具
go get -u -v github.com/kardianos/govendor
進入到鏈碼項目目錄,初始化vendor目錄;
govendor init
將GOPATH中本工程使用到的依賴包自動移動到vendor目錄中;
govendor add +external
打包命令具體內容請參見peer 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。
如果鏈碼的初始化方法不需要傳入參數,則可以省略 -c 選項。
不要添加 -i,-S選項。
以下示例將 $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/example02 目錄下的 Golang 鏈碼源代碼打包為ccpack.out, 鏈碼名為mycc,版本1.0。
peer chaincode package ccpack.out -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/example02/cmd -c '{"Args":["init","a","100","b","200"]}' -v 1.0
peer
下載地址:
新鏈碼的部署需要經過以下三個步驟,如果要升級通道中已有的鏈碼,請參見升級鏈碼:
上傳鏈碼
安裝鏈碼
實例化鏈碼
上傳鏈碼
登錄阿里云BaaS控制臺。
在概覽頁面,找到我的組織區域,找到目標組織,單擊組織的名稱。
單擊鏈碼標簽頁。
單擊上傳鏈碼。
在彈出的對話框中,上傳在開發環境已經打包的鏈碼,打包方法如上所述。
選擇需要部署該鏈碼的通道。如果是新部署的鏈碼,請注意不要和任何一個通道內已存在的鏈碼同名。
填寫背書策略。
背書策略舉例:
OR ('Org1MSP.peer','Org2MSP.peer')
表示此通道中的兩個組織任何一方背書即可;AND ('Org1MSP.peer','Org2MSP.peer')
表示需要此通道中的兩個組織背書。單擊確定。
上傳鏈碼成功后,鏈碼標簽頁的列表中會出現該鏈碼。其中鏈碼列顯示的鏈碼名稱以及版本列顯示的鏈碼版本號都是您在本地打包鏈碼時指定的。
安裝鏈碼
前提條件
您已上傳鏈碼。
操作步驟
登錄阿里云BaaS控制臺。
在概覽頁面,找到我的組織區域,找到目標組織,單擊組織的名稱。
單擊鏈碼標簽頁。
找到要安裝的鏈碼,在操作列中單擊安裝,即可將此鏈碼安裝在本組織。
安裝完成后,安裝狀態由未安裝變為已安裝,操作列中的安裝變為實例化。
如果您上傳鏈碼時設置的背書策略為需要多個組織執行此鏈碼,那么還需要在其他組織的頁面中進行安裝。
實例化鏈碼
前提條件
您已上傳鏈碼以及安裝鏈碼。
操作步驟
登錄阿里云BaaS控制臺。
在概覽頁面,找到我的組織區域,找到目標組織,單擊組織的名稱。
單擊鏈碼標簽頁。
找到要安裝的鏈碼,在操作列中單擊實例化。
在彈出的對話框中,系統自動顯示您上傳鏈碼時填寫的背書策略。您可以保留該策略,也可以修改為新的策略。
背書策略舉例:
OR ('Org1MSP.peer','Org2MSP.peer')
表示此通道中的兩個組織任何一方背書即可;AND ('Org1MSP.peer','Org2MSP.peer')
表示需要此通道中的兩個組織背書。在對話中單擊 高級 , 您可以在 隱私集配置 輸入框中輸入您鏈碼的隱私集JSON定義信息(如果您的鏈碼不需要使用隱私數據功能,您可以跳過本步驟)。
隱私集JSON定義舉例:
[{"name": "collectionName", "policy": "OR('Org1MSP.peer')", "memberOnlyRead": false, "requiredPeerCount": 0, "maxPeerCount": 3, "blockToLive": 0}]
表示鏈碼需要使用一個叫做collectionName
的隱私數據命名空間, 只有組織Org1
的節點才能獲取該命名空間內的隱私數據。注意, 一但隱私集的
name
和blockToLive
被設置,您將不能在升級時對這兩個值做修改。更多信息可以參考 Using Private Data in Fabric。單擊實例化。
此操作根據鏈碼依賴的復雜程度,需要數秒到數分鐘。操作成功后通道狀態會由未實例化變為運行中,操作列的值變為空。