You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:22:37