存储自定义类型

虽然本机类型可以存储在合约的存储中,而无需任何额外的工作,但自定义类型需要更多的工作。这是因为在编译时,编译器不知道如何在存储中存储自定义类型。为了解决这个问题,我们需要为我们的自定义类型实现 Store特征。希望我们可以为我们的自定义类型派生这个特征 - 除非它包含数组或字典。

#[starknet::interface]
trait IStoringCustomType<TContractState> {
    fn set_person(ref self: TContractState, person: Person);
}

// Deriving the starknet::Store trait
// allows us to store the `Person` struct in the contract's storage.
#[derive(Drop, Serde, Copy, starknet::Store)]
struct Person {
    age: u8,
    name: felt252
}

#[starknet::contract]
mod StoringCustomType {
    use super::Person;

    #[storage]
    struct Storage {
        person: Person
    }

    #[abi(embed_v0)]
    impl StoringCustomType of super::IStoringCustomType<ContractState> {
        fn set_person(ref self: ContractState, person: Person) {
            self.person.write(person);
        }
    }
}

Remix 中尝试这个合约。

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