Fabric 链码Chaincode 的安装、初始化、调用、升级
Fabric 鏈碼Chaincode 的安裝、初始化、調用、升級
- Fabric
- ?
- chaincode
上一篇文章,我們啟動了一個Fabric網絡,這篇文章來看看在Fabric網絡進行應用的開發。
上一篇文章,我們啟動了一個 Fabric 網絡,這篇文章來看看在 Fabric 網絡進行應用的開發。
什么是 chaincode
chaincode 是 fabric 的智能合約,又叫做鏈碼。Chaincode 是生成交易 transacton 的唯一方式,是外界與區塊鏈系統交互的唯一渠道,開發 Fabric 區塊鏈應用就是要編寫 Chaincode, Chaincode 就是業務邏輯實現。
chaincode 生命周期
-
Install 安裝
chaincode 要在 Fabric 網絡上運行,必須要先安裝在網絡中的節點 peer 上(可以理解為部署代碼),安裝同時注明版本號保證應用的版本控制。
-
Instantiate 實例化
在 peer 上安裝 chaincode 后,還需要實例化才能真正激活該 chaincode 。在實例化的過程中,chaincode 就會被編譯并打包成 docker 容器鏡像,然后啟動運行。每個應用只能被實例化一次,實例化可在任意一個已安裝該 chaincode 的 peer 上進行。
-
Invoke 調用,Query 查詢
chaincode 在實例化后,用戶就能與它進行交互,其中 query 查詢與應用相關的狀態(即只讀),而 invoke 則可能會改變其狀態。
-
Upgrade 升級
在 chaincode 更新代碼后,需要把新的代碼通過 install 交易安裝到正在運行該 chaincode 的 peer 上,安裝時需注明比先前版本更高的版本號,接下來向任意一個安裝了新代碼的 peer 發送 upgrade 交易就能更新 chaincode,chaincode 在更新前的狀態也會得到保留。
first network 示例
現在,我們在 first network 的環境中,重新部署一個新的應用,應用邏輯是插入一個學生的成績(學生姓名,語文成績,數學成績),然后計算總成績記錄到鏈上,通過學生姓名查詢學生的總成績,鏈碼路徑放到fabric-samples/chaincode/win_test/src/fabric-chaincode目錄下,鏈碼下載地址是:https://gitee.com/zh5715615/fabric-chaincode.git。
先關掉 TLS
為了減少參數輸入,在這里不引入 TLS(安全傳輸層協議)功能,后面再進行講解,我們關掉 tls 開關:
找到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]進入容器
first network 的操作都是再 cli 容器中進行的,進入 cli 容器:
docker exec -it cli bash鏈碼安裝
cli 容器中,默認的 peer 成員時peer0.org0,所以安裝鏈碼只是安裝在peer0.org0的節點上,如果要在其他節點安裝需要切換環境變量,鏈碼安裝操作如下:
在 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 #切換節點 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 #切換節點 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 #切換節點 peer chaincode install -n kpcc -v 1.0 -l golang -p github.com/chaincode/win_test/src/fabric-chaincode/kunpeng_example01/注意,如果要切回組織 1 時,環境變量為:
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從上面的例子可以看到,如果不同的節點之間有不同的環境變量,而不同的組織環境變量和需要導入的 MSP(成員管理)不同,在使用時注意切換。如果是在非 docker 的真機環境下,不需要 cli 時,則記得在peer node start啟動前,配置好相應的環境變量值。
參數解析:
- -n:指定鏈碼名稱
- -v:指定鏈碼版本號
- -l:指定鏈碼使用的語言,可以是 golang, java, nodejs
- -p:指定鏈碼源碼目錄
鏈碼安裝成功則顯示如下:
response:<status:200 payload:"OK" >鏈碼初始化
鏈碼的初始化只需要執行一次,在任意節點上執行都可以:
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'\'')'參數解析:
-
-n:指定鏈碼名稱
-
-v:指定鏈碼版本號
-
-l:指定鏈碼使用的語言,可以是 golang, java, nodejs
-
-o:指定排序節點
-
-C:指定通道名
-
-c:指定初始化參數
- -P:指定背書策略,上例中的背書策略是,兩個組織必須都參與鏈碼 invoke 或 query,chaincode 執行才能生效。這個參數可為空,則任意安裝了鏈碼的節點無約束地調用鏈碼。
鏈碼初始化成功則不會有 error 信息顯示。
鏈碼執行
執行鏈碼 Invoke,鏈碼的執行在任意節點完成后,會將結果同步到其他節點:
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n kpcc -c '{"Args":["invoke","Alice","98","92"]}'參數解析:
- -n:指定鏈碼名稱
- -o:指定排序節點
- -C:指定通道名
- -c:指定鏈碼執行地參數,如上例中有四個參數,invoke 是方法,表示寫入,Alice 是學生名稱,98,92 是分數
以上的示例指令執行會失敗,并不會記錄在鏈上,因為有背書規則,所以需要兩個組織一起參與背書,正確指令如下:
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"]}'鏈碼執行成功顯示如下:
Chaincode invoke successful. result: status:200鏈碼查詢
peer chaincode query -C mychannel -n kpcc -c '{"Args":["query","Alice"]}'參數解析:
- -n:指定鏈碼名稱
- -C:指定通道名
- -c:指定鏈碼執行地參數,如上例中有四個參數,invoke 是方法,表示寫入,Alice 是學生名稱,98,92 是分數
鏈碼的查詢是不會記錄在鏈上的,只會從賬本中讀取記錄返回給用戶,此示例返回值是 190
鏈碼查詢其實也可以用 invoke 來執行,這樣就需要背書,且記錄上鏈。
鏈碼更新
鏈碼更新,首先要安裝鏈碼,更新一下版本號:
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'\'')'鏈碼更新只能在安裝了新版本鏈碼的節點上有效,老的節點仍然只能用舊的鏈碼,同樣,參與背書的節點,也需要將鏈碼升級,才能讓提交 Invoke 的操作背書通過。
總結
以上是生活随笔為你收集整理的Fabric 链码Chaincode 的安装、初始化、调用、升级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hyperledger Fabric 1
- 下一篇: hyperledger-simple-a