Как хранить хеши в цепочке субстратов?
Моя цель - хранить хеш-значения в цепочке субстратов. Я объявил хранилище и модуль для него в следующем коде:
use support::{decl_module, decl_storage, dispatch::Result, ensure, StorageMap};
use system::ensure_signed;
pub trait Trait: balances::Trait {}
decl_storage! {
trait Store for Module<T: Trait> as KittyStorage {
Value: map str => Option<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)?;
ensure!(!<Value<T>>::exists(value), "key already exists");
<Value<T>>::insert(value, sender);
Ok(())
}
}
}
Код работал нормально, как и ожидалось, пока я использовал u64
в строке, но я получил сообщение об ошибке, когда изменил его на str
:
Value: map str => Option<T::AccountId>;
Ошибка:
error[E0277]: the trait bound `str: _::_parity_scale_codec::EncodeLike` is not satisfied
--> /Users/aviralsrivastava/dev/substrate-package/substrate-node-template/runtime/src/substratekitties.rs:6:1
|
6 | / decl_storage! {
7 | | trait Store for Module<T: Trait> as KittyStorage {
8 | | Value: map str => Option<T::AccountId>;
9 | | }
10 | | }
| |_^ the trait `_::_parity_scale_codec::EncodeLike` is not implemented for `str`
|
Я пробовал читать об этом, но не смог найти другого метода хранения строки. Хотя моя строка будет фиксированного размера, так как всегда будет SHA256.
1 ответ
Вы должны использовать хэш известного размера, поэтому сделайте что-нибудь вроде:
type MyHash = [u8; 32];
Это будет 256-битный хеш.
Затем вы можете создать предмет для хранения:
Value: map MyHash => Option<T::AccountId>;
Вы также можете использовать Hash
примитив, определенный в вашей среде выполнения с помощью T::Hash
, что делает его совместимым с примитивами хеширования по умолчанию в вашей среде выполнения. Это будет выглядеть так:
Value: map T::Hash => Option<T::AccountId>;
В Substrate это H256 по умолчанию (что в основном то же, что и выше, но более общее, поскольку оно может изменяться и переопределяться во время выполнения).