真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

這篇文章主要介紹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ù)。

4.1 安裝鏈碼

Fabric-sample工程自帶了很多示例鏈碼,位于fabric-samples/chaincode目錄中,本文測(cè)試安裝abstore工程的go版本到org1.peer0和org2.peer0兩個(gè)節(jié)點(diǎn)。

鏈碼安裝成功之后,就可以調(diào)用鏈碼完成交易操作了。

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

安裝鏈碼的所有操作均需要先進(jìn)入cli容器,執(zhí)行如下命令:

docker exec -it cli bash
4.1.1 鏈碼打包

鏈碼打包執(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。

4.1.2 鏈碼安裝

本節(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é)果如下:

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

查看安裝結(jié)果,執(zhí)行命令:

peer lifecycle chaincode queryinstalled

接下來為org2.peer0安裝智能合約代碼,執(zhí)行如下命令切換環(huán)境變量:

source scripts/utils.sh
setGlobals 0 2

查看切換結(jié)果,如下圖所示:

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

執(zhí)行鏈碼安裝命令,則可以把上述打包的合約代碼安裝到org2.peer0節(jié)點(diǎn)上。

peer lifecycle chaincode install abs.tar.gz
4.1.3 鏈碼認(rèn)證

鏈碼安裝完成之后需要被組織認(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)證通過。

4.1.4 鏈碼提交

只有通過組織認(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

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

4.2 調(diào)用鏈碼

鏈碼調(diào)用主要包括invoke和query兩個(gè)操作,本節(jié)將演示智能鏈碼數(shù)據(jù)初始化、數(shù)據(jù)查詢以及數(shù)據(jù)更新。

4.2.1 鏈碼初始化

執(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"]}'
4.2.2 數(shù)據(jù)查詢

執(zhí)行如下命令查詢參數(shù)a的值。

peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

4.2.3 數(shù)據(jù)更新

執(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é)果如下圖所示:

image-20200630143436878

4.3 升級(jí)鏈碼

鏈碼(合約)升級(jí)的關(guān)鍵之處在于合約定義,即4.1.3節(jié)的鏈碼認(rèn)證。升級(jí)鏈碼之后將重新定義合約,修改合約的版本號(hào)或者序列號(hào)。

4.3.1 獲取合約代碼

巧婦難為無米之炊。升級(jí)鏈碼的第一步應(yīng)該是獲取合約代碼,獲取合約代碼有兩種方式:

  • 根據(jù)4.1.1節(jié)鏈碼打包命令參數(shù)--path指定的路徑獲取代碼;

  • 通過peer腳本獲取已安裝的合約代碼包,執(zhí)行如下命令:

    #查看已安裝的合約代碼包,獲取對(duì)應(yīng)包的package-id值
    peer lifecycle chaincode queryinstalled

    執(zhí)行結(jié)果如下圖所示:

    Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

    #下載指定合約代碼包
    peer lifecycle chaincode getinstalledpackage --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6

    執(zhí)行結(jié)果如下圖所示:

    image-20200630143851638

    上圖中,我們可以看到當(dāng)前目錄下多了一個(gè)以package-id值命名的壓縮文件,重命名該文件為abs.tar.gz,通過tar命令查看該壓縮包包含一個(gè)json文件和一個(gè)壓縮包。Json文件是對(duì)壓縮包的描述,code.tar.gz則是合約源碼,是我們本次的修改目標(biāo),將該包解壓之后我們繼續(xù)接下來的操作。

4.3.2 修改合約代碼

假設(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)容如下圖所示:

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

4.3.3 重新打包合約

代碼修改完成之后,重新打包,執(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)前目錄是否生成代碼包。

4.3.4 重新安裝合約
# 安裝鏈碼
peer lifecycle chaincode install abs.tar.gz
# 查詢鏈碼安裝結(jié)果
peer lifecycle chaincode queryinstalled

執(zhí)行結(jié)果如下圖所示:

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

上圖結(jié)果表示:通道m(xù)ychannel中的兩個(gè)組織Org1和Org2對(duì)新打包的智能合約認(rèn)證通過。

4.3.6 重新提交合約

重新提交合約與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é)果,如下圖所示:

Fabric2.0中如何實(shí)現(xiàn)鏈碼管理

從上圖的執(zhí)行結(jié)果來看,a的原值為90,調(diào)用add方法給a值增加30,再次查詢a的值為120,說明合約更新成功,新增的方法也調(diào)用成功。

4.4 其他節(jié)點(diǎn)補(bǔ)充安裝鏈碼

之前的操作僅在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è)資訊頻道!


文章標(biāo)題:Fabric2.0中如何實(shí)現(xiàn)鏈碼管理
網(wǎng)頁地址:http://weahome.cn/article/ihogih.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部