這篇文章主要介紹Fabric2.0中如何實(shí)現(xiàn)鏈碼管理,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都工商代辦小微創(chuàng)業(yè)公司專業(yè)提供成都企業(yè)網(wǎng)站建設(shè)營(yíng)銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
Fabric-sample工程自帶了很多示例鏈碼,位于fabric-samples/chaincode目錄中,本文測(cè)試安裝abstore工程的go版本到org1.peer0和org2.peer0兩個(gè)節(jié)點(diǎn)。
鏈碼安裝成功之后,就可以調(diào)用鏈碼完成交易操作了。
安裝鏈碼的所有操作均需要先進(jìn)入cli容器,執(zhí)行如下命令:
docker exec -it cli bash
鏈碼打包執(zhí)行如下命令:
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:智能合約標(biāo)簽,起描述作用
執(zhí)行成功之后,當(dāng)前目錄下將生成文件abs.tar.gz。
本節(jié)將把上述打包的代碼安裝到org1.peer0和org2.peer0兩個(gè)節(jié)點(diǎn)上,因此需要切換環(huán)境變量。
通過命令查看當(dāng)前使用的是org1.peer0的環(huán)境。
執(zhí)行鏈碼安裝命令,則可以把上述打包的合約代碼安裝到org1.peer0節(jié)點(diǎn)上。
peer lifecycle chaincode install abs.tar.gz
執(zhí)行結(jié)果如下:
查看安裝結(jié)果,執(zhí)行命令:
peer lifecycle chaincode queryinstalled
接下來為org2.peer0安裝智能合約代碼,執(zhí)行如下命令切換環(huán)境變量:
source scripts/utils.sh setGlobals 0 2
查看切換結(jié)果,如下圖所示:
執(zhí)行鏈碼安裝命令,則可以把上述打包的合約代碼安裝到org2.peer0節(jié)點(diǎn)上。
peer lifecycle chaincode install abs.tar.gz
鏈碼安裝完成之后需要被組織認(rèn)證,認(rèn)證通過之后才能將鏈碼提交并運(yùn)行,該過程又可以稱為合約定義,定義了合約的名稱、版本、序列號(hào),后續(xù)合約升級(jí)即修改版本或序列號(hào),重新定義合約。
執(zhí)行如下代碼,完成當(dāng)前節(jié)點(diǎn)所在組織對(duì)上述安裝鏈碼的認(rèn)證。
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
參照上節(jié)的方法切換環(huán)境,實(shí)現(xiàn)org2組織對(duì)上述安裝鏈碼的認(rèn)證。
最后查看鏈碼認(rèn)證結(jié)果,執(zhí)行如下命令:
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 1 --output json --init-required
上圖結(jié)果表示:通道m(xù)ychannel中的兩個(gè)組織Org1和Org2均已對(duì)智能合約鏈碼abs認(rèn)證通過。
只有通過組織認(rèn)證的鏈碼才能被提交。執(zhí)行如下命令提交鏈碼:
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
查看提交結(jié)果,執(zhí)行如下命令:
peer lifecycle chaincode querycommitted --channelID mychannel --name abs
鏈碼調(diào)用主要包括invoke和query兩個(gè)操作,本節(jié)將演示智能鏈碼數(shù)據(jù)初始化、數(shù)據(jù)查詢以及數(shù)據(jù)更新。
執(zhí)行如下命令調(diào)用鏈碼初始化方法,并指定初始化參數(shù)和值。
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"]}'
執(zhí)行如下命令查詢參數(shù)a的值。
peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'
執(zhí)行如下命令調(diào)用合約的invoke方法,實(shí)現(xiàn)參數(shù)a的值減少10,參數(shù)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"]}'
執(zhí)行結(jié)果如下圖所示:
鏈碼(合約)升級(jí)的關(guān)鍵之處在于合約定義,即4.1.3節(jié)的鏈碼認(rèn)證。升級(jí)鏈碼之后將重新定義合約,修改合約的版本號(hào)或者序列號(hào)。
巧婦難為無米之炊。升級(jí)鏈碼的第一步應(yīng)該是獲取合約代碼,獲取合約代碼有兩種方式:
根據(jù)4.1.1節(jié)鏈碼打包命令參數(shù)--path指定的路徑獲取代碼;
通過peer腳本獲取已安裝的合約代碼包,執(zhí)行如下命令:
#查看已安裝的合約代碼包,獲取對(duì)應(yīng)包的package-id值 peer lifecycle chaincode queryinstalled
執(zhí)行結(jié)果如下圖所示:
#下載指定合約代碼包 peer lifecycle chaincode getinstalledpackage --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6
執(zhí)行結(jié)果如下圖所示:
上圖中,我們可以看到當(dāng)前目錄下多了一個(gè)以package-id值命名的壓縮文件,重命名該文件為abs.tar.gz,通過tar命令查看該壓縮包包含一個(gè)json文件和一個(gè)壓縮包。Json文件是對(duì)壓縮包的描述,code.tar.gz則是合約源碼,是我們本次的修改目標(biāo),將該包解壓之后我們繼續(xù)接下來的操作。
假設(shè)大家已經(jīng)把下載的合約源碼包解壓了,或者找到了樣例自帶源碼的路徑,接下來開始修改合約代碼。
本次修改目標(biāo)文件為:abstore.go,增加一個(gè)Add函數(shù),具體內(nèi)容如下:
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 }
修改后的文件內(nèi)容如下圖所示:
代碼修改完成之后,重新打包,執(zhí)行如下命令:
peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1
執(zhí)行完成之后請(qǐng)自行檢測(cè)當(dāng)前目錄是否生成代碼包。
# 安裝鏈碼 peer lifecycle chaincode install abs.tar.gz # 查詢鏈碼安裝結(jié)果 peer lifecycle chaincode queryinstalled
執(zhí)行結(jié)果如下圖所示:
上圖結(jié)果表示:通道m(xù)ychannel中的兩個(gè)組織Org1和Org2對(duì)新打包的智能合約認(rèn)證通過。
重新提交合約與4.1.4節(jié)鏈碼提交使用相同的命令,唯一不同的就是sequence參數(shù)值為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
查看提交結(jié)果,如下圖所示:
從上圖的執(zhí)行結(jié)果來看,a的原值為90,調(diào)用add方法給a值增加30,再次查詢a的值為120,說明合約更新成功,新增的方法也調(diào)用成功。
之前的操作僅在org1.peer0和org2.peer0兩個(gè)節(jié)點(diǎn)上安裝并升級(jí)了鏈碼,org1.peer1和org2.peer1兩個(gè)節(jié)點(diǎn)未安裝鏈碼。當(dāng)運(yùn)行基于Fabric SDK編寫的Java代碼時(shí),調(diào)用查詢方法失敗,報(bào)錯(cuò)“abs鏈碼未安裝”,應(yīng)該是客戶端把請(qǐng)求發(fā)到了未安裝鏈碼的兩個(gè)節(jié)點(diǎn),基于此原因,補(bǔ)充本節(jié)內(nèi)容。
補(bǔ)充安裝鏈碼的步驟如下:
(1) 從已安裝的peer節(jié)點(diǎn)獲取安裝包
# 下載鏈碼包 peer lifecycle chaincode getinstalledpackage --package-id abs_1:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7 # 重命名鏈碼包 mv abs_1\:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7.tar.gz abs.tar.gz
(2)在org1.peer1和org2.peer1節(jié)點(diǎn)上安裝鏈碼
# 切換環(huán)境到org1.peer1 source scripts/utils.sh setGablobs 1 1 # 執(zhí)行安裝命令 peer lifecycle chaincode queryinstalled setGablobs 1 2 # 執(zhí)行安裝命令 peer lifecycle chaincode queryinstalled
(3) 獲得org1和org2兩個(gè)組織的認(rèn)證
本過程最重要的是注意sequence參數(shù)值,該值必須在sequence最新值上增加1,查詢?cè)撴湸a最新的sequence值,執(zhí)行如下命令:
peer lifecycle chaincode querycommitted --channelID mychannel --name abs
假如鏈碼abs的sequence最新值為2,則獲取組織認(rèn)證命令如下:
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個(gè)組織的任意節(jié)點(diǎn),執(zhí)行上述相同的命令。
最后查看認(rèn)證結(jié)果,必須兩個(gè)組織都認(rèn)證通過才行。
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 3 --output json --init-required
(4) 提交鏈碼
提交代碼同樣需要注意修改sequence參數(shù)即可,命令如下:
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
當(dāng)org1.peer1和org2.peer1兩個(gè)節(jié)點(diǎn)成功安裝鏈碼之后,ContractAPI的樣例代碼才能運(yùn)行成功,如果還是有問題,則需要檢查證書文件。
以上是“Fabric2.0中如何實(shí)現(xiàn)鏈碼管理”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!