Blockchain abi.encodePacked(…)和sha256(…)是如何稳定工作的?

Blockchain abi.encodePacked(…)和sha256(…)是如何稳定工作的?,blockchain,ethereum,sha256,solidity,abi,Blockchain,Ethereum,Sha256,Solidity,Abi,我试图在Solidity合同中实现签名,但在比较哈希时遇到了问题。我用以下代码计算散列值: sha256(abi.encodePacked(param1, ...., paramN); 其中: abi.encodePacked(param1,…,paramN)=[字节:0x0102030405060701] 及 sha255(abi.encodePacked(param1,…,paramN))=[bytes32: 0x245138c905599c8579ab186fbdbd6e62396aac

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

sha256(abi.encodePacked(param1, ...., paramN);
其中:

abi.encodePacked(param1,…,paramN)=[字节:0x0102030405060701]

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

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


我做错了什么?

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

导入hashlib >>>导入binascii >>>hashlib.sha256(b'0102030405060701').hexdigest() “5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5” >>>hashlib.sha256(binascii.unhexlify('0102030405060701')).hexdigest() “245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251”
请注意,对字符串进行散列会产生与您在问题中提到的相同(不正确)的值,但首先通过
unexlify
转换为二进制会产生正确的结果,与您在Solidity中得到的结果相匹配。

您可以添加Python代码吗?我猜你没有使用正确的散列函数。Solidity使用keccak256。我使用与此web中使用的函数相同的函数计算哈希。通过尝试keccak256,它不再有效。(web:)在散列之前,您需要进行solidity的压缩abi编码。对于JS,有一些东西像以太坊JS abi。我不知道各自的python库是什么。也许这有助于: