通读墨迹源代码(此处),我的理解是合约调用是与函数的任何参数连接的选择器。
在 Substrate 运行时模块测试中,我使用了 CallData 构建器,它按照描述进行操作
let mut call = CallData::new( Selector::from_str("foo") );
call.push_arg(&0);
然后通过contracts frame模块进行调用
let res = <contracts::Module<Test>>::bare_call(
ALICE,
contract_addr,
0,
100_000,
//codec::Encode::encode(&call.to_bytes().to_vec()));
call.to_bytes().to_vec());
对一个合约函数签名
fn foo(&self, x: AccountId)
这将返回一个成功的执行 ( Ok(())
) 但不调用合约函数。
值得一提的是,测试正在使用type AccountId = u64
,并且 ink 使用 a struct AccountId([u8;32])
,但我尝试将其作为 32 个字节传递,但并没有什么不同。
我已经验证了周围的测试代码应该可以通过调用一个用 wat here编写的 wasm 程序来工作,该程序能够在不传递任何参数的情况下调用导出的“调用”。