我正在开发一个以太坊项目,该项目使用 Infura 的 WebSocket 端点连接到 Sepolia 网络
(wss://sepolia.infura.io/ws/v3/<PROJECT_ID>)
。虽然连接在 Postman 中工作正常,但我使用 Web3.py 的 Python 实现失败并出现以下错误:
ERROR:BlockchainLayer:Error connecting to WebSocket: Could not connect to: wss://sepolia.infura.io/ws/v3/<PROJECT_ID>. Retries exceeded max of 5.
我尝试像使用 HTTP 连接一样应用 ExtraDataToPOAMiddleware,因为 Sepolia 使用权威证明 (PoA) 共识,但没有成功。相同的设置适用于 HTTP 端点,但 WebSocket 连接不断失败。
以下是WebSocket连接的相关代码:
async def connect_websocket(self):
"""
Connects to the WebSocket endpoint using AsyncWeb3 and manages its context.
"""
try:
async with AsyncWeb3(WebSocketProvider(self.websocket_url)) as w3:
# w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0)
self.web3_ws = w3
if not await self.web3_ws.is_connected():
raise ConnectionError(f"Failed to connect to WebSocket endpoint: {self.websocket_url}")
self.logger.info(f"Connected to {self.network_name} network via WebSocket.")
except ConnectionClosedError as e:
self.logger.error(f"WebSocket connection closed: {e}")
except Exception as e:
self.logger.error(f"Error connecting to WebSocket: {e}")
我尝试过的
任何见解或工作实施示例将不胜感激!
事实证明问题是一个
[SSL: CERTIFICATE_VERIFY_FAILED]
错误,但我一开始没有意识到这一点,因为我的记录器在代码中设置得不够早。该错误没有显示在日志中,所以我不知道出了什么问题。一旦我将记录器初始化移至 __init__
方法的最开始,问题就变得清晰了。
在 macOS 上,修复方法是安装正确的 SSL 证书。这对我有用:
使用 Homebrew 安装
certifi
以获得一组新的证书:
brew install certifi
设置环境变量以指向证书:
export SSL_CERT_FILE=/opt/homebrew/etc/[email protected]/cert.pem
export SSL_CERT_DIR=/opt/homebrew/etc/[email protected]/
通过将更改添加到
~/.zshrc
使更改永久化:
echo "export SSL_CERT_FILE=/opt/homebrew/etc/[email protected]/cert.pem" >> ~/.zshrc
echo "export SSL_CERT_DIR=/opt/homebrew/etc/[email protected]/" >> ~/.zshrc
source ~/.zshrc
之后一切都很顺利。
如果您使用的是 Windows 或 Linux,解决方案可能会有所不同。在 Windows 上,您可能需要运行 Python 附带的
Install Certificates.command
文件。在 Linux 上,您可能需要使用包管理器安装证书,例如:
sudo apt install ca-certificates
或
sudo yum install ca-certificates