Keccak

哪個 sha3 輸出是正確的?

  • December 28, 2017

我試圖用 PHP 重寫所有乙太坊地址創建和 Tx 創建,我幾乎就在那裡。我已經實現了一個 sha3,但現在我對它是否給我正確的輸出感到困惑,因為在處理帶前綴的十六進製字元時,似乎乙太坊 sha3 實現缺乏一致性以下哪個場景具有此 RPL 雜湊的正確 sha3。在我的 php 中,我生成了這個 RPL 雜湊(它的十六進制輸出) PS 我知道乙太坊 sha3(Keccak)和標準 sha3 ec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2880429d069189e00008003808 之間的區別

現在使用 Parity 節點和 web3js 我創建了一個 sha3()。

方案 1

web3.utils.sha3('ec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2880429d069189e000080038080')

或者

web3.utils.sha3('ec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2880429d069189e000080038080',{encoding:'hex'})

‘0x9a8419514d3c7382a6dafc67adf18ac13b818687e9a074a0cee123e0f9a483d8’

方案 2

web3.utils.sha3('0xec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2880429d069189e000080038080')

‘0xf1d622e8725ef0dd84e1e65239a0ecac4428b05a2ee0c219739e6e85eb57a8b6’

情景 3

使用乙太坊

var util = require('ethereumjs-util');
var hashed = util.sha3('0xec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2880429d069189e000000038080')

‘0x0e79fdc47ef979edbbed33d347f42da74849149139db9d5a58a4038ae6bdc99c’

情景 4

(使用 etheruemjs)

var util = require('ethereumjs-util');
var hashed = util.sha3('ec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2880429d069189e000080038080')

‘0x9a8419514d3c7382a6dafc67adf18ac13b818687e9a074a0cee123e0f9a483d8’

就是這個,假設你正在做的是散列 45 個連續字節:

> web3.utils.sha3('0xec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2880429d069189e000080038080',{encoding:'hex'})
'0xf1d622e8725ef0dd84e1e65239a0ecac4428b05a2ee0c219739e6e85eb57a8b6'

(事實證明,“encoding:‘hex’”標誌在 Web3 1.0 中是可選的。以前不是。)

為了確認這一點,我編寫了一個小LLL 程序來從 EVM 中獲得權威答案:

(returnlll
 (seq
    [0]:0xec0185055f9408bc82520c94145e99f7bc840f3ea42d9a64221f041f9955dca2
   [32]:0x880429d069189e00008003808000000000000000000000000000000000000000
   (return (keccak256 0 45))))

執行它給出,

{"id":1,"jsonrpc":"2.0","result":"0xf1d622e8725ef0dd84e1e65239a0ecac4428b05a2ee0c219739e6e85eb57a8b6"}

如上。

我很確定這是正確的。它盡可能接近 EVM,而無需編寫字節碼。

在您的大多數其他範例(場景 1 和 4)中,您正在對 ASCII 字元串表示進行雜湊處理,您可以使用此實用程序進行確認。我不知道場景3正在處理什麼。

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