如何在Python中编码Solidity结构体以匹配abi.encode结果?
在Python中实现Solidity结构体的等价ABI编码
Solidity 代码实现
struct MyStruct { string data; address issuer; } function getHash(MyStruct calldata myStruct) public pure returns (bytes32) { return keccak256(abi.encode(myStruct)); }
Python 当前代码
from eth_utils import keccak from eth_abi import encode myStruct = { 'data': 'Hello', 'issuer': '0x5B38Da6a701c568545dCfcB03FcB875f56beddC4' # 示例地址 } def getHash(struct): return keccak(encode(<NO MATTER WHAT I PUT HERE I CANT GET WHAT I WANT>))
需求说明
我需要在Python中计算包含地址的结构体Keccak哈希,后续发送完整数据到合约时,合约会对数据哈希并与之前的哈希对比。另外,后续需要将地址字段替换为固定值(如address(0x0)或address(this))存储“无签名”哈希,因此不能用JSON字符串存储数据,避免Solidity中拼接操作的麻烦。
结构体结构复杂且成员可能变更,不想每次都手动拆分组装结构体成员进行编码。
遇到的问题
手动拆分成员编码(比如eth_abi.encode(['string', 'address'], [struct['data'], struct['issuer']]))仅等价于Solidity中的abi.encode(myStruct.data, myStruct.issuer),和直接编码结构体的字节结果不同——Solidity中abi.encode(myStruct)会包含类型附加信息,两者哈希结果不一致。
我尝试过多种结构体类型定义方式调用encode,比如:
myStruct = { 'data': 'Hello', 'issuer': '0x5B38Da6a701c568545dCfcB03FcB875f56beddC4' } struct_types = { 'data': 'string', 'issuer': 'address' } struct_types2 = { 'string': 'data', 'address': 'issuer' } encode(struct_types, myStruct) encode([struct_types], myStruct) encode(struct_types, [myStruct]) encode([struct_types], [myStruct]) encode(struct_types2, myStruct) encode([struct_types2], myStruct) encode(struct_types2, [myStruct]) encode([struct_types2], [myStruct])
所有尝试都无法实现和Solidity中abi.encode(myStruct)一致的结构体编码效果。Solidity可以轻松实现,Python应该有等价方法,求解决思路。
内容的提问来源于stack exchange,提问作者J3STER
相关产品推荐
相关产品推荐

