链码是Hyperledger Fabric技术框架中对智能合约的实现,支持业界流行的编程语言Golang,Node.js和Java。本文介绍如何为通道部署新的链码。
本章节适用于购买Fabric 1.4版本实例的用户,如果您是Fabric 2.2 版本实例的用户,请参见管理链码(V2.2)部署链码。
用户首先要在Hyperledger Fabric开发环境中进行链码的开发,测试及打包:
链码开发指南请参见Chaincode for Developers
链码测试通过后需要用命令
peer chaincode package
进行打包。打包时建议包含所需依赖,以Golang链码为例,通过以下步骤将依赖文件置于vendor目录下:安装govendor工具
go get -u -v github.com/kardianos/govendor
进入到链码项目目录,初始化vendor目录;
govendor init
将GOPATH中本工程使用到的依赖包自动移动到vendor目录中;
govendor add +external
打包命令具体内容请参见peer 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。
如果链码的初始化方法不需要传入参数,则可以省略 -c 选项。
不要添加 -i,-S选项。
以下示例将 $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/example02 目录下的 Golang 链码源代码打包为ccpack.out, 链码名为mycc,版本1.0。
peer chaincode package ccpack.out -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/example02/cmd -c '{"Args":["init","a","100","b","200"]}' -v 1.0
peer
下载地址:
新链码的部署需要经过以下三个步骤,如果要升级通道中已有的链码,请参见升级链码:
上传链码
安装链码
实例化链码
上传链码
登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击链码标签页。
单击上传链码。
在弹出的对话框中,上传在开发环境已经打包的链码,打包方法如上所述。
选择需要部署该链码的通道。如果是新部署的链码,请注意不要和任何一个通道内已存在的链码同名。
填写背书策略。
背书策略举例:
OR ('Org1MSP.peer','Org2MSP.peer')
表示此通道中的两个组织任何一方背书即可;AND ('Org1MSP.peer','Org2MSP.peer')
表示需要此通道中的两个组织背书。单击确定。
上传链码成功后,链码标签页的列表中会出现该链码。其中链码列显示的链码名称以及版本列显示的链码版本号都是您在本地打包链码时指定的。
安装链码
前提条件
您已上传链码。
操作步骤
登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击链码标签页。
找到要安装的链码,在操作列中单击安装,即可将此链码安装在本组织。
安装完成后,安装状态由未安装变为已安装,操作列中的安装变为实例化。
如果您上传链码时设置的背书策略为需要多个组织执行此链码,那么还需要在其他组织的页面中进行安装。
实例化链码
前提条件
您已上传链码以及安装链码。
操作步骤
登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击链码标签页。
找到要安装的链码,在操作列中单击实例化。
在弹出的对话框中,系统自动显示您上传链码时填写的背书策略。您可以保留该策略,也可以修改为新的策略。
背书策略举例:
OR ('Org1MSP.peer','Org2MSP.peer')
表示此通道中的两个组织任何一方背书即可;AND ('Org1MSP.peer','Org2MSP.peer')
表示需要此通道中的两个组织背书。在对话中单击 高级 , 您可以在 隐私集配置 输入框中输入您链码的隐私集JSON定义信息(如果您的链码不需要使用隐私数据功能,您可以跳过本步骤)。
隐私集JSON定义举例:
[{"name": "collectionName", "policy": "OR('Org1MSP.peer')", "memberOnlyRead": false, "requiredPeerCount": 0, "maxPeerCount": 3, "blockToLive": 0}]
表示链码需要使用一个叫做collectionName
的隐私数据命名空间, 只有组织Org1
的节点才能获取该命名空间内的隐私数据。注意, 一但隐私集的
name
和blockToLive
被设置,您将不能在升级时对这两个值做修改。更多信息可以参考 Using Private Data in Fabric。单击实例化。
此操作根据链码依赖的复杂程度,需要数秒到数分钟。操作成功后通道状态会由未实例化变为运行中,操作列的值变为空。