结构体作为映射键

为了使用结构体作为映射键,您可以在结构体定义上使用 #[derive(Hash)]。这将为结构体自动生成一个哈希函数,可以在 LegacyMap 中将该结构体作为键来使用。

考虑以下示例,我们希望使用类型为 Pet 的对象作为 LegacyMap 中的键。Pet 结构体有三个字段:nameageowner。假设这三个字段的组合能唯一地标识一只宠物。

#[derive(Copy, Drop, Serde, Hash)]
struct Pet {
    name: felt252,
    age: u8,
    owner: felt252,
}

#[starknet::interface]
trait IPetRegistry<TContractState> {
    fn register_pet(ref self: TContractState, key: Pet, timestamp: u64);
    fn get_registration_date(self: @TContractState, key: Pet) -> u64;
}

#[starknet::contract]
mod PetRegistry {
    use hash::{HashStateTrait, Hash};
    use super::Pet;

    #[storage]
    struct Storage {
        registration_time: LegacyMap::<Pet, u64>,
    }

    #[abi(embed_v0)]
    impl PetRegistry of super::IPetRegistry<ContractState> {
        fn register_pet(ref self: ContractState, key: Pet, timestamp: u64) {
            self.registration_time.write(key, timestamp);
        }

        fn get_registration_date(self: @ContractState, key: Pet) -> u64 {
            self.registration_time.read(key)
        }
    }
}

Remix 上测试这个合约.

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