如何为 Solidity 生成的整数值生成 sh3_keccak256?

Posted

技术标签:

【中文标题】如何为 Solidity 生成的整数值生成 sh3_keccak256?【英文标题】:How to generate sh3_keccak256 for integer values as generated by Solidity? 【发布时间】:2018-09-07 00:25:23 【问题描述】:

我正在尝试在 Python 中生成与 Solidity 生成的相同的 sha3.keccak_256 整数值。

Solidity 的作用如下:

pragma solidity ^0.4.18;

contract GenerateHash
    function generateHashVal(int id, int date) pure public returns (bytes32)
        //Using values - (123,1522228250);
        return keccak256(id,date);
    

由此产生的哈希为0xdf4ccab87521641ffc0a552aea55be3a0c583544dc761541784ec656668f4c5a

但在 Python3 中,我无法为整数值生成相同的值。如果我将它类型转换为字符串,那么我可以获得一些值,但这与 Solidity 的值不匹配:

>>> s=sha3.keccak_256(repr(data).encode('utf-8')).hexdigest()
>>> print(s)
37aafdecdf8b7e9da212361dfbb20d96826ae5cc912ac972f315228c0cdc51c5
>>> print(data)
1231522228250

感谢任何帮助。

【问题讨论】:

【参考方案1】:

解决方案

查看web3 python 库,它有许多有用的函数*。在这种情况下,我们可以使用Web3.soliditySha3()。您传入类型和数据,它会为您生成哈希,如下所示:

from web3 import Web3

result = Web3.soliditySha3(['uint256', 'uint256'], [123, 1522228250])

assert result == "0xdf4ccab87521641ffc0a552aea55be3a0c583544dc761541784ec656668f4c5a"

Web3 v4 说明

v4 即将推出。它在很多地方都从十六进制字符串切换到了bytes,包括这个函数。因此,如果您使用pip install --pre web3 安装(我建议您这样做,直到 v4 稳定),对上述内容进行轻微修改:

assert Web3.toHex(result) == "0xdf4ccab87521641ffc0a552aea55be3a0c583544dc761541784ec656668f4c5a"

其他资源

以太坊 StackExchange 是一个针对以太坊特定问题的非常活跃的网站。您可能会得到更快的响应,并找到更多已经提出的问题。例如,这里提出了类似的问题:Python and Solidity keccak256 function gives different results。

* 免责声明:我是web3.py repo 的贡献者。

【讨论】:

我只在我的项目中使用 web3.py,它只是没有点击查看它的库来完成这项任务。感谢您的信息。【参考方案2】:

您需要构建正确的二进制表示,它应该是两个连接在一起的 32 字节整数。可能还有其他方法可以做到这一点,但这里有一种方法可以将所有内容转换为具有正确填充的十六进制,然后使用 binascii.unhexlify 转换为字节序列:

sha3.keccak_256(binascii.unhexlify(':064x:064x'.format(123, 1522228250))).hexdigest()

# output: 'df4ccab87521641ffc0a552aea55be3a0c583544dc761541784ec656668f4c5a'

【讨论】:

以上是关于如何为 Solidity 生成的整数值生成 sh3_keccak256?的主要内容,如果未能解决你的问题,请参考以下文章

如何为表单验证生成错误消息

如何为使用 Rotativa 生成动态内容的 PDF 生成页脚

如何为整个数据库生成脚本

如何为特定提交生成 Git 补丁?

如何为 Dataverse API 生成访问令牌

如何为 StreamBuilder 生成的小部件设置动画?