哪個 sha3 輸出是正確的?
我試圖用 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正在處理什麼。