智能合约管理(Fabric 1.4)
点融区块链云服务平台所说的智能合约对应Hyperledger Fabric区块链中的chaincode,也有人翻译为链码。目前Hyperledger Fabric 1.0.x版本只支持 Go语言开发的智能合约,Fabric 1.3.x版本可以支持Go、NodeJS和Java等三种语言开发的智能合约。智能合约必须在区块链节点上完成安装并且在指定通道上进行初始化后,才可以执行。
下载智能合约工具
为了方便用户打包和测试智能合约,点融区块链云服务平台提供了点融区块链智能合约工具(Fabric 1.4)。它是一个可执行文件,目前支持Windows、Linux、MacOS系统。请点击这里下载,然后解压,并将其所在路径设置到PATH环境变量中。该工具的用法请看这里。
打包智能合约
智能合约开发人员需要将开发好的智能合约使用点融区块链智能合约工具(Fabric 1.4)进行打包,然后将打包文件发送给拥有点融区块链云服务平台账号权限的用户安装部署。
打包工具既支持将所有打包参数放置在配置文件中打包,也支持将所有打包参数通过命令行参数的形式传入。以下将介绍这两种方法:
方法1:使用智能合约打包配置文件package.yaml打包。
package.yaml文件名不可变,参数可根据您的情况进行调整。如下图所示:
假定智能合约的开发语言为Golang,用户的智能合约源代码目录为example_cc。将该配置文件与可执行文件“chaincode”放在同一目录下,并将智能合约置于"$GOPATH/src/github.com/example_cc" 目录下。 对于NodeJS或者Java开发的智能合约,"Path"参数需要设置为智能合约所在目录的绝对路径。"Args"参数可以设置默认的智能合约初始化参数。在实际初始化智能合约到通道时,如果设置了初始化参数,那么会覆盖默认的智能合约包中的初始化参数。
在命令行切换到配置文件和可执行文件“chaincode”所在的目录,使用可执行文件“chaincode”打包智能合约:
chaincode package
此命令将"$GOPATH/src/github.com/example_cc"目录下的智能合约文件全部打包,在当前目录生成文件名为example_cc-1.0.0.pkg的打包文件。请注意您的系统已经定义GOPATH系统环境变量(只针对Golang开发的智能合约)。
方法2:不使用打包配置文件,将所有打包参数通过命令行参数的形式传入来打包。
完整的打包命令为:
./chaincode package --type="golang" --name="example_cc" --version="1.0.0" --path="github.com/example_cc" --output=example_cc.1.0.0.pkg
注意:如果是在MacOS系统下打包,请把源代码目录下的所有“.DS_Store“文件删除,否则有可能导致智能合约安装失败。
上传智能合约
用户登录点融区块链云服务平台之后,在下图所示界面中点击"我的合约"菜单项将显示用户上传或购买的智能合约列表。如果用户需要上传新的智能合约,点击"上传智能合约"按钮或者点击"立即上传"链接。
之后用户可以看到下图的上传智能合约表单,需要输入智能合约名称、支持的区块链平台类型版本等信息,然后点击"发送上传请求到客户端"按钮。
此后会回到智能合约列表,多了一条等待批准上传的智能合约记录。
此后用户需要登录点融区块链客户端,上传对应的智能合约包(需要使用点融区块链智能合约工具生成)并且批准该上传智能合约请求。 如下图所示,当客户端收到批准请求时右上角的通知中心会有小红点提示,点击它会看到需要处理的批准请求,点击"立即处理",将出现具体的批准请求内容。
以下是上传智能合约的请求页面,点击"导入"按钮,选择已经打包好的智能合约,将会显示已导入的智能合约信息。然后点击"批准"按钮,客户端将会上传智能合约到BaaS控制台。
现在回到BaaS控制台"我的智能合约"页面,点击智能合约列表界面中的智能合约"详情",可以查看如下图所示的智能合约详情页面。
购买智能合约
用户登录点融区块链云服务平台之后,在下图所示界面中点击"我的合约"菜单项将显示用户上传或购买的智能合约列表。如果用户需要购买智能合约,点击"立即购买"链接或者点击"合约商店"菜单项。
之后用户可以看到合约商店中可购买的合约列表。
之后用户可以点击"购买"按钮进行合约购买。
购买成功后,回到"我的合约",即可看到刚购买的合约信息。
发布智能合约
用户完成上传智能合约或购买智能合约后,可以将智能合约发布在指定的区块链上。如果指定的区块链是联盟链,发布之后,联盟链中的所有成员都可以下载、审核和安装该智能合约。 一旦用户发布智能合约到指定区块链,该区块链上将保留一份该智能合约发布时的副本。以后即使用户删除了上传的智能合约,发布时生成的智能合约副本也不会被删除.
用户如果需要发布智能合约到指定的区块链,可以点击智能合约列表界面中相应智能合约的"发布"按钮,并选择区块链和要发布的智能合约版本。发布区块链时,可以指定哪些组织可以看到该区块链,也就是指定的组织才能安装该区块链。同时也可以指定哪些组织需要对该智能合约进行签名,只有满足签名策略后,该智能合约才能发布到区块链上。如下图所示。
进入刚指定的区块链的智能合约子菜单,可以看到已经在该区块链上发布的智能合约列表,因为刚才发布的状态为"等待发布确认"的智能合约
此后用户需要登录点融区块链客户端,批准刚刚的发布请求,如下图所示。
批准成功后,在区块链详情页面智能合约列表上可以看到状态已经更新为"就绪"。
安装智能合约
如果智能合约已经成功发布到区块链上,在该对应区块链的智能合约子菜单,点击上图所示的"安装"按钮,将显示下图对话框,用户可以选择需要安装该智能合约的Peer节点, 然后点击"发送安装请求到客户端"按钮等待客户端批准。
接下来用户需要登录客户端批准该安装智能合约请求,如下图所示。
批准成功后,刷新区块链的智能合约子菜单页面,可以看到下图所示的节点智能合约安装状态显示为"已安装"。
初始化智能合约
节点安装智能合约后,需要在指定的节点已经加入的通道上完成初始化,智能合约才可以被调用执行。如果希望同一个智能合约在多个不同的通道上运行,需要分别在每个通道上都做一次初始化。 如果节点加入了一个通道,该通道上已经完成了某个智能合约,那么节点一旦安装完该智能合约,该合约立即就可以在相应通道上被调用执行。初始化智能合约的具体步骤如下:
在对应区块链的智能合约子菜单页面,点击需要进行初始化的智能合约项的"初始化"按钮,如下图所示:
随后会弹出初始化智能合约对话框,选择需要在哪个通道上进行初始化,填入JSON格式的智能合约初始化参数(例如:{"Args":["init","a","100","b","200"]}), 并选择背书策略(注意可能需要向智能合约的开发或运维人员获取对应的初始化参数和背书策略), 然后点击"发送初始化请求到客户端"按钮,如下图所示:
接下来用户登录点融区块链云服务平台客户端,对相应的初始化请求做签名和确认操作。注意这两步操作需要和区块链做交互,可能会比较耗时,请耐心等待。
用户在客户端签名、确认成功后,在浏览器查看相应的智能合约详情,可以看到智能合约已经完成在所选通道上的初始化,如下图所示。 此后用户就可以在该通道上运行执行智能合约,完成业务逻辑了。
升级智能合约
在"我的智能合约"页面,找到想要升级智能合约,点击后面对应的“更新”按钮。
在弹出的“更新智能合约”对话框里,在“智能合约版本”一栏,输入新版本的版本号,在“功能详细说明”一栏,可以添加一些功能说明。之后,点击“发送更新请求到客户端”。
注意到此时的智能合约记录最新版本显示为“1.1.0”,状态为“等待上传”。
打开客户端后,在“申请管理里面”可以看到刚才提交的请求,在导入新版本的智能合约之后,如下图所示。然后点击批准。
此时,可以上传新版本的智能合约包,成功后点击“批准”。这时刷新智能合约记录页面,可以看到该合约的状态已经从“等待上传”变更为“就绪”。至此,智能合约版本更新成功。后续新版本智能合约的安装和初始化,与先前的步骤类似。
调用智能合约
点融区块链智能合约工具也支持通过命令行的方式调用智能合约(下载和安装请参考这里)。智能合约工具通过与点融区块链客户端导出的组织证书配合,通过简单的配置,就可以方便的调用智能合约。下面介绍如何使用点融智能合约工具调用智能合约。
- 导出组织的用户证书
打开点融区块链客户端,进入到区块链对应的保险箱中,点击组织列表。确保要导出的组织中,已经创建了普通类型的用户,比如下图中的Org1已经创建普通用户User1。如果没有创建普通用户,那么点击"新建用户"按钮,创建普通用户。然后点击"导出用户"按钮,选择导出的目标目录后,会导出该组织的用户证书。
在本示例中,导出的文件路径为: /Users/fengfeng/Desktop/blockchain_Org1.zip。解压该文件,得到组织Org1的用户文件夹。
- 生成智能合约调用的配置文件
执行下面的命令,会自动生成invoke.yaml和package.yaml。其中invoke.yaml是调用智能合约的配置文件,package.yaml是打包智能合约的配置文件。
chaincode init
默认生成的invoke.yaml文件,如下图所示:
- 配置智能合约调用的配置文件
打开invoke.yaml文件,下面以智能合约商店中的dr_test_cc智能合约为例,配置invoke.yaml文件如下图所示:
复制invoke.yaml文件的内容到query.yaml文件中,然后配置query.yaml文件。该配置文件是调用dr_test_cc的查询接口,配置query.yaml文件如下图所示(注意:IsQuery: true):
- 调用智能合约
执行下面的命令调用智能合约dr_test_cc的invoke接口
chaincode invoke --conf=invoke.yaml
结果如下:
执行下面的命令调用智能合约dr_test_cc的query接口
chaincode invoke --conf=query.yaml
智能合约工具用法
chaincode help 打印使用说明
chaincode pacakge --conf=package.yaml 按照指定的配置文件打包智能合约
chaincode package --help 打印package命令的使用说明
chaincode inspect --file=example_cc.pkg 查看智能合约打包文件example_cc.pkg的相关信息
chaincode extract --file=example_cc.pkg 解开智能合约打包文件example_cc.pkg,可以用来审核里面的智能合约
chaincode inspect --file=example_cc.1.0.0 --env 查看在Peer节点的智能合约目录中的文件相关信息
chaincode extract --file=example_cc.1.0.0 --env 解开在Peer节点的智能合约目录中的文件,可以用来审核里面的智能合约
chaincode invoke --conf=invoke.yaml 按照指定的配置文件调用智能合约