Storing Custom Types

Si bien los tipos nativos se pueden almacenar en el almacenamiento de un contrato sin ningún trabajo adicional, los tipos personalizados requieren un poco más de trabajo. Esto se debe a que en el momento de la compilación, el compilador no sabe cómo almacenar tipos personalizados en el almacenamiento. Para resolver esto, necesitamos implementar el trait Storepara nuestro tipo personalizado. Con suerte, podremos derivar este trait para nuestro tipo personalizado, a menos que contenga arrays o diccionarios.

#[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);
        }
    }
}

Juega con este contrato en Remix.

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