【Fabric学习】链码生命周期

本文从概念上理解链码生命周期,而不是具体的操作

链码是什么

  • 链码(Chaincode)是一个程序,由Go、Node.js或Java编写。
  • 链码运行在安全的Docker容器中,和处理它的peer节点隔离开;
  • 链码通过应用提交的交易来修改账本状态。

接下来,我们讨论如何用【链码生命周期】来部署、管理链码。


部署链码

1、打包智能合约(Package)

首先,将智能合约打包成tar文件。可以通过Fabric peer命令、Node Fabric SDK、tar命令来实现。记得添加一个包标签作为可读的描述。

tar文件需要的格式:

  • .tar.gz后缀结尾

  • 包含两个文件:元数据文件metadata.json、链码文件code.tar.gz

  • 元数据文件定义了语言、code path、package label。例如:

    {"Path":"fabric-samples/asset-transfer-basic/chaincode-go","Type":"golang","Label":"basicv1"}

2、安装智能合约(Install)

将智能合约安装到需要执行该合约的peer节点上。

安装成功将返回一个链码包id,包括【包标签】+【包的哈希】。

保存好链码包id,用于后续在peer上查找到该合约。

3、批准链码定义(Approve)

通道中的成员需要对链码的参数投票,决定是否通过该链码。

参数包括:

  • Name
  • version
  • sequence:一个整数,作为链码序列号。当链码更新时,序列号+1。
  • Endorsement Policy
  • Collection Configuration:【私有数据集合】定义的路径。
  • ESCC/VSCC Plugins:自定义【背书/验证插件】的名称。
  • Initialization
    1. 如果你使用了低级的【链码Shim API】,你的链码需要一个Init函数。你可以指定该合约被调用之前必须被初始化。--init-required表示Init必须在任何Invoke之前运行。
    2. 如果你是用的是【Contract API】,链码中不需要Init函数。但仍然可以使用--init-required来调用Init函数。

一个通道中,每个想要使用链码的成员都需要为他的组织批准这个链码定义。他先将批准提交给ordering service,然后分发给所有的peers。这项批准由组织管理员提交,提交一个【批准交易】。

4、提交链码定义给通道(Commit)

当有足够多的通道成员批准了链码定义时,一个组织可以提交该定义给通道。组织管理员发起一个【提交交易】,来将链码提交给通道。

使用checkcommitreadiness命令查看哪些通道成员已经批准。

Channel/Application/LifecycleEndorsement策略定义了需要多少组织批准才能提交链码。

当链码被提交后,安装了链码的peer将启动链码容器,可以被其他成员调用。


更新链码

可能有两种情况:

  1. 更新链码的二进制文件;
  2. 更新链码的策略(Policy)。

以下是更新链码的步骤。

1、重新打包链码

情况1才需要。

2、在peer上安装新包

情况1才需要。

3、批准链码定义

对于情况1,你需要更新链码版本、包id。

对于情况2,你只需要更改链码的背书策略。

然后,将链码的sequence字段加1。

4、提交


版权声明:本文为Noak7原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。