Web3.py/Brownie部署智能合约地址列表传参报错求解
问题根因
报错核心是三个传参错误:
- 参数类型匹配错误:智能合约构造函数中
royaltyRecipient定义为单个address类型,你却传入了存储两个地址的元组addresses,Brownie会把整个元组当成单个地址做格式校验,直接抛出无效地址错误。 - 传参格式不规范:调用
web3.toChecksumAddress时传入的是裸十六进制整数,没有转为带0x前缀的字符串,存在地址解析风险;bytes32类型的merkle根参数缺少0x前缀,后续也会触发类型错误。 - 数组类型传参不推荐用元组:Solidity中动态数组类型(如
address[]、uint256[])在Brownie中优先接收Python列表(list)类型,不推荐用元组(tuple)。
修复方案
按照以下规则调整传参即可:
- 地址转校验和格式时,必须传入带
0x前缀的地址字符串 payees这类地址数组参数,传入元素为校验和地址的Python列表- 为
royaltyRecipient单独传入单个合法地址,禁止传入地址列表 bytes32类型的merkle根参数补全0x前缀
修正后的部署脚本
from brownie import accounts, config, Turtles, network from web3 import Web3 as web3 def get_account(): # 替换为你实际的账户获取逻辑 return accounts[0] def deploy_turtles(): account = get_account() # 地址以字符串形式传入转校验和 address1 = web3.toChecksumAddress("0x4A40E425A8D1EE6279F860D8FD5DB3D3661558D6") address2 = web3.toChecksumAddress("0xA9873C4C5FBD0196D0FBA2E50A3EEE216C4D6780") # 地址数组参数用list类型存储 payees = [address1, address2] # 单独定义版税收款人单个地址,可根据实际需求替换 royalty_recipient = address1 turtle_deployed = Turtles.deploy( "Turtles", "Turtle", "ipfs://bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354/", [100, 10, 20000, 20, 10, 1655480363, 1655473254, 100], # merkle根补0x前缀 "0xea58dfa481a0c08b4af0417e3f62244215a1ab1eae0a100da48407be5cdd94b7", payees, [10, 15], # 这里传单个地址,不要传地址列表 royalty_recipient, 700, {"from": account}, publish_source=True, )
传参校验规则
部署前可对照以下规则检查参数匹配:
- Solidity
address类型 → 传带0x前缀的校验和地址字符串 - Solidity
address[]/uint256[]等动态数组类型 → 传对应类型元素组成的Python列表 - Solidity
bytes32类型 → 传带0x前缀、长度为66位的十六进制字符串
内容的提问来源于stack exchange,提问作者bwso0
相关产品推荐
相关产品推荐

