Javascript
如何計算 Javascript 中數字數組的 SHA-3?
文件說
sha3
計算緊湊參數的雜湊值。數字似乎被轉換為 ASCII 字元。考慮
sha3(values)
在 Solidity 中使用 typeint8[3] values
和 Javascript 數組let values = [-1, 0, 1];
,如何計算web3.sha3(...)
Javascript 中的雜湊以獲得與 Solidity 中相同的結果?到目前為止我嘗試了什麼:
web3.sha3(values.map((x) => String.fromCharCode(x)).join(''))
另外,為什麼這兩個不同:
> sha3([int8(-1), int8(0), int8(1)]) 0x485d3017777c5ed1be9073116ba54b48f208c386ab83497d9c3a015a8382849e > sha3(int8(-1), int8(0), int8(1)) 0x8404dcb0a81bbb8eccbf96f10e1874b12380080d2143c02c8e44db200aaff384
我在 Github 上發現了這個問題,它似乎無法處理我的負數情況。也許我應該在Javascript中轉換為uint?
我終於找到了解決方案。
本期給出的功能是起點。為了使其適用於負數,我不得不將其更改為:
function solSha3 (...args) { args = args.map(arg => { if (typeof arg === 'string') { if (arg.substring(0, 2) === '0x') { return arg.slice(2); } else { return web3.toHex(arg).slice(2); } } if (typeof arg === 'number') { if (arg < 0) { return leftPad((arg >>> 0).toString(16), 64, 'F'); } return leftPad((arg).toString(16), 64, 0); } else { return ''; } }); args = args.join(''); return '0x' + web3.sha3(args, { encoding: 'hex' }); }