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. 编译
注意合约编译环境与源码编译环境一致
GOOS=js GOARCH=wasm go build
将编译好的合约二进制counter放到目录node/data/blockchain/${chain name}/native/下 其中${chain name}=xuper,因为样例是xuper链
4.2.1.2. 部署
# 便捷方式
## 账户下权限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. 调用合约
./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. 编译文件
编译合约,注意合约编译环境与源码编译环境一致
cd counter
go build
# 产出二进制counter
将编译好的合约二进制counter放到目录node/data/blockchain/${chain name}/native/下 其中${chain name}=xuper,因为样例是xuper链
4.2.2.1.2. 激活合约
发起提案
合约可以被使用需要发起提案,并投票,通过投票后方可激活合约
./xchain-cli native activate --vote-height-offset 50 counter --version 1.0.0 -H 127.0.0.1:37101
# --vote-height-offset 表明距离当前高度多高后开始计票判断合约是否可以生效
# 执行完后得到proposal id
投票
# data/keys下的账户对此提案投票token数量为amount
./xchain-cli vote --amount 100000499592699999999 --frozen 5550 abd9bf4472a833b096a5dc58847cc249b9765a49511d4a69e364e6651607bf94 #proposal id
# 提案可以生效需要提案的票数占据总币量的51%,当然这是默认配置比例
确认是否激活
# 查看区块高度,是否达到提案生效高度
./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文件示例
{
"module_name":"native", # 还可以是wasm
"contract_name":"counter", # 自己编写的合约名字
"method_name": "initialize", # 还可写invoke和query
"args" : {
"key":"mycounter" # 调用的参数是kv形式
}
}
- 调用合约
# 参看发起多重签名交易
# 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控制参看 设置合约方法权限样例