Struct ink_storage::Mapping
source · pub struct Mapping<K, V: Packed, KeyType: StorageKey = AutoKey> { /* private fields */ }
Expand description
A mapping of key-value pairs directly into contract storage.
§Important
The mapping requires its own pre-defined storage key where to store values. By
default, the is automatically calculated using AutoKey
during compilation. However, anyone can specify a storage key using
ManualKey
. Specifying the storage key can be helpful for
upgradeable contracts or you want to be resistant to future changes of storage key
calculation strategy.
This is an example of how you can do this:
use ink::storage::{
traits::ManualKey,
Mapping,
};
#[ink(storage)]
#[derive(Default)]
pub struct MyContract {
balances: Mapping<AccountId, Balance, ManualKey<123>>,
}
impl MyContract {
#[ink(constructor)]
pub fn new() -> Self {
let mut instance = Self::default();
let caller = Self::env().caller();
let value: Balance = Default::default();
instance.balances.insert(&caller, &value);
instance
}
}
More usage examples can be found in the ink! examples.
Implementations§
source§impl<K, V, KeyType> Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
impl<K, V, KeyType> Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
source§impl<K, V, KeyType> Mapping<K, V, KeyType>where
K: Encode,
V: Packed,
KeyType: StorageKey,
impl<K, V, KeyType> Mapping<K, V, KeyType>where
K: Encode,
V: Packed,
KeyType: StorageKey,
sourcepub fn insert<Q, R>(&mut self, key: Q, value: &R) -> Option<u32>where
Q: EncodeLike<K>,
R: Storable + EncodeLike<V>,
pub fn insert<Q, R>(&mut self, key: Q, value: &R) -> Option<u32>where
Q: EncodeLike<K>,
R: Storable + EncodeLike<V>,
Insert the given value
to the contract storage.
Returns the size in bytes of the pre-existing value at the specified key if any.
§Panics
Traps if encoding the key
together with the value
doesn’t fit into the static
buffer.
sourcepub fn try_insert<Q, R>(&mut self, key: Q, value: &R) -> Result<Option<u32>>where
Q: EncodeLike<K>,
R: Storable + EncodeLike<V>,
pub fn try_insert<Q, R>(&mut self, key: Q, value: &R) -> Result<Option<u32>>where
Q: EncodeLike<K>,
R: Storable + EncodeLike<V>,
Try to insert the given value
into the mapping under given key
.
Fails if key
or value
exceeds the static buffer size.
Returns:
Ok(Some(_))
if the value was inserted successfully, containing the size in bytes of the pre-existing value at the specified key if any.Ok(None)
if the insert was successful but there was no pre-existing value.Err(_)
if encoding thekey
together with thevalue
exceeds the static buffer size.
sourcepub fn get<Q>(&self, key: Q) -> Option<V>where
Q: EncodeLike<K>,
pub fn get<Q>(&self, key: Q) -> Option<V>where
Q: EncodeLike<K>,
Get the value
at key
from the contract storage.
Returns None
if no value
exists at the given key
.
§Panics
Traps if the the encoded key
or value
doesn’t fit into the static buffer.
sourcepub fn try_get<Q>(&self, key: Q) -> Option<Result<V>>where
Q: EncodeLike<K>,
pub fn try_get<Q>(&self, key: Q) -> Option<Result<V>>where
Q: EncodeLike<K>,
Try to get the value
at the given key
.
Returns:
Some(Ok(_))
containing the value if it existed and was decoded successfully.Some(Err(_))
if either (a) the encoded key doesn’t fit into the static buffer or (b) the value existed but its length exceeds the static buffer size.None
if there was no value under this mapping key.
sourcepub fn take<Q>(&self, key: Q) -> Option<V>where
Q: EncodeLike<K>,
pub fn take<Q>(&self, key: Q) -> Option<V>where
Q: EncodeLike<K>,
Removes the value
at key
, returning the previous value
at key
from
storage.
Returns None
if no value
exists at the given key
.
§Panics
Traps if the encoded key
or value
doesn’t fit into the static buffer.
§Warning
This method uses the unstable interface, which is unsafe and normally is not available on production chains.
sourcepub fn try_take<Q>(&self, key: Q) -> Option<Result<V>>where
Q: EncodeLike<K>,
pub fn try_take<Q>(&self, key: Q) -> Option<Result<V>>where
Q: EncodeLike<K>,
Try to take the value
at the given key
.
On success, this operation will remove the value from the mapping
Returns:
Some(Ok(_))
containing the value if it existed and was decoded successfully.Some(Err(_))
if either (a) the encoded key doesn’t fit into the static buffer or (b) the value existed but its length exceeds the static buffer size.None
if there was no value under this mapping key.
§Warning
This method uses the unstable interface, which is unsafe and normally is not available on production chains.
sourcepub fn size<Q>(&self, key: Q) -> Option<u32>where
Q: EncodeLike<K>,
pub fn size<Q>(&self, key: Q) -> Option<u32>where
Q: EncodeLike<K>,
Get the size in bytes of a value stored at key
in the contract storage.
Returns None
if no value
exists at the given key
.
Trait Implementations§
source§impl<K, V, KeyType> Default for Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
impl<K, V, KeyType> Default for Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
We implement this manually because the derived implementation adds trait bounds.
source§impl<K, V, KeyType> Storable for Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
impl<K, V, KeyType> Storable for Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
source§fn encode<T: Output + ?Sized>(&self, _dest: &mut T)
fn encode<T: Output + ?Sized>(&self, _dest: &mut T)
source§fn decode<I: Input>(_input: &mut I) -> Result<Self, Error>
fn decode<I: Input>(_input: &mut I) -> Result<Self, Error>
source§fn encoded_size(&self) -> usize
fn encoded_size(&self) -> usize
source§impl<K, V, Key, InnerKey> StorableHint<Key> for Mapping<K, V, InnerKey>
impl<K, V, Key, InnerKey> StorableHint<Key> for Mapping<K, V, InnerKey>
§type PreferredKey = InnerKey
type PreferredKey = InnerKey
source§impl<K, V, KeyType> StorageKey for Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
impl<K, V, KeyType> StorageKey for Mapping<K, V, KeyType>where
V: Packed,
KeyType: StorageKey,
source§impl<K, V, KeyType> StorageLayout for Mapping<K, V, KeyType>where
K: TypeInfo + 'static,
V: Packed + StorageLayout + TypeInfo + 'static,
KeyType: StorageKey + TypeInfo + 'static,
impl<K, V, KeyType> StorageLayout for Mapping<K, V, KeyType>where
K: TypeInfo + 'static,
V: Packed + StorageLayout + TypeInfo + 'static,
KeyType: StorageKey + TypeInfo + 'static,
source§impl<K, V, KeyType> TypeInfo for Mapping<K, V, KeyType>where
PhantomData<fn() -> (K, V, KeyType)>: TypeInfo + 'static,
K: TypeInfo + 'static,
V: Packed + TypeInfo + 'static,
KeyType: StorageKey + TypeInfo + 'static,
impl<K, V, KeyType> TypeInfo for Mapping<K, V, KeyType>where
PhantomData<fn() -> (K, V, KeyType)>: TypeInfo + 'static,
K: TypeInfo + 'static,
V: Packed + TypeInfo + 'static,
KeyType: StorageKey + TypeInfo + 'static,
Auto Trait Implementations§
impl<K, V, KeyType> Freeze for Mapping<K, V, KeyType>
impl<K, V, KeyType> RefUnwindSafe for Mapping<K, V, KeyType>
impl<K, V, KeyType> Send for Mapping<K, V, KeyType>
impl<K, V, KeyType> Sync for Mapping<K, V, KeyType>
impl<K, V, KeyType> Unpin for Mapping<K, V, KeyType>
impl<K, V, KeyType> UnwindSafe for Mapping<K, V, KeyType>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read more§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.