智能合约/彩票合约:运行deploy_lottery.py执行enter_lottery时报资金不足错误
deploy_lottery.py
enter_lottery 阶段余额不足报错解决方案 - 报错根因:
sender doesn't have enough funds to send tx触发原因是enter_lottery交易需要同时支付抽奖入场费和链上gas费,而start_lottery仅需支付gas费即可执行,因此前序步骤正常、入场步骤报错。 - 本地开发链账户余额修复方案:
- 若使用Hardhat本地节点:在
hardhat.config.js的networks.hardhat.accounts配置项中,找到对应带id标识的账户,调高balance字段值(单位为wei),建议设置为"10000000000000000000000"(对应10000测试ETH)即可覆盖常规测试场景的费用需求。 - 若使用Ganache本地节点:打开Ganache控制台,找到目标id的账户,直接向该地址转账1000以上的测试ETH即可。
- 若使用Brownie自带本地开发链:在脚本初始化带
id的目标账户后,调用本地链默认高余额账户向其转账,示例代码:# accounts[0]为Brownie本地链默认生成的初始高余额账户 accounts[0].transfer(your_target_account, "100 ether")
- 若使用Hardhat本地节点:在
- 前置校验步骤:调用
enter_lottery前增加余额校验逻辑,避免重复踩坑,示例代码:
from brownie import Wei # 打印当前调用账户余额 print(f"账户余额:{account.balance()} wei") # 计算交易所需总费用:入场费 + 预估gas * gas单价 enter_fee = lottery.getEnterFee() est_gas = lottery.enter_lottery.estimate_gas({"from": account}) gas_price = Wei("20 gwei") total_required = enter_fee + est_gas * gas_price print(f"交易总需费用:{total_required} wei") assert account.balance() > total_required, "账户余额不足以支付交易费用"
本地开发链测试ETH无实际价值,可随意调高账户余额避免同类问题。
内容的提问来源于stack exchange,提问作者Ratool Karmaker
相关产品推荐
相关产品推荐

