Solidity
比較大數或十六進制的 Rust 和 Solidity 雜湊
我注意到,如果我使用 Rust 和 web3.sha3 散列普通字元串,我會得到相同的結果。但是,如果數字是大數字或十六進制,則需要將 {encoding: ‘hex’} 作為可選參數包含在 web3.sha3 中,我的 Rust 和 web3.sha3 的結果將不同。所以,我的問題是在散列之前我應該對我的 Rust 輸入做什麼?對於 Rust,我使用的是多雜湊,它是一個瘦包裝器。
let nm_str1 = "00000000000000000000000000000000000000000000000000000000000000ea"; /let output = encode(Hash::Keccak256, &nm_str1.as_bytes()).unwrap(); //JavaScript const nmStr1 = "00000000000000000000000000000000000000000000000000000000000000ea";// let output web3.sha3(nmStr1, {encoding: 'hex'}
輸入是一個十六進製字元串,所以你必須先從十六進制轉換為字節。
下面的程式碼為我產生了正確的輸出(
web3.sha3
除了我假設來自多雜湊編碼的前綴之外):extern crate multihash; extern crate rustc_hex; use multihash::{encode, Hash}; use rustc_hex::{FromHex, ToHex}; fn main() { let hex = "00000000000000000000000000000000000000000000000000000000000000ea"; let bytes = hex.from_hex().unwrap(); println!("{}", encode(Hash::Keccak256, &bytes).unwrap().to_hex()); }
對於那些想要非多雜湊版本的人:
extern crate rustc_hex; extern crate tiny_keccak; use rustc_hex::{FromHex, ToHex}; use tiny_keccak::Keccak; fn main() { let hex = "00000000000000000000000000000000000000000000000000000000000000ea"; let bytes = hex.from_hex().unwrap(); let mut h = Keccak::new_keccak256(); h.update(&bytes); let mut res: [u8; 32] = [0; 32]; h.finalize(&mut res); println!("{}", res.to_hex()); }