2.5. 合约操作

注解

合约操作包括编译、部署、调用、设置合约接口权限,目前XuperChain支持的合约语言包括C++,Go,我们以C++中的counter.cc为例,以此说明合约相关操作。

2.5.1. 合约编译

注解

合约编译是指将合约编译成二进制形式

例子:C++版本的counter.cc,counter.cc存放路径为contractsdk/cpp/example 预置条件:安装docker

  1. cd contractsdk/cpp
  2. sh build.sh

到当前目录build里,将编译好的合约二进制counter.wasm,重新命名为counter,放到某个目录下,比如笔者的目录是./output/

2.5.2. 合约账号充入测试资源

合约部署需要合约账号才能操作,因此会消耗合约账号的测试资源,需要开发者先将个人账号的测试资源转一部分给合约账号。(注意,目前不支持合约账号的测试资源再转出给个人账号,因此请按需充入测试资源。)

  • Step1: 生成测试资源转给合约账号的原始交易数据,命令如下:
  1. ./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: 向黄反服务获取签名,命令如下:
  1. ./xchain-cli multisig get --tx ./rawTx.out --output complianceCheck.out --host 14.215.179.74:37101
  • Step3: 自己对原始交易签名,命令如下:
  1. ./xchain-cli multisig sign --tx ./rawTx.out --output my.sign
  • Step4: 将原始交易以及签名发送出去,命令如下:
  1. ./xchain-cli multisig send my.sign complianceCheck.out --tx ./rawTx.out -H 14.215.179.74:37101
  • Step5: 查询合约账号的测试资源数额,确定转账成功:
  1. ./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 文件改成:
  1. XDxkpQkfLwG6h56e896f3vBHhuN5g6M9u
  2. XC1234098776890651@xuper/dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN

Step1: 生成部署合约的原始交易,命令如下:

  1. ./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: 向黄反服务获取签名,命令如下:

  1. ./xchain-cli multisig get --tx ./contractRawTx.out --host 14.215.179.74:37101 --output complianceCheck.out

Step3: 自己对原始交易签名,命令如下:

  1. ./xchain-cli multisig sign --tx ./contractRawTx.out --output my.sign

Step4: 将原始交易以及签名发送出去,命令如下:

  1. ./xchain-cli multisig send my.sign complianceCheck.out,my.sign --tx ./contractRawTx.out -H 14.215.179.74:37101

2.5.4. 合约调用

编译合约,部署合约的目的都是为了能够在区块链系统上运行智能合约,本小节说明如下调用合约。

  • Step1: 生成合约调用的原始交易,命令有下面两种实现方式:
  1. ./xchain-cli multisig gen --desc counterIncrease.json -H 14.215.179.74:37101 --fee 85 --output rawTx.out
  2. # 或者这样
  3. ./xchain-cli wasm invoke -a '{"key":"counter"}' --method increase counter -H 14.215.179.74:37101 --fee 85 -m --output rawTx.out
  • Step2: 向黄反服务获取签名,命令如下:
  1. ./xchain-cli multisig get --tx ./rawTx.out --host 14.215.179.74:37101 --output complianceCheck.out
  • Step3: 自己对原始交易签名,命令如下:
  1. ./xchain-cli multisig sign --tx ./rawTx.out --output my.sign
  • Step4: 将原始交易以及签名发送出去,命令如下:
  1. ./xchain-cli multisig send my.sign complianceCheck.out --tx ./rawTx.out -H 14.215.179.74:37101

counterIncrese.json模板,如下:

  1. {
  2. "module_name": "wasm",
  3. "contract_name": "counter",
  4. "method_name": "increase",
  5. "args":{
  6. "key":"counter"
  7. }
  8. }

2.5.5. 设置合约接口ACL

注解

有这么一种场景:合约账号A部署了counter合约,希望只有拿到特定签名的用户才能调用counter的increase方法,因此XuperChain提供对智能合约某个方法进行权限设置

前置条件:将合约账号以及合约账号下的有权限的AK以合约账号/address形式以追加方式存放到 data/acl/addrs

  • Step1: 生成设置合约方法权限(ACL)的原始交易,命令如下:
  1. ./xchain-cli multisig gen --desc methodAclSet.json -H 14.215.179.74:37101 --fee 10 --output rawTx.out
  • Step2: 向黄反服务获取签名,命令如下:
  1. ./xchain-cli multisig get --tx ./rawTx.out --host 14.215.179.74:37101 --output complianceCheck.out
  • Step3: 自己对原始交易签名,命令如下:
  1. ./xchain-cli multisig sign --tx ./rawTx.out --output my.sign
  • Step4: 将原始交易以及签名发送出去,命令如下:
  1. ./xchain-cli multisig send my.sign complianceCheck.out,my.sign --tx ./rawTx.out -H 14.215.179.74:37101

methodAclSet.json的模版,如下:

  1. {
  2. "module_name": "xkernel",
  3. "method_name": "SetMethodAcl",
  4. "args" : {
  5. "contract_name": "counter",
  6. "method_name": "increase",
  7. "acl": "{\"pm\": {\"rule\": 1,\"acceptValue\": 1},\"aksWeight\": {\"TqnHT6QQnD9rjvqRJehEaAUB3ZwzSFZhR\": 1}}"
  8. }
  9. }