• 智能合约语言(eDSL)—— 测试


    1、准备合约

    如何写合约,与编译之前的文章已经写过了,准备好.wasm文件。

    2、测试程序

    xwasm/wasm/tests at main · XuHugo/xwasm · GitHub

    2.1 读取合约
    let modules = fs::read("./tests/wasmfile/contract.wasm").unwrap();
    2.2预编译合约
    1. let engine = wasmtime::Engine::new(Config::new().epoch_interruption(true)).unwrap();
    2.     let aot_bytes = match engine.precompile_module(wasm_bytes) {
    3.         Ok(b) => b,
    4.         Err(_e) => return,
    5.     };

    预编译需要借助wasmtime,生成一个engine的实例。

    2.3准备链的上下文
    1. let metadata = Metadata {
    2.         block_time: 111,
    3.         block_height: 222,
    4.         tx_hash: String::from("txhash"),
    5.     };
    6.     #[derive(Serialize, Deserialize, Debug)]
    7.     //#[state(contract="xq")]
    8.     struct Param {
    9.         name: String,
    10.         age: u64,
    11.         sex: String,
    12.     }
    13.     let a: Param = Param {
    14.         name: String::from("xq"),
    15.         age: 18,
    16.         sex: String::from("man"),
    17.     };
    18.     let ctx = Context::init(
    19.         String::from("init_xq"),
    20.         String::from(""),
    21.         String::from(serde_json::to_string(&a).unwrap()),
    22.         Address::from("0xf6b02a2d47b84e845b7e3623355f04tbi0000002"),
    23.         Address::from("0xf6b02a2d47b84e845b7e3623355f04tbi0000002"),
    24.         Address::from("0xf6b02a2d47b84e845b7e3623355f04tbi0000002"),
    25.         100,
    26.         metadata,
    27.         false,
    28.         10000,
    29.     );

    大部分参数没有什么特别的,这里需要注意的是,合约的参数,是json格式,需要提前转换好;

    2.4 运行合约

    参数依次是,函数名,上下文,合约字节码,token; 

    1. let ret = WasmtimeRuntime::execute("init_xq", ctx, &aot_bytes, 0);
    2.     match ret {
    3.         Ok(r) => println!("{:?}", r),
    4.         Err(e) => println!("{:?}", e),
    5.     }

    init_xq这个函数可以看一下合约里,虽然没有这个名字的函数,但是却可以正常调用,这是因为我们用宏修改了名字,让每个合约的初始化函数,都统一为init_xxx.

    1. #[init(contract = "xq", payable)]
    2. fn initCopy>(ctx: C, _amoun3: u64) -> CResult

  • 相关阅读:
    如何在Retail Link网站上与Walmart进行EDI连接测试?
    聚观早报 | 保时捷将于月底挂牌上市;宁德时代首创MTB技术落地
    HZOJ-251:士兵
    【侯捷C++面向对象高级编程】(下)
    笔记本电脑的麦克风没有声音
    程序员必须要懂的首字母大写规范
    OpenShift常用管理命令杂记
    SQL 注入漏洞详解
    如何通过快速的指标组合,查看广告的支出回报率
    STM32 10个工程篇:1.IAP远程升级(六)
  • 原文地址:https://blog.csdn.net/xq723310/article/details/138158801