微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Substrate 中散列并检查散列是否匹配

如何解决在 Substrate 中散列并检查散列是否匹配

fn reveal_Vote(phrase: Vec<u8>,hash: Vec<u8>) {

}

我想检查短语的哈希与作为 Vec 提交的哈希匹配。
我尝试使用 hex 和 sha3 包。但是 Substrate 中不允许使用十六进制和 format! 宏。
我怎样才能匹配哈希?在 Substrate 中有什么具体的方法吗?

使用 sp_io::hashing

#[weight = 10_000 + T::DbWeight::get().reads_writes(3,3)]
        pub fn test_hash(origin,phrase: Vec<u8>,hash:Vec<u8>) -> dispatch::dispatchResult   {
            let phrase_bytes: &[u8] = &phrase;
            let data = sp_io::hashing::keccak_256(phrase_bytes);
            println!("{:?}",data.to_vec());
            println!("{:?}",hash);

             Ok(())

        }

测试:

#[test]
fn hash_test() {
    new_test_ext().execute_with(|| {
        let ok = TemplateModule::test_hash(Origin::signed(1),"1-abcdef".as_bytes().to_vec(),"e2a18e9b74f228590ca8c563cecfc58c28455b2dde25b4bbdc663e99e791f47c".as_bytes().to_vec());
    });
}

问题是 data.to_vec() 和 hash 不匹配。

data.to_vec() 值为:

[226,161,142,155,116,242,40,89,12,168,197,99,206,207,140,69,91,45,222,37,180,187,220,102,62,153,231,145,244,124]

哈希值为:

[101,50,97,49,56,101,57,98,55,52,53,48,54,51,100,99]

解决方法

通过传递 [u8;32] 而不是十六进制字符串作为 Vec 解决了这个问题。不知道是不是直观的解决方法。

前端:

import {keccakAsU8a} from "@polkadot/util-crypto"
let hash = keccakAsU8a("1-abcdef");
console.log(hash)

然后将哈希传递给运行时函数

#[weight = 10_000 + T::DbWeight::get().reads_writes(0,1)]
pub fn test_hash(origin,phrase: Vec<u8>,hash:[u8; 32]) -> dispatch::DispatchResult   {
   let phrase_bytes: &[u8] = &phrase;
   let data = sp_io::hashing::keccak_256(phrase_bytes); 
   ensure!(data == hash,Error::<T>::CommitVoteMismatch);
   Ok(())
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。