Как хранить хэши в цепочке субстратов? - PullRequest
0 голосов
/ 17 марта 2020

Моя цель - сохранить значения ha sh в цепочке субстратов. Я объявил хранилище и модуль для него в следующем коде:

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 Ответ

1 голос
/ 17 марта 2020

Вы должны использовать га sh известного размера, поэтому сделайте что-то вроде:

type MyHash = [u8; 32];

Это будет 256-битное га sh.

Тогда вы может создать элемент хранения:

Value: map MyHash => Option<T::AccountId>;

Вы также можете использовать примитив Hash, определенный в вашей среде выполнения с T::Hash, что делает его совместимым с примитивами хеширования по умолчанию в вашей среде выполнения. Это будет выглядеть так:

Value: map T::Hash => Option<T::AccountId>;

В Substrate это H256 по умолчанию (что в основном то же самое, что и выше, но более общее, поскольку оно может изменяться и переопределяться средой выполнения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...