abi.encodePacked(...) 和 sha256(..) 如何在 Solidity 中工作?

Jor*_*nal 5 abi sha256 blockchain ethereum solidity

我正在尝试在 Solidity 合同中实现签名,但在比较哈希时遇到了问题。我使用以下代码计算哈希值:

sha256(abi.encodePacked(param1, ...., paramN);
Run Code Online (Sandbox Code Playgroud)

在哪里:

abi.encodePacked(param1, ..., paramN) = [bytes: 0x0102030405060701]

sha255(abi.encodePacked(param1, ..., paramN)) = [bytes32: 0x245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251]

我在的主要问题是,通过使用Python的SHA256 0102030405060701我得到的结果是5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5

我究竟做错了什么?

use*_*559 1

问题是您正在对字符串“0102030405060701”进行散列,但您应该对十六进制值表示的字节进行散列:

>>> import hashlib
>>> import binascii
>>> hashlib.sha256(b'0102030405060701').hexdigest()
'5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5'
>>> hashlib.sha256(binascii.unhexlify('0102030405060701')).hexdigest()
'245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251'
Run Code Online (Sandbox Code Playgroud)

请注意,对字符串进行哈希处理会产生与您在问题中提到的相同(不正确)的值,但首先通过转换为二进制会产生unhexlify正确的结果,与您在 Solidity 中获得的结果相匹配。