Rust 墨水,跨合约调用 returns ConctractTrapped 错误
Rust ink, cross contract call returns ConctractTrapped error
如标题所示,我正在尝试使用一个非常简单的字符串 return 函数在已部署的合约上调用一个函数。
已部署的 contract1 函数:
#[ink(message)]
#[ink(selector = 0xDEADBEEF)]
pub fn test(&self) -> String {
return "TEST".to_string()
}
以下代码片段是 contract2 函数,return 来自 contract1 的值:
#[ink(message)]
pub fn test1(&self,token_contract: AccountId) -> String {
let my_return_value: String = ink_env::call::build_call::<ink_env::DefaultEnvironment>()
.callee(token_contract)
.gas_limit(50000)
.transferred_value(0)
.exec_input(
ink_env::call::ExecutionInput::new(ink_env::call::Selector::new([0xDE, 0xAD, 0xBE, 0xEF]))
)
.returns::<ink_env::call::utils::ReturnType<String>>()
.fire()
.unwrap();
my_return_value
}
这意味着你的子合约,也就是持有“pub fn test”的合约已经恐慌了。
调试这个的方法是启动你的底层节点:
RUST_LOG=runtime=debug
这样您将在基板日志中得到准确的恐慌错误。
如果您希望处理调用方合约中的错误 build_call 具有 map_err 功能。您可以查看他们的多重签名示例以获取代码参考:
https://github.com/paritytech/ink/blob/master/examples/multisig/lib.rs
如标题所示,我正在尝试使用一个非常简单的字符串 return 函数在已部署的合约上调用一个函数。
已部署的 contract1 函数:
#[ink(message)]
#[ink(selector = 0xDEADBEEF)]
pub fn test(&self) -> String {
return "TEST".to_string()
}
以下代码片段是 contract2 函数,return 来自 contract1 的值:
#[ink(message)]
pub fn test1(&self,token_contract: AccountId) -> String {
let my_return_value: String = ink_env::call::build_call::<ink_env::DefaultEnvironment>()
.callee(token_contract)
.gas_limit(50000)
.transferred_value(0)
.exec_input(
ink_env::call::ExecutionInput::new(ink_env::call::Selector::new([0xDE, 0xAD, 0xBE, 0xEF]))
)
.returns::<ink_env::call::utils::ReturnType<String>>()
.fire()
.unwrap();
my_return_value
}
这意味着你的子合约,也就是持有“pub fn test”的合约已经恐慌了。
调试这个的方法是启动你的底层节点:
RUST_LOG=runtime=debug
这样您将在基板日志中得到准确的恐慌错误。
如果您希望处理调用方合约中的错误 build_call 具有 map_err 功能。您可以查看他们的多重签名示例以获取代码参考: https://github.com/paritytech/ink/blob/master/examples/multisig/lib.rs