部署链码

链码是Hyperledger Fabric技术框架中对智能合约的实现,支持业界流行的编程语言Golang,Node.js和Java,并不断完善支持其他编程语言。本文介绍如何为通道部署新的链码。

说明

本章节适用于购买Fabric v2.2 或 v2.5实例的用户,如果您是Fabric v1.4实例的用户,请参见管理链码(V1.4)部署链码。

链码服务化

在2022年9月29日之后部署的链码实例,默认会开启链码服务化功能。

链码服务化之前

Hyperledger Fabric的链码容器基于Docker构建和运行,链码实例与Peer实例的数量关系是一对一的关系,随着业务规模地逐渐扩大,容器越来越多,一方面加大了运维人员的工作复杂程度,另一方面也给用户增加了资源成本。

链码服务化之后

Hyperledger Fabric的链码容器基于K8s构建和运行,在优化资源配置、可靠性、稳定性方面都有很大的提升。具体来说,主要包含以下几个优点:

  • 链码资源的弹性管理

    默认情况下,在一个组织内,一份链码启动一个容器,并将链码作为服务提供给peer调用。基于原生K8s,组织内所有Peer节点通过访问同一个链码服务,可以共用一个链码容器,从而实现对链码资源的弹性管理。

    说明

    如您在业务上对链码的扩缩容有需求,可通过提交工单联系售后工程师为您提供进一步服务。

  • 高可用性

    链码容器被部署到K8s后,由原生K8s确保服务可靠性及扩缩容能力。

  • 稳定性增强

    链码构建一次之后,即可被组织内的节点复用。当peer节点重启时,可以省略掉原本的构建镜像的步骤,快速拉起链码容器,减小抖动。

打包链码

用户首先要在Hyperledger Fabric开发环境中进行链码的开发,测试及打包:

  • 链码开发指南请参考智能合约简介

  • 链码测试通过后需要用命令peer lifecycle chaincode package进行打包。打包时建议包含所需依赖,以Golang链码为例,通过以下步骤将依赖文件置于vendor目录下:

    1. 使用 govendor 加载依赖

      1. 安装govendor工具

        go get -u -v github.com/kardianos/govendor
      2. 进入到链码项目的目录,初始化vendor目录;

        govendor init
      3. 将GOPATH中本工程使用到的依赖包自动移动到vendor目录中;

        govendor add +external
    2. 使用 go mod 加载依赖

      1. 初始化 mod

        go mod init
      2. 将依赖自动打包到 vendor 中

        go mod vendor
  • 打包命令具体内容请参见peer lifecycle chaincode命令。注意:

    1. 打包 Golang 链码时,-p 参数要指向链码 main package 所在的目录在 $GOPATH/src 下的相对路径;打包 Java 链码时,-p 参数要指向Java的工程目录;打包 Node.js 链码时,-p 参数要指向包含 package.json 文件的 Node.js 项目根目录;-p 参数不要使用 “./xxx”的相对路径格式。

    2. 如果链码语言是 Golang, 则可以省略 -l 选项;如果链码语言是 Node.js或者java,则使用参数 -l node 或者 -l java。

    3. 使用--label指定链码的默认链码名称及版本

  • 以下示例将 $GOPATH/src/github.com/hyperledger/fabric-samples/chaincode/sacc 目录下的 Golang 链码源代码打包为 sacc.tar.gz 链码标签为 sacc_1_0。

    peer lifecycle chaincode package -p github.com/hyperledger/fabric-samples/chaincode/sacc --label sacc_1_0 -l Golang sacc.tar.gz

    peer 下载地址:

  • Mac: hyperledger-fabric-darwin-amd64-2.2.0.tar.gz

  • Linux: hyperledger-fabric-linux-amd64-2.2.0.tar.gz


新链码的部署需要经过以下三个步骤,如果要升级通道中已有的链码,请参见升级链码

  1. 上传链码

  2. 安装链码

  3. 提交链码定义

上传链码

  1. 登录阿里云BaaS控制台

  2. 概览页面,找到我的组织区域,找到目标组织,单击组织的名称。

  3. 单击链码包管理标签页。

  4. 单击上传链码

  5. 在弹出的对话框中,上传在开发环境已经打包的链码,具体打包方法参见上述的打包链码

  6. 单击确定

    image.png

    上传链码成功后,链码包管理标签页的列表中会出现该链码,其中标签列显示的链码名称是您在本地打包链码时指定的。

