Solidity 和 Web3 sha3() 方法返回别的东西

Posted

技术标签:

【中文标题】Solidity 和 Web3 sha3() 方法返回别的东西【英文标题】:Solidity and Web3 sha3() methods return something else 【发布时间】:2019-03-10 22:03:13 【问题描述】:

在我的合同中,我有一个函数可以返回一组特定值的 sha3 哈希值。在运行一些测试时,我发现此函数返回的值与web3.utils.sha3() 生成的哈希值不同(具有相同的参数)。

代码如下:

团结

function hashInfo() public onlyOwner view returns (bytes32) 
      bytes32 hash = sha3(
        '0x969A70A4fa9F69D2D655E4B743abb9cA297E5328',
        '0x496AAFA2960f3Ff530716B5334c9aFf4612e3c27',
        'jdiojd',
        'oidjoidj',
        'idjodj',
        12345
      )  
      return hash;
  

JS (web3)

async function testHash(instance)
  const contractHash = await instance.methods.hashInfo().call(from: '0x969A70A4fa9F69D2D655E4B743abb9cA297E5328');
  const localHash = web3.utils.sha3(
    '0x969A70A4fa9F69D2D655E4B743abb9cA297E5328',
    '0x496AAFA2960f3Ff530716B5334c9aFf4612e3c27',
    'jdiojd',
    'oidjoidj',
    'idjodj',
    12345
  )
  console.log(contractHash);
  console.log(localHash);
  console.log('local == contract: ' + (contractHash == localHash));

得到的控制台输出是:

0xe65757c5a99964b72d217493c192c073b9a580ec4b477f40a6c1f4bc537be076
0x3c23cebfe35b4da6f6592d38876bdb93f548085baf9000d538a1beb31558fc6d
local == contract: false

有什么想法吗?这与将多个参数传递给函数有关吗?我还尝试将所有内容转换为字符串并将它们连接成一个字符串,但也没有成功。

提前致谢!

更新

我还在那里发现了一个名为 web3.utils.soliditySha3() 的 web3 方法。这也不起作用,并给出了以下结果:

0xe65757c5a99964b72d217493c192c073b9a580ec4b477f40a6c1f4bc537be076
0x0cf65f7c81dab0a5d414539b0e2f3807526fd9c15e197eaa6c7706d27aa7a0f8
local == contract: false

【问题讨论】:

你能说明你是怎么称呼soliditySha3()的吗?它的 API 与 sha3() 不同。 【参考方案1】:

我很高兴我是在您更新之后才来的,因为我只是要建议 solditySHA3。现在您已经获得了正确的功能,您的问题很可能是 Soldity 打包它的参数。

如您所见here,sha3 是 keccak256 的别名,它紧紧地包装了它的参数。按照该页面上的链接,您会看到here,它充分解释了它是如何处理的。基本上只需将输入输入到soliditySHA3 并将这些位打包,就好像它们是您使用的变量的大小一样。因此,如果您对两个 uint32(每个 32 位,总共 64 个)进行哈希处理,您需要获取 2 个 64 bit javascript numbers 并将它们压缩为 1 个 Javascript 数字。

对于需要超过 64 位的情况,我相信您可以将顺序整数(64 位的集合)传递给soliditySHA3,或者您可以使用 BigInt。就个人而言,我通常尝试只将 256 位变量散列在一起,以避免在 JS 端手动打包我的位,但我们都知道 Solidity 中的空间限制很大。希望对您有所帮助,如果您还有其他问题,请告诉我。

【讨论】:

以上是关于Solidity 和 Web3 sha3() 方法返回别的东西的主要内容,如果未能解决你的问题,请参考以下文章

Solidity Keccak256与SHA3-256

Solidity、solc、web3.js、Ganache 版本组合目前正在使用啥

如何使用solidity和web3将以太币存入账户?

Solidity 函数将空数组返回给 web3.js

使用 Web3 从 Solidity 调用函数

如何将一组结构从 web3js 发送到 Solidity 合约?