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 key 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::{
U256,
storage::{
Mapping,
traits::ManualKey,
},
};
#[ink(storage)]
#[derive(Default)]
pub struct MyContract {
balances: Mapping<Address, U256, ManualKey<123>>,
}
impl MyContract {
#[ink(constructor)]
pub fn new() -> Self {
let mut instance = Self::default();
let caller = Self::env().caller();
let value: U256 = 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 thekeytogether with thevalueexceeds 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 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.Noneif 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.
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.Noneif there was no value under this mapping key.
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,
We implement this manually because the derived implementation adds trait bounds.
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>
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> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for 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<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from.§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.