日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Fabric 链码Chaincode 的安装、初始化、调用、升级

發(fā)布時(shí)間:2025/3/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Fabric 链码Chaincode 的安装、初始化、调用、升级 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Fabric 鏈碼Chaincode 的安裝、初始化、調(diào)用、升級(jí) 

  • Fabric
  • ?
  • chaincode

上一篇文章,我們啟動(dòng)了一個(gè)Fabric網(wǎng)絡(luò),這篇文章來看看在Fabric網(wǎng)絡(luò)進(jìn)行應(yīng)用的開發(fā)。

上一篇文章,我們啟動(dòng)了一個(gè) Fabric 網(wǎng)絡(luò),這篇文章來看看在 Fabric 網(wǎng)絡(luò)進(jìn)行應(yīng)用的開發(fā)。

什么是 chaincode

chaincode 是 fabric 的智能合約,又叫做鏈碼。Chaincode 是生成交易 transacton 的唯一方式,是外界與區(qū)塊鏈系統(tǒng)交互的唯一渠道,開發(fā) Fabric 區(qū)塊鏈應(yīng)用就是要編寫 Chaincode, Chaincode 就是業(yè)務(wù)邏輯實(shí)現(xiàn)。

chaincode 生命周期

  • Install 安裝

    chaincode 要在 Fabric 網(wǎng)絡(luò)上運(yùn)行,必須要先安裝在網(wǎng)絡(luò)中的節(jié)點(diǎn) peer 上(可以理解為部署代碼),安裝同時(shí)注明版本號(hào)保證應(yīng)用的版本控制。

  • Instantiate 實(shí)例化

    在 peer 上安裝 chaincode 后,還需要實(shí)例化才能真正激活該 chaincode 。在實(shí)例化的過程中,chaincode 就會(huì)被編譯并打包成 docker 容器鏡像,然后啟動(dòng)運(yùn)行。每個(gè)應(yīng)用只能被實(shí)例化一次,實(shí)例化可在任意一個(gè)已安裝該 chaincode 的 peer 上進(jìn)行。

  • Invoke 調(diào)用,Query 查詢

    chaincode 在實(shí)例化后,用戶就能與它進(jìn)行交互,其中 query 查詢與應(yīng)用相關(guān)的狀態(tài)(即只讀),而 invoke 則可能會(huì)改變其狀態(tài)。

  • Upgrade 升級(jí)

    在 chaincode 更新代碼后,需要把新的代碼通過 install 交易安裝到正在運(yùn)行該 chaincode 的 peer 上,安裝時(shí)需注明比先前版本更高的版本號(hào),接下來向任意一個(gè)安裝了新代碼的 peer 發(fā)送 upgrade 交易就能更新 chaincode,chaincode 在更新前的狀態(tài)也會(huì)得到保留。

first network 示例

現(xiàn)在,我們?cè)?first network 的環(huán)境中,重新部署一個(gè)新的應(yīng)用,應(yīng)用邏輯是插入一個(gè)學(xué)生的成績(jī)(學(xué)生姓名,語文成績(jī),數(shù)學(xué)成績(jī)),然后計(jì)算總成績(jī)記錄到鏈上,通過學(xué)生姓名查詢學(xué)生的總成績(jī),鏈碼路徑放到fabric-samples/chaincode/win_test/src/fabric-chaincode目錄下,鏈碼下載地址是:https://gitee.com/zh5715615/fabric-chaincode.git。

先關(guān)掉 TLS

