链码是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目录下:使用 govendor 加载依赖
安装govendor工具
go get -u -v github.com/kardianos/govendor
进入到链码项目的目录,初始化vendor目录;
govendor init
将GOPATH中本工程使用到的依赖包自动移动到vendor目录中;
govendor add +external
使用 go mod 加载依赖
初始化 mod
go mod init
将依赖自动打包到 vendor 中
go mod vendor
打包命令具体内容请参见peer lifecycle chaincode命令。注意:
打包 Golang 链码时,-p 参数要指向链码 main package 所在的目录在 $GOPATH/src 下的相对路径;打包 Java 链码时,-p 参数要指向Java的工程目录;打包 Node.js 链码时,-p 参数要指向包含 package.json 文件的 Node.js 项目根目录;-p 参数不要使用 “./xxx”的相对路径格式。
如果链码语言是 Golang, 则可以省略 -l 选项;如果链码语言是 Node.js或者java,则使用参数 -l node 或者 -l java。
使用
--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
下载地址:
新链码的部署需要经过以下三个步骤,如果要升级通道中已有的链码,请参见升级链码:
上传链码
登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击链码包管理标签页。
单击上传链码。
在弹出的对话框中,上传在开发环境已经打包的链码,具体打包方法参见上述的打包链码。
单击确定。
上传链码成功后,链码包管理标签页的列表中会出现该链码,其中标签列显示的链码名称是您在本地打包链码时指定的。
安装链码
前提条件
您已上传链码。
操作步骤
登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击链码包管理标签页。
找到要安装的链码,在操作列中单击安装,即可将此链码安装在本组织。
安装过程中,进行一次链码的预编译,检查链码包可能存在的问题。
此操作根据链码依赖的复杂程度,需要数秒到数分钟。安装完成后,状态由未安装变为已安装,操作列中的安装变为提交定义。
提交链码定义
前提条件
您已上传链码并安装链码。
操作步骤
登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击链码包管理标签页。
找到要提交定义的链码,在操作列中单击提交定义。
根据参数说明在弹框中填写参数信息。
参数
说明
名称
系统自动显示您在本地打包链码时指定的链码名称。您可以保留该名称,也可以修改为新的链码名称。
说明已经使用过的链码名称不能再次提交链码定义。
版本
您提交链码定义时,需要为链码定义一个版本号
部署通道
选择链码部署的通道,部署成功后,该通道内的所有组织均可看到该链码。关于如何创建通道,请参见创建通道。
是否初始化
支持:如果您的链码实现了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。
单击提交。
操作成功后,您可以在链码标签页下查看该链码的状态信息,即通道状态变为共识中,组织状态显示为处理完成,单击操作列下的审批详情可以查看该链码的基本信息。
通道内其他组织确认并完成链码的提交定义。
说明默认需要通道内50%的组织通过确认,才能最终提交链码定义。
其他组织成员登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击链码标签页,在操作栏下单击去处理。
在弹出的链码处理页中,确认该链码提交的定义是否符合要求,如果符合,可直接单击提交完成确认。
当通道内50%以上的组织完成确认后,链码部署成功,在链码页签下,可以看到通道状态由原来的共识中变成运行中,操作栏增加了升级和显示日志的操作。
说明如果提交的链码定义不符合要求,其他组织可以选择不执行去处理,重新上传自己的链码包、安装并提交链码定义,此时提交的参数与原来提交的参数不一致,在链码页签下,会存在多条共识信息。