0

通读墨迹源代码(此处),我的理解是合约调用是与函数的任何参数连接的选择器。

在 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 程序来工作,该程序能够在不传递任何参数的情况下调用导出的“调用”。

模块合约的完整存储库也在 github 上。

4

0 回答 0