⌘K

Icon Link日志

每当您在合约方法中记录一个值时,生成的日志条目将被添加到日志收据中,并且变量类型将记录在合约的 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()

Icon InfoCircle

注意: 不能直接记录字符串片段。请先使用 __to_str_array() 函数将其转换为 str[N]