每当您在合约方法中记录一个值时,生成的日志条目将被添加到日志收据中,并且变量类型将记录在合约的 ABI 中。SDK 允许您将这些值解析为 Rust 类型。
考虑以下合约方法:
fn produce_logs_variables() {
let f: u64 = 64;
let u: b256 = 0xef86afa9696cf0dc6385e2c407a6e159a1103cefb7e2ae0636fb33d3cb2a9e4a;
let e: str[4] = __to_str_array("Fuel");
let l: [u8; 3] = [1u8, 2u8, 3u8];
log(f);
log(u);
log(e);
log(l);
}
您可以通过从 FuelCallResponse
调用 decode_logs_with_type::<T>
来在 Rust 中访问记录的值,其中 T
是您想要检索的记录变量的类型。结果将是一个 Vec<T>
:
let contract_methods = contract_instance.methods();
let response = contract_methods.produce_logs_variables().call().await?;
let log_u64 = response.decode_logs_with_type::<u64>()?;
let log_bits256 = response.decode_logs_with_type::<Bits256>()?;
let log_string = response.decode_logs_with_type::<SizedAsciiString<4>>()?;
let log_array = response.decode_logs_with_type::<[u8; 3]>()?;
let expected_bits256 = Bits256([
239, 134, 175, 169, 105, 108, 240, 220, 99, 133, 226, 196, 7, 166, 225, 89, 161, 16, 60,
239, 183, 226, 174, 6, 54, 251, 51, 211, 203, 42, 158, 74,
]);
assert_eq!(log_u64, vec![64]);
assert_eq!(log_bits256, vec![expected_bits256]);
assert_eq!(log_string, vec!["Fuel"]);
assert_eq!(log_array, vec![[1, 2, 3]]);
您可以使用 decode_logs()
函数来检索一个 LogResult
结构体,其中包含一个 results
字段,该字段是一个 Result<String>
值的向量,表示每个日志解码的成功或失败。
let contract_methods = contract_instance.methods();
let response = contract_methods.produce_multiple_logs().call().await?;
let logs = response.decode_logs();
由于可能存在性能问题,不建议在非调试场景下使用 decode_logs()
。
注意: 不能直接记录字符串片段。请先使用
__to_str_array()
函数将其转换为str[N]
。