在Substrate运行时模块中,如何将输入哈希值与已知的默认哈希值进行比较?

时间:2019-10-07 15:16:34

标签: parity substrate

我正在尝试将未知的input_hash与运行时知道的default_hash_value进行比较。

十六进制的default_hash_value是5198bfa9da6f9c9d22dd2b0ce301dde9fd3c5826a117705d3ffa415d83a6bde8,它是使用Blake2哈希算法从字符串A nice default hash生成的。

a)我认为T::Hash是正确的输入类型,但是...

b)如何在运行时模块中对default_hash_value进行编码,以便可以按照以下方式进行比较:


if let default_hash_value = input_hash {
    //... this is the default value do, something
} else {
    //... this is not the default value, do something else
}

主要问题是对已知值进行编码。

1 个答案:

答案 0 :(得分:1)

fn compare(input: T::Hash) {
    let default_hash = hex!("5198bfa9da6f9c9d22dd2b0ce301dde9fd3c5826a117705d3ffa415d83a6bde8");

    ensure!(default_hash == input.encode().as_slice(), "not equal");
}

在这里,我将两个值都转换为字节数组,然后进行了比较。

hex!宏来自hex-literal的板条箱:https://docs.rs/hex-literal/0.2.1/hex_literal/

  

此板条箱可提供十六进制!宏,用于在编译时将十六进制字符串文字转换为字节数组。

T::Hash使用parity_codec::Encode特性转换:https://substrate.dev/rustdocs/master/parity_scale_codec/index.html#encode

  

encode(&self)-> Vec:对类型数据进行编码并返回一个切片。

不确定这是最有效还是最符合人体工程学的方法,但是我已经对其进行了测试。