我试图为下面的函数找到python模拟
实实
function getMineDigest(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number) public view returns (bytes32 digesttest) {
bytes32 digest = keccak256(abi.encodePacked(challenge_number, msg.sender, nonce));
return digest;
}我以为蟒蛇的模拟应该是
web3.solidityKeccak(['bytes32','address','uint256'], [challenge_number, account, nonce])但是当我从python打电话给合同时
getMineDigest(nonce, challenge_number, challenge_number).call()
output > b'S\x18\x0f\xc1\xf4\x99\\\xb7%N\x12\xf5\x94Ea\xb6\x08\x9a\xe4\x8d\xabD\xb6;#\xe3\xbf\xe9\x01\xef\x1b\xab'当我运行python模拟程序时
web3.solidityKeccak(['bytes32','address','uint256'], [challenge_number, account, nonce])
output > HexBytes('0xf44ce7626e2cb58df5fec54527ae88e1440661f4544fb5312fa79c35c216e45e')它看起来像是一个是python字节,另一个是十六字节?这是唯一的区别吗?
发布于 2020-02-29 20:18:46
您提供给这两个函数的数据一定有问题,不可能完全相同。你可以试试这个。
在混炼中创建一个契约:
pragma solidity ^0.6.3;
contract Test {
function getHash(bytes32 challenge, address adr, uint256 nonce) external pure returns (bytes32) {
return keccak256(abi.encodePacked(challenge, adr, nonce));
}
}调用函数getHash(.)具有以下参数:"0x1f1e1d1c1b1a191817161514131211100f0e0c0d0b0a09080706050403020100", "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c", 42
调用的返回值:"0xec8bd2c257c7079fddc12dbd80a9512f07d66f41f52e4ec65d720523e245e88d"
使用web3执行等效的python代码(我使用了web3.__version__ 5.6.0):
from web3 import Web3
Web3.solidityKeccak(['bytes32', 'address', 'uint256'], ["0x1f1e1d1c1b1a191817161514131211100f0e0c0d0b0a09080706050403020100", "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c", 42])结果:HexBytes('0xec8bd2c257c7079fddc12dbd80a9512f07d66f41f52e4ec65d720523e245e88d')
https://ethereum.stackexchange.com/questions/80219
复制相似问题