Brownie Python .env变量加载失效 部署合约报Infura 401错误
Brownie 部署Rinkeby测试网合约报Infura 401未授权错误解决方案
问题背景
该问题出现于学习Youtube平台Patrick Collins出品的《Solidity, Blockchain, and Smart Contract Course – Beginner to Expert Python Tutorial》教程过程中。
问题现状
- 现有配置:.env文件存储私钥、节点密钥等敏感配置;brownie-config.yaml中已配置dotenv项实现.env文件自动加载,wallets.from_key字段通过
${PRIVATE_KEY}语法引用环境变量中的私钥值。 - 已尝试操作:多次在Infura平台新建项目,将新生成的PROJECT_ID更新至.env文件,问题仍未解决。
- 报错现象:执行
brownie run scripts/main.py --network rinkeby命令部署SimpleStorage合约时触发异常,错误调用栈最终抛出如下错误,耗时2天排查仍未定位.env配置相关的根因:
HTTPError: 401 Client Error: Unauthorized for url: https://rinkeby.infura.io/v3/PROJECT_ID
根因定位与修复步骤
该报错本质是请求Infura节点时未携带合法的项目身份标识,90%以上的场景都是.env格式错误或环境变量名不匹配导致的,按以下顺序逐一排查即可:
- 检查.env文件书写规范
文件必须存放在项目根目录(与brownie-config.yaml同层级),文件名严格为.env(注意开头的半角点,Windows系统默认隐藏文件后缀,容易误存为.env.txt导致识别失败);文件内变量赋值不要加任何引号、等号两侧不要留空格:错误写法:
PRIVATE_KEY="0xabc123"/WEB3_INFURA_PROJECT_ID = def456
正确写法:PRIVATE_KEY=0xabc123/WEB3_INFURA_PROJECT_ID=def456 - 核对Brownie网络配置的环境变量名
Brownie内置的Infura网络默认读取名为WEB3_INFURA_PROJECT_ID的环境变量,不是自定义的PROJECT_ID、INFURA_KEY等其他名称。执行brownie networks list找到rinkeby网络条目,确认host字段值为https://rinkeby.infura.io/v3/$WEB3_INFURA_PROJECT_ID,如果变量名不匹配,直接修改brownie-config.yaml里的网络配置,或者执行Brownie命令修改网络host参数即可。很多人这里自定义了环境变量名,Brownie读取不到值就会把PROJECT_ID作为字符串直接拼到请求URL里,自然返回401未授权。 - 验证环境变量加载状态
在项目根目录执行以下代码验证变量是否被正确读取:
如果输出为None,说明.env文件路径或格式有误,重新调整即可。from dotenv import load_dotenv import os load_dotenv() print(os.getenv("WEB3_INFURA_PROJECT_ID")) - 特殊场景排查
如果上述配置都正确仍报错,先关闭系统全局代理/VPN后重试,部分代理节点会篡改请求头导致Infura鉴权失败;同时登录Infura后台确认对应项目没有开启IP白名单限制,若开启了白名单需要将本地出口IP加入允许列表。
内容的提问来源于stack exchange,提问作者arsalan asr
相关产品推荐
相关产品推荐

