Infura Sepolia 的 Web3.py AsyncWeb3 WebSocket 连接失败

问题描述 投票:0回答:1

我正在开发一个以太坊项目,该项目使用 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}")

我尝试过的

  • 使用 Postman 验证 WebSocket 端点,它响应 101 切换协议。
  • 确认API密钥和URL正确。
  • 应用了 ExtraDataToPOAM 中间件以实现 PoA 兼容性。
  • 测试了速率限制设置并确保免费套餐限制不存在 超出了。
  • 将 Web3.py 更新到可用的最新版本。

任何见解或工作实施示例将不胜感激!

python websocket ethereum web3py infura
1个回答
0
投票

事实证明问题是一个

[SSL: CERTIFICATE_VERIFY_FAILED]
错误,但我一开始没有意识到这一点,因为我的记录器在代码中设置得不够早。该错误没有显示在日志中,所以我不知道出了什么问题。一旦我将记录器初始化移至
__init__
方法的最开始,问题就变得清晰了。

在 macOS 上,修复方法是安装正确的 SSL 证书。这对我有用:

  1. 使用 Homebrew 安装

    certifi
    以获得一组新的证书:

    brew install certifi
    
  2. 设置环境变量以指向证书:

    export SSL_CERT_FILE=/opt/homebrew/etc/[email protected]/cert.pem
    export SSL_CERT_DIR=/opt/homebrew/etc/[email protected]/
    
  3. 通过将更改添加到

    ~/.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
© www.soinside.com 2019 - 2024. All rights reserved.