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

如何从Python向Solidity传递NFTBatchVoucher结构体的uint256数组?

问题:Python向Solidity传递含uint256数组的结构体时的格式问题

Solidity中定义的结构体如下:

struct NFTBatchVoucher {
    uint256[] ids;
    uint256[] amounts;
    uint256 minPrice;
    string uri;
    bytes signature;
}

从Python向Solidity传递该结构体时,ids和amounts两个uint256数组的传递多次失败,试过普通列表、元组、经1e18处理或转int的列表都触发编译器报错,需明确正确传递方式及solc编译器期望的格式。


正确传递方式与solc格式说明

1. Python端的正确数据格式

Solidity的uint256[]对应Python中的正整数列表/元组,核心注意点:

  • 数组元素必须是Python原生int类型,不能用浮点数(比如1e18要写成10**18或int(1e18),避免精度问题)
  • 不能传入字符串形式的数字,必须是整数
  • 列表或元组均可,Web3.py等交互库会自动兼容这两种类型

示例代码:

# 构造符合要求的NFTBatchVoucher数据
voucher = {
    "ids": [1, 5, 7],
    "amounts": [2, 1, 3],
    "minPrice": 10**18,  # 若对应以太币,转成wei单位的整数
    "uri": "ipfs://QmXYZ/metadata.json",
    "signature": b"0x1234..."  # 直接传入字节对象,对应Solidity的bytes类型
}

2. solc期望的ABI编码规则

solc对uint256[]的编码严格遵循以太坊ABI规范:

  • 先编码数组的长度(占32字节的uint256)
  • 再依次编码数组中的每个元素,每个uint256元素占32字节,采用大端对齐方式
  • 结构体整体编码时,会按照定义的字段顺序(ids→amounts→minPrice→uri→signature)依次完成每个字段的编码

使用Web3.py等库时无需手动编码,直接传入上述Python数据结构,库会自动完成ABI编码并与合约交互。

3. 常见错误排查

  • 浮点数误用:比如用1e18代替10**18,浮点数会导致ABI编码失败,必须转成整数
  • 元素越界:uint256的最大值为2**256 - 1,传入的整数不能超出这个范围
  • 签名类型错误:bytes字段必须是Python字节对象,字符串需先通过encode()转成字节

内容的提问来源于stack exchange,提问作者hdries

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:06:24