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

4.2.1.3. 调用合约

  1. ./xchain-cli wasm query -a '{"key":"counter"}' -H localhost:37101 counter
  2. # 便捷方式
  3. ./xchain-cli wasm invoke -a '{"key":"counter"}' -H localhost:37101 counter
  4. # 多重签名场景
  5. # 参考部署多重签名场景
  6. ./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. cd counter
  2. go build
  3. # 产出二进制counter

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

4.2.2.1.2. 激活合约
  • 发起提案

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

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

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

    1. # 查看区块高度,是否达到提案生效高度
    2. ./xchain systemstatus -H 127.0.0.1:37101
    3. # 查看合约math的状态,status为1,代表激活成功
    4. ./xchain-cli native status -H 127.0.0.1:37101
    5. # status为1表示激活成功
4.2.2.1.3. 调用合约
  • json文件示例
  1. {
  2. "module_name":"native", # 还可以是wasm
  3. "contract_name":"counter", # 自己编写的合约名字
  4. "method_name": "initialize", # 还可写invoke和query
  5. "args" : {
  6. "key":"mycounter" # 调用的参数是kv形式
  7. }
  8. }
  • 调用合约
  1. # 参看发起多重签名交易
  2. # data/acl/addrs 维护好调用合约所需的权限集合addrs
  3. ./xchain-cli multisig gen --desc desc.json --amount=1 --to $address -H 127.0.0.1:37101
  4. # 查看合约预执行结果,通过文件visualtx.out
  5. ./xchain-cli multisig check
  6. # 继续进行后续操作...
  7. # 查询合约还可以通过此命令
  8. ./xchain-cli native query counter --args '{"key":"mycounter"}'

4.2.2.2. 访问权限管理

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