Hyperledger Fabric2.0 链码部署
向Channel中部署链码
终端用户通过调用智能合约与区块链分类账交互,Hyperledger Fabric的智能合约被称为链代码。想要验证或查询数据的组织需要在他们的peer中安装链代码。在加入channel的peer上安装链代码后,channel成员可以调用链代码并更改账本数据。
Fabric使用lifecycle进程来部署链代码,多个组织之间使用lifecrycle来决定chaincode的部署。例如,各组织之间使用lifecrycle来讨论决定链代码采用何种背书策略。更多关于部署和操作链码的信息,可查看https://hyperledger-fabric.readthedocs.io/en/latest/chaincode_lifecycle.html
本文讲述如何使用lifecrycle的命令工具,来部署链码。理解了lifecrycle的各项参数后,你可以按本文的步骤部署自己的链码。
注意:本文使用Fabric 2.0版本。
开始环境
首先部署一个Farbic的测试网络。开始之前,确保你已经安装了依赖包,实例代码,执行脚本和docker镜像。使用如下的命令,切换到测试代码目录(fabric-samples)
cd fabric-samples/test-network
从统一的初始状态开始,执行下面代码,删除运行中的docker和之前遗留的影响
./network.sh down
执行下述代码开始测试网络
./network.sh up createChannel
上述命令会创建一个通道mychannel和两个组织Org1,Org2.每个组织有一个peer且已经加入通道中。如果成功执行了,会显示如下logs
========= Channel successfully joined ===========
现在可以使用Peer CLI来向通道中部署链代码:
- 第一步,打包链码
- 第二步,安装打包的链码
- 第三步,各组织对链码内容和定义达成一致
- 第四步,向channel中提交链码
Log设置(可选,回头补)
打包链码
在安装链码之前我们需要对链码打包。下面仅翻译Go部分。
在打包链码之前,我们需要安装链码的依赖包,切换到包含链码的目录中
cd fabric-samples/chaincode/fabcar/go
本例使用 Go module来安装链码的依赖包,查看go.mod文件。
$ cat go.mod
module github.com/hyperledger/fabric-samples/chaincode/fabcar/go
go 1.13
require github.com/hyperledger/fabric-contract-api-go v0.0.0-20191118113407-4c6ff12b4f96
go.mod文件将Fabric contract API引入到链码包中,在fabcar.go中定义的合约接口SmartContract在链码的开头。
// SmartContract provides functions for managing a car
type SmartContract struct {
contractapi.Contract
}
SmartContract为函数中操作账本数据构建context。
// CreateCar adds a new car to the world state with given details
func (s *SmartContract) CreateCar(ctx contractapi.TransactionContextInterface, carNumber string, make string, model string, colour string, owner string) error {
car := Car{
Make: make,
Model: model,
Colour: colour,
Owner: owner,
}
carAsBytes, _ := json.Marshal(car)
return ctx.GetStub().PutState(carNumber, carAsBytes)
}
链码API更多信息https://github.com/hyperledger/fabric-contract-api-go,https://hyperledger-fabric.readthedocs.io/en/latest/developapps/smartcontract.html
安装链码依赖包,在fabcar/go目录中运行下面命令
GO111MODULE=on go mod vendor
如果执行成功,go包会安装在vendor文件夹中
现在依赖包安装完毕,可以打包链码了。切换回test-network,打包所有相关内容。
cd ../../../test-network
使用peer CLI来打包链码,peer的可执行二级制文件在fabric-sample的bin文件夹中。使用如下命令添加Peer到CLI命令路径中
export PATH=${PWD}/../bin:$PATH
还需要设置指向fabric-samples中core.yaml的FABRIC_CFG_PATH
export FABRIC_CFG_PATH=$PWD/../config/
查看peer版本来确认是否安装成功
peer version
打包链代码
peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1
此命令会在当前目录下创建fabcar.tar.gz文件,--lang标识链码的编程语言,--path链码路径,--label链码安装后的标签,建议包含链码名称和版本。
我们已经打包了链码,现在可以在peer上安装链码。
安装打包的链码
打包完链码后,就可以在peer上安装。链码需要再所有参与背书的peer上安装。因为我们将要设置的背书策略是,Org1和Org2同时背书,所以Org1和Org2上都要安装链码
- peer0.org1.example.com
- peer0.org2.example.com
首先在Org1的peer上安装,通过设置环境变量来指定peer操作的是Org1,CORE_PEER_ADDRESS会设置peer为peer0.org1.example.com
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上安装链码
peer lifecycle chaincode install fabcar.tar.gz
如果执行成功,会返回链码的标识符package ID,此ID会再下一步审议链码的环节用到。类似于下方的输出
2020-02-12 11:40:02.923 EST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nIfabcar_1:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3\022\010fabcar_1" >
2020-02-12 11:40:02.925 EST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3
下面安装Org2的peer
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 fabcar.tar.gz
在安装时会编译链码,如果链码有bug会在此时返回错误。
审议链码