В модуле времени выполнения субстрата как сравнить входной хеш с известным значением хеш-значения по умолчанию? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь сравнить неизвестное 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 Ответ

1 голос
/ 08 октября 2019
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: кодирует данные типа и возвращает фрагмент.

Не уверен, является ли это наиболее эффективным или эргономичным способом, но я протестировал его на работу.

...