安装链码

前提条件

您已上传链码。

操作步骤

  1. 登录阿里云BaaS控制台

  2. 概览页面,找到我的组织区域,找到目标组织,单击组织的名称。

  3. 单击链码包管理标签页。

  4. 找到要安装的链码,在操作列中单击安装,即可将此链码安装在本组织。

  5. 安装过程中,进行一次链码的预编译,检查链码包可能存在的问题。

    image

    此操作根据链码依赖的复杂程度,需要数秒到数分钟。安装完成后,状态未安装变为已安装操作列中的安装变为提交定义

提交链码定义

前提条件

您已上传链码并安装链码。

操作步骤

  1. 登录阿里云BaaS控制台

  2. 概览页面,找到我的组织区域,找到目标组织,单击组织的名称。

  3. 单击链码包管理标签页。

  4. 找到要提交定义的链码,在操作列中单击提交定义

  5. 根据参数说明在弹框中填写参数信息。

    image.png

    参数

    说明

    名称

    系统自动显示您在本地打包链码时指定的链码名称。您可以保留该名称,也可以修改为新的链码名称。

    说明

    已经使用过的链码名称不能再次提交链码定义。

    版本

    您提交链码定义时,需要为链码定义一个版本号

    部署通道

    选择链码部署的通道,部署成功后,该通道内的所有组织均可看到该链码。关于如何创建通道,请参见创建通道

    是否初始化

    • 支持:如果您的链码实现了Init,需要先通过SDK发送特殊的初始化交易后,链码才能被调用。即在被使用前需要进行初始化,则此处选择 支持

    • 不支持:如果您的链码未使用Init,不需要进行初始化,则此处选择 不支持

    背书策略

    背书策略举例:

    • OR ('org0MSP.peer','org1MSP.peer')表示此通道中的两个组织任何一方背书即可。

    • AND ('org0MSP.peer','org1MSP.peer')表示需要此通道中的两个组织背书。

    • OutOf (a,'org0MSP.member','org1MSP.member','org2MSP.member'):当a为1时表示此通道中的三个组织任何一方背书即可,当a为2时表示至少需要两个通道中的组织背书才行,当a等于组织数时,背书情况等同于AND。

    说明

    其中*.peer中的*由上图中的MSP ID决定。

    高级

    单击 高级,您可以在 隐私集配置 输入框中输入您链码的隐私集JSON定义信息(如果您的链码不需要使用隐私数据功能,您可以跳过此参数的设置)。隐私集JSON定义举例: [{"name": "collectionName", "policy": "OR('org0MSP.peer')", "memberOnlyRead": false, "requiredPeerCount": 0, "maxPeerCount": 3, "blockToLive": 0}]表示链码需要使用一个叫做collectionName的隐私数据命名空间, 只有组织 Org0 的节点才能获取该命名空间内的隐私数据。

    重要

    一旦隐私集的 name 和 blockToLive 被设置,您将不能在升级时对这两个值做修改。更多信息可以参考 Using Private Data in Fabric

  6. 单击提交

    操作成功后,您可以在链码标签页下查看该链码的状态信息,即通道状态变为共识中组织状态显示为处理完成,单击操作列下的审批详情可以查看该链码的基本信息。

    image

  7. 通道内其他组织确认并完成链码的提交定义。

    说明

    默认需要通道内50%的组织通过确认,才能最终提交链码定义。

    1. 其他组织成员登录阿里云BaaS控制台

    2. 概览页面,找到我的组织区域,找到目标组织,单击组织的名称。

    3. 单击链码标签页,在操作栏下单击去处理

    4. 在弹出的链码处理页中,确认该链码提交的定义是否符合要求,如果符合,可直接单击提交完成确认。

      当通道内50%以上的组织完成确认后,链码部署成功,在链码页签下,可以看到通道状态由原来的共识中变成运行中,操作栏增加了升级显示日志的操作。

      image

      说明

      如果提交的链码定义不符合要求,其他组织可以选择不执行去处理,重新上传自己的链码包、安装并提交链码定义,此时提交的参数与原来提交的参数不一致,在链码页签下,会存在多条共识信息。

下一步

创建用户通过SDK访问区块链网络