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

时间:2018-09-12 14:25:45

标签: blockchain ethereum sha256 solidity abi

我正在尝试在Solidity合同中实现签名,并且在比较散列时遇到问题。我使用以下代码来可靠地计算哈希值:

sha256(abi.encodePacked(param1, ...., paramN);

位置:

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

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

我遇到的主要问题是,通过在 0102030405060701 上使用python sha256,我得到的结果是 5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您没有在客户端上使用正确的哈希函数。 Solidity使用 keccak256 ,尽管相似,但与 sha3-256 并不完全相同。

web3js通过专门具有soliditySha3函数来避免混淆( web3.utils.soliditySha3 )来处理此问题。

您需要检查python lib的等效项。

答案 1 :(得分:-1)

问题是您要对字符串“ 0102030405060701”进行哈希处理,但是您应该对十六进制值表示的字节进行哈希处理:

>>> import hashlib
>>> import binascii
>>> hashlib.sha256(b'0102030405060701').hexdigest()
'5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5'
>>> hashlib.sha256(binascii.unhexlify('0102030405060701')).hexdigest()
'245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251'

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