入口点中的自定义类型
在入口点中使用自定义类型需要我们的类型来实现Serde
trait。这是因为在调用入口点时,输入以felt252
数组的形式发送到入口点,我们需要能够将其反序列化为我们的自定义类型。同样,当从入口点返回自定义类型时,我们需要能够将其序列化为felt252
数组。
值得庆幸的是,我们可以为我们的自定义类型派生Serde
特征。
#[starknet::interface]
trait ISerdeCustomType<TContractState> {
fn person_input(ref self: TContractState, person: SerdeCustomType::Person);
fn person_output(self: @TContractState) -> SerdeCustomType::Person;
}
#[starknet::contract]
mod SerdeCustomType {
#[storage]
struct Storage {}
// Deriving the `Serde` trait allows us to use
// the Person type as an entrypoint parameter and return value
#[derive(Drop, Serde)]
struct Person {
age: u8,
name: felt252
}
#[abi(embed_v0)]
impl SerdeCustomType of super::ISerdeCustomType<ContractState> {
fn person_input(ref self: ContractState, person: Person) {}
fn person_output(self: @ContractState) -> Person {
Person { age: 10, name: 'Joe' }
}
}
}
在 Remix 中尝试这个合约。