打包智能合约
我们需要先打包链码,然后才能将其安装到我们的peer节点上。要注意的是,如果要安装的智能合约是用 Go,JavaScript,TypeScript 语言写的话,这三种语言打包的过程是不一样的。 这里主要介绍的是Go语言。(如果有想看其它语言的可以评论区留言)
在我们打包链码前,我们需要安装链码相关依赖项。在Fabric samples 目录下找到文件夹asset-transfer-basic/chaincode-go
// 进入指定目录
cd fabric-samples/asset-transfer-basic/chaincode-go
这里我们使用 Go 模块来安装链码依赖项。依赖项列在目录中的go.mod 文件中,需要先花点时间检查此文件。
$ cat go.mod
module github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go
go 1.14
require (
github.com/golang/protobuf v1.3.2
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212
github.com/hyperledger/fabric-contract-api-go v1.1.0
github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e
github.com/stretchr/testify v1.5.1
)
该go.mod 文件将 Fabric 合约 API 导入到智能合约包中。可以把asset-transfer-basic/chaincode-go/chaincode/smartcontract.go 在文本编辑器中打开,查看SmartContract智能合约开始时如何使用合约 API 定义类型:
type SmartContract struct {
contractapi.Contract
}
该SmartContract 类型之后将用于为智能合约中定义的函数创建交易上下文,这些函数将数据读取和写入区块链分类账。
func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface, id string, color string, size int, owner string, appraisedValue int) error {
exists, err := s.AssetExists(ctx, id)
if err != nil {
return err
}
if exists {
return fmt.Errorf("the asset %s already exists", id)
}
asset := Asset{
ID: id,
Color: color,
Size: size,
Owner: owner,
AppraisedValue: appraisedValue,
}
assetJSON, err := json.Marshal(asset)
if err != nil {
return err
}
return ctx.GetStub().PutState(id, assetJSON)
}
要安装智能合约依赖项,请从asset-transfer-basic/chaincode-go 目录运行以下命令。
GO111MODULE=on go mod vendor
如果命令成功,go 包将安装在一个vendor文件夹中。
现在我们有了我们的依赖项,我们可以创建链码包。导航回test-network文件夹中的工作目录,以便我们可以将链代码与其他网络打包在一起。
cd ../../test-network
可以使用peer CLI 创建所需格式的链码包。该peer 二进制文件所在的bin 文件夹处于fabric-samples 目录下。使用以下命令将这些二进制文件添加到您的 CLI 路径:
export PATH=${PWD}/../bin:$PATH
然后还需要将FABRIC_CFG_PATH 设置为指向存储库fabric-samples 中的core.yaml 文件:
export FABRIC_CFG_PATH=$PWD/../config/
要确认可以使用peer CLI,请检查二进制文件的版本。二进制文件需要版本2.0.0或更高版本才能运行
peer version
现在你就可以创建一个链码包了,通过peer lifecycle chaincode package 指令即可:
peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0
此命令将在当前目录中创建一个叫basic.tar.gz 的包。--lang 标志用于指定链代码语言,--path 标志提供智能合约代码的位置。该路径必须是完全路径或相对于您当前工作目录的路径。--label 标志用于指定一个链码标签,该标签将在安装后标识打包的链码。建议标签包含链码名称和版本。
现在我们创建了链码包,我们可以在测试网络的对等节点上安装链码。
安装链码包
在我们打包asset-transfer (basic) 的智能合约后,我们可以在我们的peer 上安装链码。链码需要安装在每个需要对交易的进行背书的peer节点上。因为我们要将背书策略设置为要求来自 Org1 和 Org2 的背书,所以我们需要在两个组织运营的节点上安装链码:
1. peer0.org1.example.com 2. peer0.org2.example.com
让我们先在 Org1 节点上安装链码。设置以下环境变量,以peerOrg1 管理员用户身份操作CLI。CORE_PEER_ADDRESS 将被设置为指向peerORG1 ,即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/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
执行 peer lifecycle chaincode install 命令以在 peer 上安装链码:
peer lifecycle chaincode install basic.tar.gz
如果命令成功,peer 将生成并返回包标识符。此包 ID 将用于在下一步中批准链码。成功的话应该会看到类似于以下内容的输出:
2020-07-16 10:09:57.534 CDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nJbasic_1.0:e2db7f693d4aa6156e652741d5606e9c5f0de9ebb88c5721cb8248c3aead8123\022\tbasic_1.0" >
2020-07-16 10:09:57.534 CDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: basic_1.0:e2db7f693d4aa6156e652741d5606e9c5f0de9ebb88c5721cb8248c3aead8123
我们现在可以在 Org2 节点上安装链码。设置以下环境变量以作为 Org2 管理员操作并定位 Org2 peer,peer0.org2.example.com 。
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_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
执行 peer lifecycle chaincode install 命令以在 peer 上安装链码:
peer lifecycle chaincode install basic.tar.gz
安装链码的时候这个搭建的过程是由peer完成的,所以如果智能合约代码有问题,错误信息将从链码返回。
|