如何写合约,与编译之前的文章已经写过了,准备好.wasm文件。
xwasm/wasm/tests at main · XuHugo/xwasm · GitHub
let modules = fs::read("./tests/wasmfile/contract.wasm").unwrap();
- let engine = wasmtime::Engine::new(Config::new().epoch_interruption(true)).unwrap();
-
- let aot_bytes = match engine.precompile_module(wasm_bytes) {
-
- Ok(b) => b,
-
- Err(_e) => return,
-
- };
预编译需要借助wasmtime,生成一个engine的实例。
- let metadata = Metadata {
-
- block_time: 111,
-
- block_height: 222,
-
- tx_hash: String::from("txhash"),
-
- };
-
- #[derive(Serialize, Deserialize, Debug)]
-
- //#[state(contract="xq")]
-
- struct Param {
-
- name: String,
-
- age: u64,
-
- sex: String,
-
- }
-
- let a: Param = Param {
-
- name: String::from("xq"),
-
- age: 18,
-
- sex: String::from("man"),
-
- };
-
- let ctx = Context::init(
-
- String::from("init_xq"),
-
- String::from(""),
-
- String::from(serde_json::to_string(&a).unwrap()),
-
- Address::from("0xf6b02a2d47b84e845b7e3623355f04tbi0000002"),
-
- Address::from("0xf6b02a2d47b84e845b7e3623355f04tbi0000002"),
-
- Address::from("0xf6b02a2d47b84e845b7e3623355f04tbi0000002"),
-
- 100,
-
- metadata,
-
- false,
-
- 10000,
-
- );
大部分参数没有什么特别的,这里需要注意的是,合约的参数,是json格式,需要提前转换好;
参数依次是,函数名,上下文,合约字节码,token;
- let ret = WasmtimeRuntime::execute("init_xq", ctx, &aot_bytes, 0);
-
- match ret {
-
- Ok(r) => println!("{:?}", r),
-
- Err(e) => println!("{:?}", e),
-
- }
init_xq这个函数可以看一下合约里,虽然没有这个名字的函数,但是却可以正常调用,这是因为我们用宏修改了名字,让每个合约的初始化函数,都统一为init_xxx.
- #[init(contract = "xq", payable)]
- fn init
Copy>(ctx: C, _amoun3: u64) -> CResult