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控制参看 设置合约方法权限样例