為了減少參數(shù)輸入,在這里不引入 TLS(安全傳輸層協(xié)議)功能,后面再進(jìn)行講解,我們關(guān)掉 tls 開關(guān):

  • 修改first-network/docker-compose-cli.yaml
  • 找到CORE_PEER_TLS_ENABLED=true,修改為CORE_PEER_TLS_ENABLED=false,如下:

    cli:container_name: cliimage: hyperledger/fabric-tools:$IMAGE_TAGtty: truestdin_open: trueenvironment:- GOPATH=/opt/gopath- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock#- FABRIC_LOGGING_SPEC=DEBUG- FABRIC_LOGGING_SPEC=INFO- CORE_PEER_ID=cli- CORE_PEER_ADDRESS=peer0.org1.example.com:7051- CORE_PEER_LOCALMSPID=Org1MSP- CORE_PEER_TLS_ENABLED=false
  • 修改first-network/base/peer-base.yaml
  • 找到CORE_PEER_TLS_ENABLED=true改為CORE_PEER_TLS_ENABLED=false

    找到ORDERER_GENERAL_TLS_ENABLED=true改為ORDERER_GENERAL_TLS_ENABLED=false

    如下:

    peer-base:image: hyperledger/fabric-peer:$IMAGE_TAGenvironment:- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock# the following setting starts chaincode containers on the same# bridge network as the peers# https://docs.docker.com/compose/networking/- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn- FABRIC_LOGGING_SPEC=INFO#- FABRIC_LOGGING_SPEC=DEBUG- CORE_PEER_TLS_ENABLED=false- CORE_PEER_GOSSIP_USELEADERELECTION=true- CORE_PEER_GOSSIP_ORGLEADER=false- CORE_PEER_PROFILE_ENABLED=true- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crtworking_dir: /opt/gopath/src/github.com/hyperledger/fabric/peercommand: peer node startorderer-base:image: hyperledger/fabric-orderer:$IMAGE_TAGenvironment:- FABRIC_LOGGING_SPEC=INFO- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0- ORDERER_GENERAL_GENESISMETHOD=file- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block- ORDERER_GENERAL_LOCALMSPID=OrdererMSP- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp# enabled TLS- ORDERER_GENERAL_TLS_ENABLED=false- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1- ORDERER_KAFKA_VERBOSE=true- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]

    進(jìn)入容器

    first network 的操作都是再 cli 容器中進(jìn)行的,進(jìn)入 cli 容器:

    docker exec -it cli bash

    鏈碼安裝

    cli 容器中,默認(rèn)的 peer 成員時(shí)peer0.org0,所以安裝鏈碼只是安裝在peer0.org0的節(jié)點(diǎn)上,如果要在其他節(jié)點(diǎn)安裝需要切換環(huán)境變量,鏈碼安裝操作如下:

  • 在 peer0.org1 上安裝 chaincode

    peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/
  • 在peer1.org1上安裝 chaincode

    CORE_PEER_ADDRESS=peer1.org1.example.com:8051 #切換節(jié)點(diǎn) peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/
  • 在peer0.org2上安裝 chaincode

    CORE_PEER_LOCALMSPID="Org2MSP" #切換組織 CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp #切換組織msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 #切換節(jié)點(diǎn) peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/
  • 在peer1.org2上安裝 chaincode

    CORE_PEER_ADDRESS=peer1.org2.example.com:10051 #切換節(jié)點(diǎn) peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/

    注意,如果要切回組織 1 時(shí),環(huán)境變量為:

    CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
  • 從上面的例子可以看到,如果不同的節(jié)點(diǎn)之間有不同的環(huán)境變量,而不同的組織環(huán)境變量和需要導(dǎo)入的 MSP(成員管理)不同,在使用時(shí)注意切換。如果是在非 docker 的真機(jī)環(huán)境下,不需要 cli 時(shí),則記得在peer node start啟動(dòng)前,配置好相應(yīng)的環(huán)境變量值。

    參數(shù)解析:

    • -n:指定鏈碼名稱
    • -v:指定鏈碼版本號(hào)
    • -l:指定鏈碼使用的語言,可以是 golang, java, nodejs
    • -p:指定鏈碼源碼目錄

    鏈碼安裝成功則顯示如下:

    response:<status:200 payload:"OK" >

    鏈碼初始化

    鏈碼的初始化只需要執(zhí)行一次,在任意節(jié)點(diǎn)上執(zhí)行都可以:

    peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n kpcc -l golang -v 1.0 -c '{"Args":[]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'

    參數(shù)解析:

    • -n:指定鏈碼名稱

    • -v:指定鏈碼版本號(hào)

    • -l:指定鏈碼使用的語言,可以是 golang, java, nodejs

    • -o:指定排序節(jié)點(diǎn)

    • -C:指定通道名

    • -c:指定初始化參數(shù)

      • -P:指定背書策略,上例中的背書策略是,兩個(gè)組織必須都參與鏈碼 invoke 或 query,chaincode 執(zhí)行才能生效。這個(gè)參數(shù)可為空,則任意安裝了鏈碼的節(jié)點(diǎn)無約束地調(diào)用鏈碼。

      鏈碼初始化成功則不會(huì)有 error 信息顯示。

    鏈碼執(zhí)行

    執(zhí)行鏈碼 Invoke,鏈碼的執(zhí)行在任意節(jié)點(diǎn)完成后,會(huì)將結(jié)果同步到其他節(jié)點(diǎn):

    peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n kpcc -c '{"Args":["invoke","Alice","98","92"]}'

    參數(shù)解析:

    • -n:指定鏈碼名稱
    • -o:指定排序節(jié)點(diǎn)
    • -C:指定通道名
    • -c:指定鏈碼執(zhí)行地參數(shù),如上例中有四個(gè)參數(shù),invoke 是方法,表示寫入,Alice 是學(xué)生名稱,98,92 是分?jǐn)?shù)

    以上的示例指令執(zhí)行會(huì)失敗,并不會(huì)記錄在鏈上,因?yàn)橛斜硶?guī)則,所以需要兩個(gè)組織一起參與背書,正確指令如下:

    peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n kpcc --peerAddresses peer0.org1.example.com:7051 --peerAddresses peer0.org2.example.com:9051 -c '{"Args":["invoke","Alice","98","92"]}'

    鏈碼執(zhí)行成功顯示如下:

    Chaincode invoke successful. result: status:200

    鏈碼查詢

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

    參數(shù)解析:

    • -n:指定鏈碼名稱
    • -C:指定通道名
    • -c:指定鏈碼執(zhí)行地參數(shù),如上例中有四個(gè)參數(shù),invoke 是方法,表示寫入,Alice 是學(xué)生名稱,98,92 是分?jǐn)?shù)

    鏈碼的查詢是不會(huì)記錄在鏈上的,只會(huì)從賬本中讀取記錄返回給用戶,此示例返回值是 190

    鏈碼查詢其實(shí)也可以用 invoke 來執(zhí)行,這樣就需要背書,且記錄上鏈。

    鏈碼更新

    鏈碼更新,首先要安裝鏈碼,更新一下版本號(hào):

    peer chaincode install -n kpcc -v 1.1 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/

    然后再更新鏈碼,參與同初始化一樣

    peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n kpcc -l golang -v 1.1 -c '{"Args":[]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'

    鏈碼更新只能在安裝了新版本鏈碼的節(jié)點(diǎn)上有效,老的節(jié)點(diǎn)仍然只能用舊的鏈碼,同樣,參與背書的節(jié)點(diǎn),也需要將鏈碼升級(jí),才能讓提交 Invoke 的操作背書通過。

    總結(jié)

    以上是生活随笔為你收集整理的Fabric 链码Chaincode 的安装、初始化、调用、升级的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲第一在线播放 | 国产精品入口66mio | 夫妻啪啪呻吟x一88av | 欧美日韩系列 | 欧美剧场| 久久y| 超碰在线最新地址 | 午夜寻花| 被扒开腿一边憋尿一边惩罚 | www色com| 国产精品视频免费在线观看 | 日韩视频一区二区三区四区 | 欧美老熟| 久久久久久久黄色 | 日韩成人短视频 | 狠狠老司机 | 欧美色一区二区三区在线观看 | 男人爱看的网站 | 波多野结衣 在线 | 人妻夜夜爽天天爽三区麻豆av网站 | 男人天堂网站 | 天堂av资源在线 | 亚洲精品一区二区在线观看 | 在线视频观看你懂得 | 欧美裸体网站 | 午夜精品一区二区三区在线播放 | 成人久久影院 | 超碰在线cao | 亚洲成人免费av | 日本高清不卡在线 | 女人喂男人奶水做爰视频 | 免费日本黄色 | 第一次破处视频 | 成人免费毛片入口 | 成人作爱视频 | 久久精品一区二区三区不卡牛牛 | 亚洲无码精品国产 | 毛片在线免费观看网站 | 亚洲中文一区二区 | 欧美cccc极品丰满hd | 青青草久 | 五月天婷婷久久 | 一级片视频免费 | 水蜜桃亚洲精品 | 国产三级午夜理伦三级 | 亚洲v国产v欧美v久久久久久 | 日韩一级片网站 | 尤物天堂 | 欧美成人看片黄a免费看 | 美女三级视频 | 九九免费 | 国产日产精品一区二区三区四区 | 色网在线 | 婷婷日 | 中文字幕免费 | 成人在线激情网 | 国产日日操 | www.欧美在线观看 | 天堂网视频在线观看 | 成人91视频| 毛片a区 | 女人高潮被爽到呻吟在线观看 | 色偷偷资源网 | 激情伊人 | 中文字幕女同 | 久久久久久久精 | 亚洲精选国产 | 久久人体 | 一道本在线 | 国产三级国产精品国产专区50 | 国产精品国语 | 欧美日韩一二三四区 | 日韩不卡 | 嫩草国产在线 | 91香蕉视频黄 | 国产视频a | 日本特黄视频 | 亚洲精品一区二区三区在线观看 | 禁漫天堂黄漫画无遮挡观看 | 久艹伊人 | 成人啪啪网站 | 牲欲强的熟妇农村老妇女视频 | 亚洲欧美日韩专区 | 欧美性潮喷xxxxx免费视频看 | 久久精品亚洲精品国产欧美 | 国产一区二区av | 精品无码成人久久久久久免费 | av日韩一区 | 97夜夜| 国产黄色小视频在线观看 | 日日拍夜夜拍 | 四虎永久免费地址 | 粉嫩欧美一区二区三区 | 国产又粗又猛视频 | 国产精品丝袜在线观看 | 日韩精品中文字幕一区二区三区 | 亚洲av无码片一区二区三区 | 欧美综合网站 | 本道综合精品 |