通过低级调用,您可以在运行时指定调用的参数,并通过其他合约进行间接调用。
您的调用合约应调用 std::low_level_call::call_with_function_selector
,并提供:
Bytes
编码的函数选择器 Bytes
编码的调用数据 u64
) std::low_level_call::CallParams
fn call_low_level_call(
target: ContractId,
function_selector: Bytes,
calldata: Bytes,
) {
let call_params = CallParams {
coins: 0,
asset_id: AssetId::from(ZERO_B256),
gas: 10_000,
};
call_with_function_selector(target, function_selector, calldata, call_params);
}
在 SDK 方面,您可以使用 fuels::core::encode_fn_selector
构造编码的函数选择器,并使用 fuels::core::calldata!
宏构造编码的调用数据。
例如,要调用目标合约上的以下函数:
#[storage(write)]
fn set_value_multiple_complex(a: MyStruct, b: str[4]);
您可以构造函数选择器和调用数据,并将它们提供给调用合约(就像上面的例子一样):
let function_selector = encode_fn_selector("set_value_multiple_complex");
let call_data = calldata!(
MyStruct {
a: true,
b: [1, 2, 3],
},
SizedAsciiString::<4>::try_from("fuel")?
)?;
caller_contract_instance
.methods()
.call_low_level_call(
target_contract_instance.id(),
Bytes(function_selector),
Bytes(call_data),
)
.estimate_tx_dependencies(None)
.await?
.call()
.await?;
注意:
calldata!
宏在内部使用默认的EncoderConfig
配置。