入口点中的自定义类型

在入口点中使用自定义类型需要我们的类型来实现Serdetrait。这是因为在调用入口点时,输入以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 中尝试这个合约。

Last change: 2023-10-12, commit: 90aa7c0