部署链码

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

说明:Fabric 2.2 目前处于公测阶段,公测期间您可以登录阿里云BaaS平台进行体验。

打包链码

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

  • 链码开发指南请参考智能合约简介
  • 链码测试通过后需要用命令peer lifecycle chaincode package进行打包。打包时建议包含所需依赖,以golang链码为例,通过以下步骤将依赖文件置于vendor目录下:
    1. 使用 govendor 加载依赖
      1. 安装govendor工具
        1. go get -u -v github.com/kardianos/govendor
      2. 进入到链码项目目录,初始化vendor目录;
        1. govendor init
      3. 将GOPATH中本工程使用到的依赖包自动移动到vendor目录中;
        1. govendor add +external
    2. 使用 go mod 加载依赖
      1. 初始化 mod
        1. go mod init
      2. 将依赖自动打包到 vendor 中
        1. go mod vendor
  • 打包命令具体内容请参见peer lifecycle chaincode命令。注意:
    1. 打包 golang 链码时,-p 参数要指向链码 main package 所在的目录在 $GOPATH/src 下的相对路径;打包 Java 链码时,-p 参数要指向Java的工程目录;打包 nodejs 链码时,-p 参数要指向包含 package.json 文件的 nodejs 项目根目录;-p 参数不要使用 “./xxx”的相对路径格式。
    2. 如果链码语言是 golang, 则可以省略 -l 选项;如果链码语言是 nodejs或者java,则使用参数 -l node 或者 -l java。
    3. 使用 —label 指定链码的默认链码名称及版本
  • 以下示例将 $GOPATH/src/github.com/hyperledger/fabric-samples/chaincode/sacc 目录下的 golang 链码源代码打包为 sacc.tar.gz 链码标签为 sacc_1_0。
    1. 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. 单击确定

    上传链码

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

安装链码

前提条件

您已上传链码。

操作步骤

  1. 登录阿里云BaaS控制台

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

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

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

    安装链码

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

    预编译

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

提交链码定义

前提条件

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

操作步骤

  1. 登录阿里云BaaS控制台

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

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

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

    提交定义

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

    提交链码定义

    参数说明
    名称系统自动显示您在本地打包链码时指定的链码名称。您可以保留该名称,也可以修改为新的链码名称。
    说明:已经使用过的链码名称不能再次提交链码定义。
    版本您提交链码定义时,需要为链码定义一个版本号
    部署通道选择链码部署的通道,部署成功后,该通道内的所有组织均可看到该链码。关于如何创建通道,请参见创建通道
    是否初始化- 支持:如果您的链码实现了Init,需要先通过SDK发送特殊的初始化交易后,链码才能被调用。即在被使用前需要进行初始化,则此处选择 支持
    - 不支持:如果您的链码未使用Init,不需要进行初始化,则此处选择 不支持
    背书策略背书策略举例:
    - OR ('Org1MSP.peer','Org2MSP.peer')表示此通道中的两个组织任何一方背书即可。
    - AND ('Org1MSP.peer’,’Org2MSP.peer')表示需要此通道中的两个组织背书。
    - OutOf (a,’Org1MSP.member’,’Org2MSP.member’, ’Org3MSP.member’):当a为1时表示此通道中的两个组织任何一方背书即可,当a为2时表示至少需要两个通道中的组织背书才行,当a等于组织数时,背书情况等同于AND。

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

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

  6. 单击提交

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

    状态信息查看

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

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

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

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

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

      其他组织去处理

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

      其他组织完成确认

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

      部署成功

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

下一步

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