4. 智能合约开发

4.1. 编写合约

参考源码样例 …/github.com/xuperchain/xuperunion/contractsdk/go/example/counter/counter.go 主要实现一个struct的三个方法,initialize,invoke和query,来实现自己的逻辑

4.2. wasm合约

4.2.1. 部署合约

4.2.1.1. 编译

注意合约编译环境与源码编译环境一致

1
GOOS=js GOARCH=wasm go build

将编译好的合约二进制counter放到目录node/data/blockchain/${chain name}/native/下 其中${chain name}=xuper,因为样例是xuper链

4.2.1.2. 部署

1
2
3
4
5
6
7
# 便捷方式
## 账户下权限AK是自己,提前创建好账号,并保证账号下有钱
./xchain-cli wasm deploy --account XC1111111111110600@xuper --cname counter -H localhost:37101 data/blockchain/xuper/native/counter
# 多重签名场景
## 提前维护好data/acl/addrs 需要的合作的地址
./xchain-cli wasm deploy --account XC1111111111110600@xuper --cname counter -H localhost:37801 -m data/blockchain/xuper/native/counter
## 后续参看多重签名交易的后续check,sign,send场景

4.2.1.3. 调用合约

1
2
3
4
5
6
./xchain-cli wasm query -a '{"key":"counter"}' -H localhost:37101 counter
# 便捷方式
./xchain-cli wasm invoke -a '{"key":"counter"}' -H localhost:37101 counter
# 多重签名场景
# 参考部署多重签名场景
./xchain-cli wasm invoke -a '{"key":"counter"}' -H localhost:37101 counter -m

4.2.2. native合约

4.2.2.1. 部署合约

4.2.2.1.1. 编译文件

编译合约,注意合约编译环境与源码编译环境一致

1
2
3
cd counter
go build
# 产出二进制counter

将编译好的合约二进制counter放到目录node/data/blockchain/${chain name}/native/下 其中${chain name}=xuper,因为样例是xuper链

4.2.2.1.2. 激活合约
  • 发起提案

    合约可以被使用需要发起提案,并投票,通过投票后方可激活合约

    1
    2
    3
    ./xchain-cli native activate --vote-height-offset 50 counter --version 1.0.0 -H 127.0.0.1:37101
    # --vote-height-offset 表明距离当前高度多高后开始计票判断合约是否可以生效
    # 执行完后得到proposal id
    
  • 投票

    1
    2
    3
    # data/keys下的账户对此提案投票token数量为amount
    ./xchain-cli vote --amount 100000499592699999999 --frozen 5550 abd9bf4472a833b096a5dc58847cc249b9765a49511d4a69e364e6651607bf94 #proposal id
    # 提案可以生效需要提案的票数占据总币量的51%,当然这是默认配置比例
    
  • 确认是否激活

    1
    2
    3
    4
    5
    # 查看区块高度,是否达到提案生效高度
    ./xchain systemstatus -H 127.0.0.1:37101
    # 查看合约math的状态,status为1,代表激活成功
    ./xchain-cli native status -H 127.0.0.1:37101
    # status为1表示激活成功
    
4.2.2.1.3. 调用合约
  • json文件示例

1
2
3
4
5
6
7
8
{
    "module_name":"native",      # 还可以是wasm
    "contract_name":"counter",   # 自己编写的合约名字
    "method_name": "initialize", # 还可写invoke和query
    "args" : {
        "key":"mycounter"        # 调用的参数是kv形式
    }
}
  • 调用合约

1
2
3
4
5
6
7
8
# 参看发起多重签名交易
# data/acl/addrs 维护好调用合约所需的权限集合addrs
./xchain-cli multisig gen --desc desc.json --amount=1 --to $address -H 127.0.0.1:37101
# 查看合约预执行结果,通过文件visualtx.out
./xchain-cli multisig check
# 继续进行后续操作...
# 查询合约还可以通过此命令
./xchain-cli native query counter --args '{"key":"mycounter"}'

4.2.2.2. 访问权限管理

合约方法的ACL控制参看 设置合约方法权限样例