中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Fabric2.0中如何實現鏈碼管理

發布時間:2021-12-28 10:19:05 來源:億速云 閱讀:132 作者:小新 欄目:互聯網科技

這篇文章主要介紹Fabric2.0中如何實現鏈碼管理,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

4.1 安裝鏈碼

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

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

Fabric2.0中如何實現鏈碼管理

安裝鏈碼的所有操作均需要先進入cli容器,執行如下命令:

docker exec -it cli bash
4.1.1 鏈碼打包

鏈碼打包執行如下命令:

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。

4.1.2 鏈碼安裝

本節將把上述打包的代碼安裝到org1.peer0和org2.peer0兩個節點上,因此需要切換環境變量。

通過命令查看當前使用的是org1.peer0的環境。

執行鏈碼安裝命令,則可以把上述打包的合約代碼安裝到org1.peer0節點上。

peer lifecycle chaincode install abs.tar.gz

執行結果如下:

Fabric2.0中如何實現鏈碼管理

查看安裝結果,執行命令:

peer lifecycle chaincode queryinstalled

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

source scripts/utils.sh
setGlobals 0 2

查看切換結果,如下圖所示:

Fabric2.0中如何實現鏈碼管理

執行鏈碼安裝命令,則可以把上述打包的合約代碼安裝到org2.peer0節點上。

peer lifecycle chaincode install abs.tar.gz
4.1.3 鏈碼認證

鏈碼安裝完成之后需要被組織認證,認證通過之后才能將鏈碼提交并運行,該過程又可以稱為合約定義,定義了合約的名稱、版本、序列號,后續合約升級即修改版本或序列號,重新定義合約。

執行如下代碼,完成當前節點所在組織對上述安裝鏈碼的認證。

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認證通過。

4.1.4 鏈碼提交

只有通過組織認證的鏈碼才能被提交。執行如下命令提交鏈碼:

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

Fabric2.0中如何實現鏈碼管理

4.2 調用鏈碼

鏈碼調用主要包括invoke和query兩個操作,本節將演示智能鏈碼數據初始化、數據查詢以及數據更新。

4.2.1 鏈碼初始化

執行如下命令調用鏈碼初始化方法,并指定初始化參數和值。

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 數據查詢

執行如下命令查詢參數a的值。

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

Fabric2.0中如何實現鏈碼管理

4.2.3 數據更新

執行如下命令調用合約的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"]}'

執行結果如下圖所示:

image-20200630143436878

4.3 升級鏈碼

鏈碼(合約)升級的關鍵之處在于合約定義,即4.1.3節的鏈碼認證。升級鏈碼之后將重新定義合約,修改合約的版本號或者序列號。

4.3.1 獲取合約代碼

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

  • 根據4.1.1節鏈碼打包命令參數--path指定的路徑獲取代碼;

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

    #查看已安裝的合約代碼包,獲取對應包的package-id值
    peer lifecycle chaincode queryinstalled


    執行結果如下圖所示:

    Fabric2.0中如何實現鏈碼管理

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


    執行結果如下圖所示:

    image-20200630143851638

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

4.3.2 修改合約代碼

假設大家已經把下載的合約源碼包解壓了,或者找到了樣例自帶源碼的路徑,接下來開始修改合約代碼。

本次修改目標文件為: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
}

修改后的文件內容如下圖所示:

Fabric2.0中如何實現鏈碼管理

4.3.3 重新打包合約

代碼修改完成之后,重新打包,執行如下命令:

peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1

執行完成之后請自行檢測當前目錄是否生成代碼包。

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

執行結果如下圖所示:

Fabric2.0中如何實現鏈碼管理

上圖結果表示:通道mychannel中的兩個組織Org1和Org2對新打包的智能合約認證通過。

4.3.6 重新提交合約

重新提交合約與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

查看提交結果,如下圖所示:

Fabric2.0中如何實現鏈碼管理

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

4.4 其他節點補充安裝鏈碼

之前的操作僅在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中如何實現鏈碼管理”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤庆县| 长乐市| 习水县| 望都县| 广昌县| 广饶县| 安溪县| 洪湖市| 太仓市| 丰顺县| 普兰县| 萍乡市| 南木林县| 溧水县| 孟连| 双鸭山市| 静宁县| 安远县| 开平市| 宝坻区| 图们市| 南郑县| 清原| 外汇| 峨山| 迭部县| 苗栗市| 罗城| 葵青区| 久治县| 炎陵县| 莱阳市| 高碑店市| 珲春市| 镇宁| 南部县| 昌宁县| 商河县| 南溪县| 谢通门县| 安溪县|