Javascript

如何計算 Javascript 中數字數組的 SHA-3?

  • April 24, 2019

文件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' });
}

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