1 启动测试网络
我们将从部署 Fabric 测试网络实例开始。开始之前,请参照上文部署测试环境。使用以下命令导航到本地fabric-samples库中的测试网络目录:
cd fabric-samples/test-network
从零开始前,我们将确保fabric测试环境已关闭
./network.sh down
使用以下命令启动fabric测试环境
./network.sh up createChannel
createChannel
命令创建了一个名为 mychannel 的通道,该通道有两个成员:Org1 和 Org2。该命令还将属于每个组织的一个对等·peer
加入通道。如果网络和通道创建成功,你可以在日志中看到以下打印信息:
========= Channel successfully joined ===========
现在,我们可以使用peer CLI
,通过以下步骤将asset-transfer (basic)链码部署到通道:
- 打包链码
- 部署链码
- 批准链码定义
- 提交链码定义到channel
2、设置日志输出(可选)
这一步不是必需的,但对排除 chaincode 故障非常有用。要监控智能合约的日志,可以使用 logspout 工具查看一组 Docker 容器的汇总输出。该工具将不同 Docker 容器的输出流收集到一个地方,可以很容易地从窗口看到正在发生记录。有效帮助我们在部署智能合约时调试bug,或帮助开发人员在调用智能合约时调试bug。由于有些容器纯粹是为了启动智能合约而创建的,只存在很短的时间,因此收集网络中的所有日志会很有帮助。
Fabric 示例的 test-network 目录中已包含用于安装和配置 Logspout 的脚本 monitordocker.sh。Logspout 工具会不断向终端发送日志流,因此需要使用新的终端窗口。打开一个新终端并导航到 test-network 目录。
cd fabric-samples/test-network
然后运行以下命令启动 Logspout:
./monitordocker.sh fabric_test
你应该会看到类似下面的输出:
Starting monitoring on all containers on the network net_basic
Unable to find image 'gliderlabs/logspout:latest' locally
latest: Pulling from gliderlabs/logspout
4fe2ade4980c: Pull complete
decca452f519: Pull complete
ad60f6b6c009: Pull complete
Digest: sha256:374e06b17b004bddc5445525796b5f7adb8234d64c5c5d663095fccafb6e4c26
Status: Downloaded newer image for gliderlabs/logspout:latest
1f99d130f15cf01706eda3e1f040496ec885036d485cb6bcc0da4a567ad84361
一开始不会看到任何日志,但当我们部署链码后,情况就会发生变化。将终端窗口变宽、字体变小可能会有帮助。
3、打包链码(智能合约)
对 chaincode 进行打包,然后才能将其部署到我们的对等peer
上。如果要安装用 Go、JavaScript 或 Typescript 编写的智能合约,步骤会有所不同。本文以Go语言为例.
打包 chaincode 之前,我们需要安装chaincode的依赖项。导航到asset-transfer (basic) chaincode目录
cd fabric-samples/asset-transfer-basic/chaincode-go
该示例使用 Go 模块安装 chaincode 依赖项。这些依赖项列在 asset-transfer-basic/chaincode-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,我们可以在智能合约开头定义智能合约类型:
// SmartContract provides functions for managing an Asset
type SmartContract struct {
contractapi.Contract
}
智能合约类型随后用于为智能合约中定义的函数创建交易上下文,这些函数负责向区块链账本读写数据。
// CreateAsset issues a new asset to the world state with given details.
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)
}
您可以访问官方文档了解有关 Go 合约 API 的更多信息。
要安装智能合约依赖项,请在 asset-transfer-basic/chaincode-go 目录下运行以下命令。
GO111MODULE=on go mod vendor
如果命令成功执行,go 软件包将安装在vendor文件夹内。
接下来开始打包智能合约,先导航回到 test-network 文件夹
cd ../../test-network
您可以使用peer CLI
按所需格式创建链码包。对等二进制文件位于 fabric-samples 资源库的 bin 文件夹中。使用以下命令将这些二进制文件添加到 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标志用于指定 chaincode 语言
- --path 标志提供智能合约代码的位置。路径必须是完全限定路径或与当前工作目录相对的路径。
- --label标志用于指定chaincode标签,以便在安装后识别你的chaincode。建议标签包含链码名称和版本。
现在我们创建了 chaincode 软件包,可以在测试网络的peer上安装 chaincode(见下篇)。