本文从概念上理解链码生命周期,而不是具体的操作
链码是什么
- 链码(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:
- 如果你使用了低级的【链码Shim API】,你的链码需要一个
Init
函数。你可以指定该合约被调用之前必须被初始化。--init-required
表示Init必须在任何Invoke之前运行。 - 如果你是用的是【Contract API】,链码中不需要
Init
函数。但仍然可以使用--init-required
来调用Init
函数。
- 如果你使用了低级的【链码Shim API】,你的链码需要一个
一个通道中,每个想要使用链码的成员都需要为他的组织批准这个链码定义。他先将批准提交给ordering service,然后分发给所有的peers。这项批准由组织管理员提交,提交一个【批准交易】。
4、提交链码定义给通道(Commit)
当有足够多的通道成员批准了链码定义时,一个组织可以提交该定义给通道。组织管理员发起一个【提交交易】,来将链码提交给通道。
使用checkcommitreadiness
命令查看哪些通道成员已经批准。
Channel/Application/LifecycleEndorsement
策略定义了需要多少组织批准才能提交链码。
当链码被提交后,安装了链码的peer将启动链码容器,可以被其他成员调用。
更新链码
可能有两种情况:
- 更新链码的二进制文件;
- 更新链码的策略(Policy)。
以下是更新链码的步骤。
1、重新打包链码
情况1才需要。
2、在peer上安装新包
情况1才需要。
3、批准链码定义
对于情况1,你需要更新链码版本、包id。
对于情况2,你只需要更改链码的背书策略。
然后,将链码的sequence字段加1。