如何在 Substrate Chain 中存储哈希值?
How to store hashes in the Substrate Chain?
我的objective是在substrate链中存储hash值。我已经在下面的代码中为它声明了存储和模块:
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。
您应该使用已知大小的散列,因此请执行以下操作:
type MyHash = [u8; 32];
这将是一个 256 位散列。
然后你可以创建一个存储项目:
Value: map MyHash => Option<T::AccountId>;
您还可以将运行时中定义的 Hash
原语与 T::Hash
一起使用,这使其与运行时中的默认散列原语兼容。看起来像:
Value: map T::Hash => Option<T::AccountId>;
在Substrate中,默认是H256(和上面基本一样,但是更通用,因为它可以在运行时改变和重新定义)。
我的objective是在substrate链中存储hash值。我已经在下面的代码中为它声明了存储和模块:
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。
您应该使用已知大小的散列,因此请执行以下操作:
type MyHash = [u8; 32];
这将是一个 256 位散列。
然后你可以创建一个存储项目:
Value: map MyHash => Option<T::AccountId>;
您还可以将运行时中定义的 Hash
原语与 T::Hash
一起使用,这使其与运行时中的默认散列原语兼容。看起来像:
Value: map T::Hash => Option<T::AccountId>;
在Substrate中,默认是H256(和上面基本一样,但是更通用,因为它可以在运行时改变和重新定义)。