5 个版本

0.13.6 2021年11月3日
0.13.5 2021年11月2日
0.13.4 2021年11月2日
0.13.3 2021年11月1日
0.13.2 2021年10月14日

#22 in #gas

MIT 许可证

680KB
16K SLoC

cosmwasm-simulate

Cosmwasm 智能合约的模拟工具

概述

cosmwasm-simulate是为Cosmwasm智能合约系统开发的,主要功能包括

  • 快速加载、部署和热重载合约,无需运行WASMD
  • 通过命令快速调用合约接口并切换合约、账户
  • 通过Restful API快速开发Dapp,并已集成到Oraichain Studio中
  • 在屏幕上打印一些调试信息
  • 在wasm实例化过程中进行一些字节码检查
  • 实时监控存储数据库的变化
  • 动态计算并打印合约执行过程中使用的gas
  • 无需输入JSON字符串即可轻松测试智能合约

Demo

构建

docker-compose up -d
docker-compose exec simulate bash
apt update -y
# needed if install sccache
apt install libssl-dev pkg-config -y && cargo install sccache
RUSTC_WRAPPER=sccache
# if unwind feature has been removed, do not use RUSTFLAGS="-C link-arg=-s", it is stripped by default
RUSTFLAGS="-C link-arg=-s" CARGO_INCREMENTAL=1 cargo build --release
# build with xargo
RUSTFLAGS="-C link-arg=-s" CARGO_INCREMENTAL=1 xargo build --release
# output is at target/release/cosmwasm-simulate
apt install upx -y
upx --best --lzma target/release/cosmwasm-simulate

# suggestion
rustup component add rls rust-analysis rust-src

模拟部署

  • 下载wasm文件
wget https://github.com/CosmWasm/cosmwasm-examples/raw/master/erc20/contract.wasm -O /workspace/artifacts
  • 以如下方式运行cosmwasm-simulate
DEBUG=true cosmwasm-simulate  /workspace/artifacts/contract.wasm port -b '{"address":"duc_addr","amount":"300000"}' -b '{"address":"tu_addr","amount":"500000"}' -c contract
  • 以下命令
cosmwasm-simulate [wasm_file]
注意:您必须确保必须包含的目录:[schema]位于wasm_file同一目录中

模拟运行

cosmwasm-simulate将在代码编译完成后自动加载json schema文件以分析所有消息类型和结构类型。
它将引导您输入正确的命令和数据结构

示例

例如,我们使用repo~/github.com/cosmwasm/cosmwasm-examples/erc20/contract.wasm来测试此工具,您可以从Cosmwasm-github下载erc20合约示例
1. 加载wasm

cosmwasm-simulate ~/github.com/cosmwasm/cosmwasm-examples/erc20/contract.wasm

2. 输入init

Input call type (init | handle | query | contract | account)
init

3. 输入消息类型名称InitMsg,它将在屏幕上打印出来

Input Call param from [ Constants | HandleMsg | QueryMsg | InitMsg | BalanceResponse | AllowanceResponse |  ]
InitMsg
InitMsg {
	decimals : integer
	initial_balances : InitialBalance :{
		address : HumanAddr
		amount : Uint128
	}
	name : string
	symbol : string
}

4. 逐步输入InigMsg的每个成员

input [decimals]:
9
input [initial_balances]:
input 	[address : HumanAddr]:
ADDR0012345
input 	[amount : Uint128]:
112233445
input [name]:
OKB
input [symbol]:
OKBT

5. 完成初始化
工具将在屏幕上打印数据库更改和使用gas

===========================call started===========================
executing func [init] , params is {"decimals":9,"initial_balances":[{"address":"ADDR0012345","amount":"112233445"}],"name":"OKB","symbol":"OKBT"}
DB Changed : [Insert]
Key        : balancesADDR0012345]
Value      : [000862616c616e6365734144445230303132333435000000000000000000]
DB Changed : [Insert]
Key        : [configconstants]
Value      : [{"name":"OKB","symbol":"OKBT","decimals":9}]
DB Changed : [Insert]
Key        : [configtotal_supply]
Value      : [0006636f6e666967746f74616c5f737570706c79]
init msg.data: =
Gas used   : 59422
===========================call finished===========================
Call return msg [Execute Success]

6. 调用查询

Input call type(init | handle | query):
query
Input Call param from [ Constants | HandleMsg | QueryMsg | InitMsg | BalanceResponse | AllowanceResponse |  ]
QueryMsg
Input Call param from [ allowance | balance |  ]
balance

7. 逐步输入QueryMsg的每个成员

input [address]:
ADDR0012345
JsonMsg:{"balance":{"address":"ADDR0012345"}}
===========================call started===========================
executing func [query] , params is {"balance":{"address":"ADDR0012345"}}
query msg.data: = {"balance":"112233445"}
Gas used   : 19239
===========================call finished===========================
Call return msg [Execute Success]

构建Docker镜像

docker build-t orai/cosmwasm-simulate:0.11-slim-f Dockerfile.

未来

  • 更多自定义功能
  • 更多功能支持
  • 启用本地代币交换

依赖项

~23–36MB
~555K SLoC