首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在底层链中存储哈希?

如何在底层链中存储哈希?
EN

Stack Overflow用户
提问于 2020-03-18 01:03:13
回答 1查看 294关注 0票数 0

我的目标是在底层链中存储散列值。我在下面的代码中声明了它的存储和模块:

代码语言:javascript
复制
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>;

错误是:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-18 02:13:23

您应该使用已知大小的散列,因此可以这样做:

代码语言:javascript
复制
type MyHash = [u8; 32];

这将是一个256位的哈希。

然后您可以创建一个存储项目:

代码语言:javascript
复制
Value: map MyHash => Option<T::AccountId>;

您还可以将运行时中定义的Hash原语与T::Hash一起使用,这使得它与运行时中的默认哈希原语兼容。这看起来像是:

代码语言:javascript
复制
Value: map T::Hash => Option<T::AccountId>;

在底层中,它默认是H256 (这基本上与上面的事情相同,但更通用,因为它可以由运行时更改和重新定义)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60726987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档