Go-Ethereum

如何在js中使用web3.sha3獲得與soliditySHA3(ethereumjs-abi)返回相同的SHA3雜湊?

  • April 29, 2020

我正在嘗試散列一條消息,如下所示:

function constructPaymentMessage(contractAddress, amount) {
 return ethereumjs.ABI.soliditySHA3(
   ["address", "uint256"],
   [contractAddress, amount],
 );
}

我如何使用web3.sha3而不是ABI.soliditySHA3正確獲取 SHA3 雜湊,有什麼區別嗎?謝謝。

在 web3 版本 1.2.6 中,我們有以下內容:

此方法僅將輸入作為字元串併計算輸入的 sha3 等效值。

為了實現您想要實現的目標,ethereumjs.ABI.soliditySHA3您應該使用web3.utils.soliditySha3

將以與solidity相同的方式計算給定輸入參數的sha3。這意味著參數將在散列之前進行 ABI 轉換和緊密打包。

function constructPaymentMessage(contractAddress, amount) {
 // the types are auto-detected
 return web3.utils.soliditySHA3(contractAddress, amount);
}

在這裡也許這會有所幫助https://web3js.readthedocs.io/en/1.0/web3-utils.html#soliditysha3

或者

這實際上是在 ethereumjs-abi 中實現的:

var abi = require('ethereumjs-abi')
var BN = require('bn.js')

abi.soliditySHA3(
   [ "address", "address", "uint", "uint" ],
   [ new BN("43989fb883ba8111221e89123897538475893837", 16), 0, 10000, 1448075779 ]
).toString('hex')

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