Solidity

比較大數或十六進制的 Rust 和 Solidity 雜湊

  • January 21, 2018

我注意到,如果我使用 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());
}

引用自:https://ethereum.stackexchange.com/questions/37034