我正在尝试在Solidity合同中实现签名,并且在比较散列时遇到问题。我使用以下代码来可靠地计算哈希值:
sha256(abi.encodePacked(param1, ...., paramN);
位置:
abi.encodePacked(param1, ..., paramN) = [bytes: 0x0102030405060701]
和
sha255(abi.encodePacked(param1, ..., paramN)) = [bytes32:
0x245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251]
我遇到的主要问题是,通过在 0102030405060701 上使用python sha256,我得到的结果是 5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5 。
我在做什么错了?
答案 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中得到的结果相匹配。