⌘K

Icon Link编码

请务必阅读编码的先决条件

编码是通过ABIEncoder Icon Link完成的:

use fuels::{
    core::{codec::ABIEncoder, traits::Tokenizable},
    macros::Tokenizable,
};
 
#[derive(Tokenizable)]
struct MyStruct {
    field: u64,
}
 
let instance = MyStruct { field: 101 };
let _encoded: Vec<u8> = ABIEncoder::default().encode(&[instance.into_token()])?;

还有一个快捷宏可以编码多个实现了Tokenizable Icon Link的类型:

use fuels::{core::codec::calldata, macros::Tokenizable};
 
#[derive(Tokenizable)]
struct MyStruct {
    field: u64,
}
let _: Vec<u8> = calldata!(MyStruct { field: 101 }, MyStruct { field: 102 })?;

Icon Link配置编码器

可以配置编码器以限制其资源消耗:

use fuels::core::codec::ABIEncoder;
 
ABIEncoder::new(EncoderConfig {
    max_depth: 5,
    max_tokens: 100,
});

EncoderConfig的默认值为:

impl Default for EncoderConfig {
    fn default() -> Self {
        Self {
            max_depth: 45,
            max_tokens: 10_000,
        }
    }
}

Icon Link配置合约/脚本调用的编码器

您还可以配置用于编码合约方法参数的编码器:

let _ = contract_instance
    .with_encoder_config(EncoderConfig {
        max_depth: 10,
        max_tokens: 2_000,
    })
    .methods()
    .initialize_counter(42)
    .call()
    .await?;

同样的方法也适用于脚本调用。