我的目标是在底层链中存储散列值。我在下面的代码中声明了它的存储和模块:
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。
发布于 2020-03-18 02:13:23
您应该使用已知大小的散列,因此可以这样做:
type MyHash = [u8; 32];这将是一个256位的哈希。
然后您可以创建一个存储项目:
Value: map MyHash => Option<T::AccountId>;您还可以将运行时中定义的Hash原语与T::Hash一起使用,这使得它与运行时中的默认哈希原语兼容。这看起来像是:
Value: map T::Hash => Option<T::AccountId>;在底层中,它默认是H256 (这基本上与上面的事情相同,但更通用,因为它可以由运行时更改和重新定义)。
https://stackoverflow.com/questions/60726987
复制相似问题