Я пишу key: value
StorageMap
в substrate
. Я хочу сделать его неизменным, чтобы ключ записывался, если он не существует, но если он существует:
i) если значение совпадает с сохраненным, хорошо, ii) сделать транзакцию недействительной.
Я написал следующий runtime
код:
use support::{decl_module, decl_storage, dispatch::Result, StorageMap};
use system::ensure_signed;
pub trait Trait: balances::Trait {}
decl_storage! {
trait Store for Module<T: Trait> as KittyStorage {
Value: map u64 => T::AccountId;
}
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
fn set_value(origin, value: u64) -> Result {
let sender = ensure_signed(origin)?;
<Value<T>>::insert(value, sender);
Ok(())
}
}
}
В официальном учебнике говорится о смене ключа следующим образом:
/// Mutate the value under a key.
fn mutate<R, F: FnOnce(&mut Self::Query) -> R, S: Storage>(key: &K, f: F, storage: &S) -> R;
Итак, Как мне сделать мой key:value
неизменным? Должен ли я написать свой StorageMap
? Если да, где я должен разместить этот код?
Примечание: я новичок как по подложке, так и по ржавчине.