2.5. 合约操作
注解
合约操作包括编译、部署、调用、设置合约接口权限,目前XuperChain支持的合约语言包括C++,Go,我们以C++中的counter.cc为例,以此说明合约相关操作。
2.5.1. 合约编译
注解
合约编译是指将合约编译成二进制形式
例子:C++版本的counter.cc,counter.cc存放路径为contractsdk/cpp/example 预置条件:安装docker
- cd contractsdk/cpp
- sh build.sh
到当前目录build里,将编译好的合约二进制counter.wasm,重新命名为counter,放到某个目录下,比如笔者的目录是./output/
2.5.2. 合约账号充入测试资源
合约部署需要合约账号才能操作,因此会消耗合约账号的测试资源,需要开发者先将个人账号的测试资源转一部分给合约账号。(注意,目前不支持合约账号的测试资源再转出给个人账号,因此请按需充入测试资源。)
- Step1: 生成测试资源转给合约账号的原始交易数据,命令如下:
- ./xchain-cli multisig gen --to XC1234098776890651@xuper --amount 150000 --output rawTx.out --host 14.215.179.74:37101
其中: —amount是转出的测试资源数量,—to是接收测试资源的账号名。如果转出方不是./data/keys下的默认地址,则可以使用—from指定转账来源账号,并将该来源地址的签名在multisig send时写在Initiator的位置。
- Step2: 向黄反服务获取签名,命令如下:
- ./xchain-cli multisig get --tx ./rawTx.out --output complianceCheck.out --host 14.215.179.74:37101
- Step3: 自己对原始交易签名,命令如下:
- ./xchain-cli multisig sign --tx ./rawTx.out --output my.sign
- Step4: 将原始交易以及签名发送出去,命令如下:
- ./xchain-cli multisig send my.sign complianceCheck.out --tx ./rawTx.out -H 14.215.179.74:37101
- Step5: 查询合约账号的测试资源数额,确定转账成功:
- ./xchain-cli account balance XC1234098776890651@xuper -H 14.215.179.74:37101
2.5.3. 合约部署
注解
部署合约的前提条件是先创建一个合约账号,假设按照上述步骤已经创建了一个合约账号 XC1234098776890651@xuper
,并且对应的合约账号有充裕的测试资源 前置条件:将合约账号以及合约账号下的有权限的AK以 合约账号/address 形式以追加方式存放到 data/acl/addrs
- Step0: 合约部署需要在交易中写入满足合约账号ACL的背书AK签名,为了表示某个AK在代表某个账号背书,超级链中定义了一种AK URI,例如 dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN 代表 XC1234098776890651@xuper 这个合约账号,那么这个背书AK的AK URI可以写成:XC1234098776890651@xuper/dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN 。以此为例,背书AK URI需要同时包含黄反服务和合约账号,因此需要将 data/acl/addrs 文件改成:
- XDxkpQkfLwG6h56e896f3vBHhuN5g6M9u
- XC1234098776890651@xuper/dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
Step1: 生成部署合约的原始交易,命令如下:
- ./xchain-cli wasm deploy --account XC1234098776890651@xuper --cname counter -H 14.215.179.74:37101 -m ./counter --arg '{"creator":"xchain"}' --output contractRawTx.out --fee 137493
Step2: 向黄反服务获取签名,命令如下:
- ./xchain-cli multisig get --tx ./contractRawTx.out --host 14.215.179.74:37101 --output complianceCheck.out
Step3: 自己对原始交易签名,命令如下:
- ./xchain-cli multisig sign --tx ./contractRawTx.out --output my.sign
Step4: 将原始交易以及签名发送出去,命令如下:
- ./xchain-cli multisig send my.sign complianceCheck.out,my.sign --tx ./contractRawTx.out -H 14.215.179.74:37101
2.5.4. 合约调用
编译合约,部署合约的目的都是为了能够在区块链系统上运行智能合约,本小节说明如下调用合约。
- Step1: 生成合约调用的原始交易,命令有下面两种实现方式:
- ./xchain-cli multisig gen --desc counterIncrease.json -H 14.215.179.74:37101 --fee 85 --output rawTx.out
- # 或者这样
- ./xchain-cli wasm invoke -a '{"key":"counter"}' --method increase counter -H 14.215.179.74:37101 --fee 85 -m --output rawTx.out
- Step2: 向黄反服务获取签名,命令如下:
- ./xchain-cli multisig get --tx ./rawTx.out --host 14.215.179.74:37101 --output complianceCheck.out
- Step3: 自己对原始交易签名,命令如下:
- ./xchain-cli multisig sign --tx ./rawTx.out --output my.sign
- Step4: 将原始交易以及签名发送出去,命令如下:
- ./xchain-cli multisig send my.sign complianceCheck.out --tx ./rawTx.out -H 14.215.179.74:37101
counterIncrese.json模板,如下:
- {
- "module_name": "wasm",
- "contract_name": "counter",
- "method_name": "increase",
- "args":{
- "key":"counter"
- }
- }
2.5.5. 设置合约接口ACL
注解
有这么一种场景:合约账号A部署了counter合约,希望只有拿到特定签名的用户才能调用counter的increase方法,因此XuperChain提供对智能合约某个方法进行权限设置
前置条件:将合约账号以及合约账号下的有权限的AK以合约账号/address形式以追加方式存放到 data/acl/addrs
- Step1: 生成设置合约方法权限(ACL)的原始交易,命令如下:
- ./xchain-cli multisig gen --desc methodAclSet.json -H 14.215.179.74:37101 --fee 10 --output rawTx.out
- Step2: 向黄反服务获取签名,命令如下:
- ./xchain-cli multisig get --tx ./rawTx.out --host 14.215.179.74:37101 --output complianceCheck.out
- Step3: 自己对原始交易签名,命令如下:
- ./xchain-cli multisig sign --tx ./rawTx.out --output my.sign
- Step4: 将原始交易以及签名发送出去,命令如下:
- ./xchain-cli multisig send my.sign complianceCheck.out,my.sign --tx ./rawTx.out -H 14.215.179.74:37101
methodAclSet.json的模版,如下:
- {
- "module_name": "xkernel",
- "method_name": "SetMethodAcl",
- "args" : {
- "contract_name": "counter",
- "method_name": "increase",
- "acl": "{\"pm\": {\"rule\": 1,\"acceptValue\": 1},\"aksWeight\": {\"TqnHT6QQnD9rjvqRJehEaAUB3ZwzSFZhR\": 1}}"
- }
- }