Brownie部署合约报Constructor Sequence长度错误如何解决
问题结论
你的猜测完全正确,报错根本原因就是部署时没有传入合约构造函数要求的参数。
原因说明
你提供的Solidity合约中构造函数明确定义了需要传入1个_priceFeed喂价地址类型的参数,而你在deploy.py中调用FundMe.deploy()时,仅传入了交易发起方的配置参数,没有传入构造函数需要的入参,因此触发了长度不匹配的报错。
修复方案
方案1:直接硬编码Rinkeby喂价地址(适合仅在Rinkeby测试的场景)
直接修改deploy.py中的部署语句,传入Rinkeby网络对应的Chainlink ETH/USD喂价地址即可,修改后的完整deploy.py代码如下:
from brownie import FundMe from scripts.helpful_script import get_account def deploy_fund_me(): account = get_account() # 构造函数参数放在交易配置参数的前面传入 fund_me = FundMe.deploy("0x8A753747A1Fa494EC906cE90E9f37563A8AF630e", {"from": account}) # 补充:原代码此处属性写错,合约地址为address而非account print(f"Contract deployed to {fund_me.address}")
方案2:多网络适配方案(推荐)
你可以在scripts/helpful_script.py中新增根据当前网络返回对应喂价地址的函数,后续切换到其他测试网或者主网时不需要修改部署逻辑,示例逻辑如下:
- 先在helpful_script.py中新增函数:
from brownie import network network_to_price_feed = { "rinkeby": "0x8A753747A1Fa494EC906cE90E9f37563A8AF630e", # 后续可以新增其他网络对应的喂价地址 "mainnet": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419" } def get_price_feed(): return network_to_price_feed[network.show_active()]
- 再修改deploy.py调用即可:
from brownie import FundMe from scripts.helpful_script import get_account, get_price_feed def deploy_fund_me(): account = get_account() fund_me = FundMe.deploy(get_price_feed(), {"from": account}) print(f"Contract deployed to {fund_me.address}")
内容的提问来源于stack exchange,提问作者Magofoco
相关产品推荐
相关产品推荐

