• 2.5. 合约操作
    • 2.5.1. 合约编译
    • 2.5.2. 合约账号充入测试资源
    • 2.5.3. 合约部署
    • 2.5.4. 合约调用
    • 2.5.5. 设置合约接口ACL

    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. }