您好,登錄后才能下訂單哦!
這篇文章主要介紹Fabric2.0中如何實現鏈碼管理,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
Fabric-sample工程自帶了很多示例鏈碼,位于fabric-samples/chaincode目錄中,本文測試安裝abstore工程的go版本到org1.peer0和org2.peer0兩個節點。
鏈碼安裝成功之后,就可以調用鏈碼完成交易操作了。
安裝鏈碼的所有操作均需要先進入cli容器,執行如下命令:
docker exec -it cli bash
鏈碼打包執行如下命令:
peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1
abs.tar.gz:打包合約包文件名
--path:智能合約路徑
--lang:智能合約語言,支持golang、Java、node
--label:智能合約標簽,起描述作用
執行成功之后,當前目錄下將生成文件abs.tar.gz。
本節將把上述打包的代碼安裝到org1.peer0和org2.peer0兩個節點上,因此需要切換環境變量。
通過命令查看當前使用的是org1.peer0的環境。
執行鏈碼安裝命令,則可以把上述打包的合約代碼安裝到org1.peer0節點上。
peer lifecycle chaincode install abs.tar.gz
執行結果如下:
查看安裝結果,執行命令:
peer lifecycle chaincode queryinstalled
接下來為org2.peer0安裝智能合約代碼,執行如下命令切換環境變量:
source scripts/utils.sh setGlobals 0 2
查看切換結果,如下圖所示:
執行鏈碼安裝命令,則可以把上述打包的合約代碼安裝到org2.peer0節點上。
peer lifecycle chaincode install abs.tar.gz
鏈碼安裝完成之后需要被組織認證,認證通過之后才能將鏈碼提交并運行,該過程又可以稱為合約定義,定義了合約的名稱、版本、序列號,后續合約升級即修改版本或序列號,重新定義合約。
執行如下代碼,完成當前節點所在組織對上述安裝鏈碼的認證。
peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6 --sequence 1 --waitForEvent
參照上節的方法切換環境,實現org2組織對上述安裝鏈碼的認證。
最后查看鏈碼認證結果,執行如下命令:
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 1 --output json --init-required
上圖結果表示:通道mychannel中的兩個組織Org1和Org2均已對智能合約鏈碼abs認證通過。
只有通過組織認證的鏈碼才能被提交。執行如下命令提交鏈碼:
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required
查看提交結果,執行如下命令:
peer lifecycle chaincode querycommitted --channelID mychannel --name abs
鏈碼調用主要包括invoke和query兩個操作,本節將演示智能鏈碼數據初始化、數據查詢以及數據更新。
執行如下命令調用鏈碼初始化方法,并指定初始化參數和值。
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --isInit -c '{"Args":["Init","a","100","b","100"]}'
執行如下命令查詢參數a的值。
peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'
執行如下命令調用合約的invoke方法,實現參數a的值減少10,參數b的值增加10。
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
執行結果如下圖所示:
鏈碼(合約)升級的關鍵之處在于合約定義,即4.1.3節的鏈碼認證。升級鏈碼之后將重新定義合約,修改合約的版本號或者序列號。
巧婦難為無米之炊。升級鏈碼的第一步應該是獲取合約代碼,獲取合約代碼有兩種方式:
根據4.1.1節鏈碼打包命令參數--path指定的路徑獲取代碼;
通過peer腳本獲取已安裝的合約代碼包,執行如下命令:
#查看已安裝的合約代碼包,獲取對應包的package-id值 peer lifecycle chaincode queryinstalled
執行結果如下圖所示:
#下載指定合約代碼包 peer lifecycle chaincode getinstalledpackage --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6
執行結果如下圖所示:
上圖中,我們可以看到當前目錄下多了一個以package-id值命名的壓縮文件,重命名該文件為abs.tar.gz,通過tar命令查看該壓縮包包含一個json文件和一個壓縮包。Json文件是對壓縮包的描述,code.tar.gz則是合約源碼,是我們本次的修改目標,將該包解壓之后我們繼續接下來的操作。
假設大家已經把下載的合約源碼包解壓了,或者找到了樣例自帶源碼的路徑,接下來開始修改合約代碼。
本次修改目標文件為:abstore.go,增加一個Add函數,具體內容如下:
func (t *ABstore) Add(ctx contractapi.TransactionContextInterface, A string, X int) error { var err error //Get the state from the leger Avalbytes, err := ctx.GetStub().GetState(A) if err != nil { return fmt.Errorf("Failed to get state for " + A) } if Avalbytes == nil { return fmt.Errorf("Nil amount for " + A) } var Aval int Aval, _ = strconv.Atoi(string(Avalbytes)) Aval = Aval + X // Write the state back to the ledger err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval))) if err != nil { return err } return nil }
修改后的文件內容如下圖所示:
代碼修改完成之后,重新打包,執行如下命令:
peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1
執行完成之后請自行檢測當前目錄是否生成代碼包。
# 安裝鏈碼 peer lifecycle chaincode install abs.tar.gz # 查詢鏈碼安裝結果 peer lifecycle chaincode queryinstalled
執行結果如下圖所示:
上圖結果表示:通道mychannel中的兩個組織Org1和Org2對新打包的智能合約認證通過。
重新提交合約與4.1.4節鏈碼提交使用相同的命令,唯一不同的就是sequence參數值為2。
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required
查看提交結果,如下圖所示:
從上圖的執行結果來看,a的原值為90,調用add方法給a值增加30,再次查詢a的值為120,說明合約更新成功,新增的方法也調用成功。
之前的操作僅在org1.peer0和org2.peer0兩個節點上安裝并升級了鏈碼,org1.peer1和org2.peer1兩個節點未安裝鏈碼。當運行基于Fabric SDK編寫的Java代碼時,調用查詢方法失敗,報錯“abs鏈碼未安裝”,應該是客戶端把請求發到了未安裝鏈碼的兩個節點,基于此原因,補充本節內容。
補充安裝鏈碼的步驟如下:
(1) 從已安裝的peer節點獲取安裝包
# 下載鏈碼包 peer lifecycle chaincode getinstalledpackage --package-id abs_1:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7 # 重命名鏈碼包 mv abs_1\:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7.tar.gz abs.tar.gz
(2)在org1.peer1和org2.peer1節點上安裝鏈碼
# 切換環境到org1.peer1 source scripts/utils.sh setGablobs 1 1 # 執行安裝命令 peer lifecycle chaincode queryinstalled setGablobs 1 2 # 執行安裝命令 peer lifecycle chaincode queryinstalled
(3) 獲得org1和org2兩個組織的認證
本過程最重要的是注意sequence參數值,該值必須在sequence最新值上增加1,查詢該鏈碼最新的sequence值,執行如下命令:
peer lifecycle chaincode querycommitted --channelID mychannel --name abs
假如鏈碼abs的sequence最新值為2,則獲取組織認證命令如下:
peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7 --sequence 3 --waitForEvent
切換到另外1個組織的任意節點,執行上述相同的命令。
最后查看認證結果,必須兩個組織都認證通過才行。
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 3 --output json --init-required
(4) 提交鏈碼
提交代碼同樣需要注意修改sequence參數即可,命令如下:
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 3 --init-required
當org1.peer1和org2.peer1兩個節點成功安裝鏈碼之后,ContractAPI的樣例代碼才能運行成功,如果還是有問題,則需要檢查證書文件。
以上是“Fabric2.0中如何實現鏈碼管理”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。