Fabric升级智能合约


参考:升级智能合约 & 视频

当我们修改了智能合约之后,需要将新的智能合约安装在节点上。

可以使用相同的 Fabric 链码生命周期流程来升级已部署到通道的链码。通道成员可以通过安装新的链码包,然后批准具有新包 ID、新链码版本和序列号加一的链码定义来升级链码。在将链码定义提交到通道后,可以使用新的链码。此过程允许通道成员在升级链代码时进行协调,并确保有足够数量的通道成员准备好使用新的链代码,然后再将其部署到通道。

渠道成员还可以使用升级过程来更改链码背书策略。通过使用新的背书策略批准链码定义并将链码定义提交给通道,通道成员可以更改管理链码的背书策略,而无需安装新的链码包。

打包智能合约

1.1拉取最新的代码

cd ~fabric-samples/chaincode/hyperledger-fabric-contract-java-demo
git pull

1.2 返回到test-network所在目录,以便可以将链码与其他网络部件打包在一起

cd ../../test-network

1.3 将bin目录中二进制文件添加到CLI路径

export PATH=${PWD}/../bin:$PATH

1.4 设置FABRIC_CFG_PATH为指向fabric-samples中的core.yaml文件

export FABRIC_CFG_PATH=$PWD/../config/

1.5 创建链码包

peer lifecycle chaincode package hyperledger-fabric-contract-java-demo.tar.gz --path ../chaincode/hyperledger-fabric-contract-java-demo/ --lang java --label hyperledger-fabric-contract-java-demo_2

安装链码包

打包 hyperledger-fabric-contract-java-demo 智能合约后,我们可以在peer节点上安装链码。需要在将认可交易的每个peer节点上安装链码。因为我们将设置背书策略以要求来自Org1和Org2的背书,所以我们需要在两个组织的peer节点上安装链码:peer0.org1.example.com和peer0.org2.example.com

2.1 Org1 peer节点安装链码

设置以下环境变量,以Org1管理员的身份操作peer CLI。

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051

使用 peer lifecycle chaincode install 命令在peer节点上安装链码。

peer lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz

注意:可以打开一个新的终端,首先输入命令:docker ps来查看所有容器,获取第一个container id 复制下来,然后在输入命令:docker logs -f +刚刚的id。这样就可以查看到安装链码的日志,还有就是安装过程比较慢,在原来的终端页面可能会提示超时,等日志中成功后,再次在之前的终端中运行安装链码的命令即可。下面安装链码同理。

2.2 Org2 peer节点安装链码

设置以下环境变量,以Org2管理员的身份操作peer CLI。

export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051

使用 peer lifecycle chaincode install 命令在peer节点上安装链码。

peer lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz

通过链码定义

安装链码包后,需要通过组织的链码定义。该定义包括链码管理的重要参数,例如名称,版本和链码认可策略。

如果组织已在其peer节点上安装了链码,则他们需要在其组织通过的链码定义中包括包ID。包ID用于将peer节点上安装的链码与通过的链码定义相关联,并允许组织使用链码来认可交易。

3.1 查询包ID和之前安装过的版本

peer lifecycle chaincode queryinstalled

该queryinstalled命令将返回已在peer节点上安装的链码的列表:

Installed chaincodes on peer:
Package ID: hyperledger-fabric-contract-java-demo_2:762e0fe3dbeee0fzf11fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506, Label: hyperledger-fabric-contract-java-demo_2
Package ID: hyperledger-fabric-contract-java-demo_1:762e0fe3dbeee0fzf11fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e559, Label: hyperledger-fabric-contract-java-demo_1

demo_2是刚刚安装上的。

通过链码时,我们将使用包ID,因此,将包ID保存为环境变量。将返回的包ID粘贴到下面的命令中。

注:包ID对于所有用户而言都不相同,因此需要使用上一步中从命令窗口返回的包ID来完成此步骤。而不是直接复制命令!!!

使用包标签找到新链码的包ID,并将其另存为新的环境变量:

export NEW_CC_PACKAGE_ID=hyperledger-fabric-contract-java-demo_2:762e0fe3dbeee0fzf11fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506

3.2 Org2 通过链码定义

因为已经设置了环境变量为peer CLI作为Orig2管理员进行操作,所以我们可以以Org2组织级别将 hyperledger-fabric-contract-java-demo 的链码定义通过。使用 peer lifecycle chaincode approveformyorg命令通过链码定义:

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

注:修改版本号和序列号为2。

3.3 Org1 通过链码定义

设置以下环境变量以Org1管理员身份运行:

export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_ADDRESS=localhost:7051

用 peer lifecycle chaincode approveformyorg命令通过链码定义

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

注:修改版本号和序列号为2。

将链码定义提交给通道

使用peer lifecycle chaincode checkcommitreadiness命令来检查通道成员是否已批准相同的链码定义:

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json

注:修改版本号和序列号为2。

如果命令返回以下JSON,则表示链代码已准备好升级:

{
	"approvals": {
		"Org1MSP": true,
		"Org2MSP": true
	}
}

升级链码:

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name hyperledger-fabric-contract-java-demo --version 2.0 --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

注:修改版本号和序列号为2。

可以使用peer lifecycle chaincode querycommitted命令来确认链码定义已提交给通道。

peer lifecycle chaincode querycommitted --channelID mychannel --name hyperledger-fabric-contract-java-demo --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

猜你喜欢

转载自blog.csdn.net/wan_ide/article/details/125892271