Hyperledger fabric部署链码(一)打包链码

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: fabric部署chaincode-go(智能合约)系列之一

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(见下篇)。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
开发框架 .NET 区块链
Hyperledger fabric部署链码(五)初始化与链码升级
fabric部署chaincode-go(智能合约)系列之五
201 0
|
3月前
【Azure Fabric Service】Service Fabric部署失败问题 Provisioning of VM extension ConfigureVM has timed out.
【Azure Fabric Service】Service Fabric部署失败问题 Provisioning of VM extension ConfigureVM has timed out.
|
3月前
|
微服务 Windows
【Azure 微服务】Service Fabric 部署时遇见了VMExtensionProvisioningError错误: Multiple VM extensions failed to be provisioned on the VM
【Azure 微服务】Service Fabric 部署时遇见了VMExtensionProvisioningError错误: Multiple VM extensions failed to be provisioned on the VM
|
存储 JSON 安全
Hyperledger fabric智能合约编写(一)
本篇文章主要对链码编写的主要思路和部分API进行梳理。
171 1
|
区块链
Hyperledger fabric部署链码(二)安装链码到fabric
fabric部署chaincode-go(智能合约)系列之二
146 1
|
Go API 区块链
Hyperledger Fabric相关概念介绍
在学习Hyperledger Fabric的过程中,初步对相关概念的了解。
257 0
Hyperledger Fabric相关概念介绍
|
JSON 区块链 数据格式
Hyperledger fabric部署链码(四)提交链码定义到channel
fabric部署chaincode-go(智能合约)系列之四
|
测试技术 API 区块链
Hyperledger fabric部署链码(三)批准链码定义
fabric部署chaincode-go(智能合约)系列之三
128 0
|
测试技术 Go 区块链
Hyperledger fabric 测试环境部署
Hyperledger fabric 测试环境部署及相关问题解答
264 3
Hyperledger fabric 测试环境部署
|
消息中间件 Java Kafka
Hyperledger Fabric 通道配置文件和容器环境变量详解
Fabric 节点的主配置路径为 FABRIC_CFG_PATH 环境变量所指向路径(默认为 /etc/hyperledger/fabric)。在不显式指定配置路径时,会尝试从主配置路径下查找相关的配置文件。
355 0