编码和解码按照Fuel 规范 进行。为此,fuels
使用了ABIEncoder
和ABIDecoder
。
要编码一个类型,必须首先将其转换为Token
。这通常通过实现Tokenizable
特性来完成。
要解码,也需要提供描述该类型模式的ParamType
。这通常通过实现Parameterize 特性来完成。
所有由abigen!
宏生成的类型都实现了Tokenizable
和Parameterize
特性。
fuels
还包含了以下类型的实现:
Tokenizable
适用于此处 列出的fuels
拥有的类型以及一些外部类型 (例如u8
、u16
、std::vec::Vec<T: Tokenizable>
等)。 Parameterize
适用于此处 列出的fuels
拥有的类型以及一些外部类型 (例如u8
、u16
、std::vec::Vec<T: Parameterize>
等)。 如果所有内部类型都实现了派生特性,那么Tokenizable
和Parameterize
都可以为struct
和enum
派生:
use fuels::macros::{Parameterize, Tokenizable};
#[derive(Parameterize, Tokenizable)]
struct MyStruct {
field_a: u8,
}
#[derive(Parameterize, Tokenizable)]
enum SomeEnum {
A(MyStruct),
B(Vec<u64>),
}
注意: 为
enum
派生Tokenizable
要求所有变体也实现Parameterize
。
派生代码期望fuels
包通过::fuels
访问。如果情况并非如此,则需要给派生宏提供fuels::types
和fuels::core
的位置。
#[derive(Parameterize, Tokenizable)]
#[FuelsCorePath = "fuels_core_elsewhere"]
#[FuelsTypesPath = "fuels_types_elsewhere"]
pub struct SomeStruct {
field_a: u64,
}
如果需要生成no-std
代码:
use fuels::macros::{Parameterize, Tokenizable};
#[derive(Parameterize, Tokenizable)]
#[NoStd]
pub struct SomeStruct {
field_a: u64,
}