Fabric2.2 链码操作
1、 进入容器并设置环境变量
注:以下的教程为 java 链码的教程,若是使用go链码,请看 《7、使用go链码》
1.1 进入容器
// 进入容器
docker exec -it cli bash
1.2 设置环境变量
// 组织OrgA
export CORE_PEER_LOCALMSPID=OrgA
export CORE_PEER_ADDRESS=peer0.orga.example.com:7051
export CORE_PEER_MSPCONFIGPATH=$PWD/crypto/peerOrganizations/orga.example.com/users/Admin@orga.example.com/msp
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/crypto/peerOrganizations/orga.example.com/tlsca/tlsca.orga.example.com-cert.pem
export ORDERER_TLSCA=$PWD/crypto/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
export CHANNEL_NAME=txchannel
// 组织OrgB
export CORE_PEER_LOCALMSPID=OrgB
export CORE_PEER_ADDRESS=peer0.orgb.example.com:7051
export CORE_PEER_MSPCONFIGPATH=$PWD/crypto/peerOrganizations/orgb.example.com/users/Admin@orgb.example.com/msp
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/crypto/peerOrganizations/orgb.example.com/tlsca/tlsca.orgb.example.com-cert.pem
export ORDERER_TLSCA=$PWD/crypto/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
export CHANNEL_NAME=txchannel
// 组织OrgC
export CORE_PEER_LOCALMSPID=OrgC
export CORE_PEER_ADDRESS=peer0.orgc.example.com:7051
export CORE_PEER_MSPCONFIGPATH=$PWD/crypto/peerOrganizations/orgc.example.com/users/Admin@orgc.example.com/msp
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/crypto/peerOrganizations/orgc.example.com/tlsca/tlsca.orgc.example.com-cert.pem
export ORDERER_TLSCA=$PWD/crypto/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
export CHANNEL_NAME=txchannel
2、链码打包、安装与审批
注:该步骤需切换环境变量在每个环境变量下都操作一次(例上面给出三个环境变量,需切换在三个节点上都进行操作)
2.1 链码打包
peer lifecycle chaincode package supermapjavacc.tar.gz --path scripts/blockchaincode/ --lang java --label supermapcc
peer lifecycle chaincode package supermapgocc.tar.gz --path blockchaincode_go --lang golang --label supermapcc
// 需要现在 opt/gopath/src/github.com/hyperledger 创建文件夹 chaincode 然后把 go 链码文件夹复制进去
peer lifecycle chaincode package supermapgocc.tar.gz --path /opt/gopath/src/github.com/hyperledger/chaincode/blockchaincode_go/ --lang golang --label supermapcc
2.2 链码安装
peer lifecycle chaincode install supermapjavacc.tar.gz
peer lifecycle chaincode install supermapgocc.tar.gz
// 查看已安装的链码的 ID ,将ID向下面一样赋值为环境变量 CC_PACKAGE_ID
peer lifecycle chaincode queryinstalled
// 将程序包ID声明为环境变量
export CC_PACKAGE_ID=supermapcc2:b02ead52668486c38828ae8505dac943a7a0dab84901690c32105a25aaab5eca
2.3 链码审批
// 没有写背书策略(默认大多数单节点)和是否初始化(默认false)
peer lifecycle chaincode approveformyorg -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID txchannel --package-id $CC_PACKAGE_ID --tls --cafile $ORDERER_TLSCA --sequence 1 --version 1.0 --name supermapcc
--tls 是否启动tls
--ca ca证书路径
--channelID 智能合约安装通道
--name 合约名
--version 合约版本
--package-id queryinstalled查询的合约ID
--sequence 序列号
--waitForEvent 等待peer提交交易返回
--init-required 合约是否必须执行init
--signature-policy 设置背书策略(默认单节点背书)
// 查询是否满足提交智能合约生命周期背书策略
3、向通道提交链码
注:在前面都审批之后,这里只需在一个节点上提交即可
// 单节点
peer lifecycle chaincode commit -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID $CHANNEL_NAME --version 1.0 --sequence 1 --tls true --cafile $ORDERER_TLSCA --name supermapcc
// 多节点(有几个节点,就需要几个 `--peerAddresses` 和 `--tlsRootCertFiles`)
peer lifecycle chaincode commit -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID $CHANNEL_NAME --name supermapcc --version 1.0 --sequence 1 --tls true --cafile $ORDERER_TLSCA --peerAddresses peer0.orga.example.com:7051 --tlsRootCertFiles crypto/peerOrganizations/orga.example.com/tlsca/tlsca.orga.example.com-cert.pem --peerAddresses peer0.orgb.example.com:7051 --tlsRootCertFiles crypto/peerOrganizations/orgb.example.com/tlsca/tlsca.orgb.example.com-cert.pem --peerAddresses peer0.orgc.example.com:7051 --tlsRootCertFiles crypto/peerOrganizations/orgc.example.com/tlsca/tlsca.orgc.example.com-cert.pem
// 查看节点已提交合约
peer lifecycle chaincode querycommitted --channelID txchannel --name supermapcc
4、执行链码
注:上述全部执行完成后,可执行链码判断链码是否已完全成功安装好
peer chaincode invoke -o orderer0.example.com:7050 -C txchannel -n supermapcc -c '{"Args":["PutStringRecordByKey","testKey","testValue"]}' --tls true --cafile $ORDERER_TLSCA
peer chaincode query -o orderer0.example.com:7050 -C txchannel -n supermapcc -c '{"Args":["GetRecordByKey","testKey"]}'
peer chaincode query -o orderer0.example.com:7050 -C txchannel -n supermapcc -c '{"Args":["GetHistoryByKey","testKey2", "0", "20000"]}'
peer chaincode invoke -o orderer:31292 -C channel1 -n supermapcc -c '{"Args":["PutStringRecordByKey","testKey1","testValue"]}' --tls true --cafile
增加新的链码
// 假如增加的新的链码和原来的链码的功能是一样的,那么可以先获取已安装链码的ID
然后换名称提交和验证即可
5、更改日志输出级别
注:此操作是在容器里直接设置,当发生错误时可设日志级别(默认info
)为debug
,方便找错误
export FABRIC_LOGGING_SPEC=info
export FABRIC_LOGGING_SPEC=debug
6、升级链码
现在的链码升级没有单独的升级方法,是直接根据参数--sequence
,即序列号进行链码版本的升级,每次升级过程和安装过程一样,直接每次参数--sequence
加 1 即可
7、使用 go 链码
7.1 配置 GOPATH 环境
注:其实在 fabric-tools
容器里面是有GOPATH
路径的
export GOPATH=/home/huawei/GOPATH
export GOROOT=/home/huawei/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
7.2 编译链码
// 进入容器
docker exec -it cli bash
// 组织OrgA
export CORE_PEER_LOCALMSPID=OrgA
export CORE_PEER_ADDRESS=peer0.orga.example.com:7051
export CORE_PEER_MSPCONFIGPATH=$PWD/crypto/peerOrganizations/orga.example.com/users/Admin@orga.example.com/msp
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/crypto/peerOrganizations/orga.example.com/tlsca/tlsca.orga.example.com-cert.pem
export ORDERER_TLSCA=$PWD/crypto/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
export CHANNEL_NAME=txchannel
// 组织OrgB
export CORE_PEER_LOCALMSPID=OrgB
export CORE_PEER_ADDRESS=peer0.orgb.example.com:7051
export CORE_PEER_MSPCONFIGPATH=$PWD/crypto/peerOrganizations/orgb.example.com/users/Admin@orgb.example.com/msp
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/crypto/peerOrganizations/orgb.example.com/tlsca/tlsca.orgb.example.com-cert.pem
export ORDERER_TLSCA=$PWD/crypto/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
export CHANNEL_NAME=txchannel
// 组织OrgC
export CORE_PEER_LOCALMSPID=OrgC
export CORE_PEER_ADDRESS=peer0.orgc.example.com:7051
export CORE_PEER_MSPCONFIGPATH=$PWD/crypto/peerOrganizations/orgc.example.com/users/Admin@orgc.example.com/msp
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/crypto/peerOrganizations/orgc.example.com/tlsca/tlsca.orgc.example.com-cert.pem
export ORDERER_TLSCA=$PWD/crypto/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
export CHANNEL_NAME=txchannel
// 复制到 GOPATH 路径下 进入链码里面编译
cp -r scripts/blockchaincode_go/ /opt/gopath/src/
cd $GOPATH/src/blockchaincode_go
// 设置 goproxy 加速依赖的下载 编译出vendor目录并buil
export GOPROXY=https://goproxy.cn
go mod vendor
go build
// 进入目录下打包安装链码
cd /opt/gopath/src/github.com/hyperledger/fabric/peer/
peer lifecycle chaincode package supermap_chaincode.tar.gz --path blockchaincode_go --lang golang --label supermapcc2
peer lifecycle chaincode install supermap_chaincode.tar.gz
export CC_PACKAGE_ID=supermapcc2:b02ead52668486c38828ae8505dac943a7a0dab84901690c32105a25aaab5eca
peer lifecycle chaincode approveformyorg -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID txchannel --package-id $CC_PACKAGE_ID --tls --cafile $ORDERER_TLSCA --sequence 1 --version 1.0 --name supermapcc
peer lifecycle chaincode commit -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID $CHANNEL_NAME --version 1.0 --tls true --cafile $ORDERER_TLSCA --sequence 1 --name supermapcc
// 查看节点已提交合约
peer lifecycle chaincode querycommitted --channelID txchannel --name supermapcc