【问题标题】:How to store hashes in the Substrate Chain?如何在 Substrate 链中存储哈希?
【发布时间】:2020-03-17 17:03:13
【问题描述】:

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

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 =&gt; Option&lt;T::AccountId&gt;;

错误是:

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。

【问题讨论】:

  • 或许可以试试String 而不是str
  • 你也可以试试数组。所以,例如,[u8; 20]
  • 如解释 in this answer str 长度未知,无法实例化 AFAIK。
  • HereEncode 的一揽子实现列表,您可以仔细阅读以了解要使用的类型。

标签: rust substrate polkadot


【解决方案1】:

您应该使用已知大小的哈希,所以请执行以下操作:

type MyHash = [u8; 32];

这将是一个 256 位哈希。

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

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

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

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

在 Substrate 中,默认为 H256(与上面基本相同,但更通用,可以由运行时更改和重新定义)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2012-11-12
    • 2012-10-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多