如何解决在 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 举报,一经查实,本站将立刻删除。