From d9a3cac3515839556f36616a50c7a5f86beb0e80 Mon Sep 17 00:00:00 2001 From: Jules Doumeche <30329843+julio4@users.noreply.github.com> Date: Thu, 5 Oct 2023 20:54:43 +0900 Subject: [PATCH] fix: #87 (#89) --- .../struct_as_mapping_key/src/contract.cairo | 16 +++++----------- .../struct_as_mapping_key/src/test.cairo | 1 - src/ch01-03-struct-mapping-key.md | 2 +- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/listings/ch01-advanced-concepts/struct_as_mapping_key/src/contract.cairo b/listings/ch01-advanced-concepts/struct_as_mapping_key/src/contract.cairo index cf7b4460..217442da 100644 --- a/listings/ch01-advanced-concepts/struct_as_mapping_key/src/contract.cairo +++ b/listings/ch01-advanced-concepts/struct_as_mapping_key/src/contract.cairo @@ -1,13 +1,13 @@ #[starknet::contract] mod PetRegistry { - use poseidon::poseidon_hash_span; + use hash::{HashStateTrait, Hash}; #[storage] struct Storage { - registration_time: LegacyMap::, + registration_time: LegacyMap::, } - #[derive(Copy, Drop, Serde)] + #[derive(Copy, Drop, Serde, Hash)] struct Pet { name: felt252, age: u8, @@ -18,17 +18,11 @@ mod PetRegistry { #[generate_trait] impl PetRegistry of PetRegistryTrait { fn register_pet(ref self: ContractState, key: Pet, timestamp: u64) { - let mut serialized: Array = ArrayTrait::new(); - Serde::::serialize(@key, ref serialized); - let hashed_key = poseidon_hash_span(serialized.span()); - self.registration_time.write(hashed_key, timestamp); + self.registration_time.write(key, timestamp); } fn get_registration_date(self: @ContractState, key: Pet) -> u64 { - let mut serialized: Array = ArrayTrait::new(); - Serde::::serialize(@key, ref serialized); - let hashed_key = poseidon_hash_span(serialized.span()); - self.registration_time.read(hashed_key) + self.registration_time.read(key) } } } diff --git a/listings/ch01-advanced-concepts/struct_as_mapping_key/src/test.cairo b/listings/ch01-advanced-concepts/struct_as_mapping_key/src/test.cairo index 8f4562e9..35ab1da0 100644 --- a/listings/ch01-advanced-concepts/struct_as_mapping_key/src/test.cairo +++ b/listings/ch01-advanced-concepts/struct_as_mapping_key/src/test.cairo @@ -25,7 +25,6 @@ mod tests { let pet = Pet { name: 'Cute Labrador', age: 5, owner: 'Louis' }; // Store a pet. - contract.register_pet(pet, 1234); // Read the array. diff --git a/src/ch01-03-struct-mapping-key.md b/src/ch01-03-struct-mapping-key.md index 974a160b..50e773dd 100644 --- a/src/ch01-03-struct-mapping-key.md +++ b/src/ch01-03-struct-mapping-key.md @@ -1,6 +1,6 @@ # Structs as mapping keys -It is currently impossible to use structs as mapping keys. However, a workaround consists in hashing the values of all the struct's fields, and use this hash as a key in the `LegacyMap` type. +In order to use structs as mapping keys, you can use `#[derive(Hash)]` on the struct definition. This will automatically generate a hash function for the struct that can be used to represent the struct as a key in a `LegacyMap`. Consider the following example in which we would like to use an object of type `Pet` as a key in a `LegacyMap`. The `Pet` struct has three fields: `name`, `age` and `owner`. We consider that the combination of these three fields uniquely identifies a pet.