Fabric 链码Chaincode 的安装、初始化、调用、升级
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):
找到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找到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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hyperledger Fabric 1
- 下一篇: hyperledger-simple-a