You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python建立DYDX客户端连接的步骤及报错排查求助

解决dYdX Python客户端连接报错:'Eth' object has no attribute 'defaultAccount' 及连接步骤

报错原因

这个错误是由于Web3.py v6+版本移除了defaultAccount属性,而你使用的dYdX SDK版本依赖这个旧属性导致的兼容性问题。

快速解决方法

方法1:降级Web3.py到兼容版本

执行以下命令安装兼容的Web3版本:

pip install web3==5.31.0

这是最直接的解决方式,旧版dYdX SDK对Web3 v5的支持更稳定。

方法2:适配Web3 v6的代码修改

如果坚持使用Web3 v6,需要手动处理账户初始化,修改connection.py中的Web3实例创建部分:

web3 = Web3(Web3.HTTPProvider(HTTP_PROVIDER))
# 手动生成账户地址,替代已移除的defaultAccount
eth_account = web3.eth.account.from_key(ETH_PRIVATE_KEY)

然后在初始化dYdX Client时,显式传入eth_address参数:

client = Client(
    host=HOST,
    api_key_credentials={
        "key": DYDX_API_KEY,
        "secret": DYDX_API_SECRET,
        "passphrase": DYDX_API_PASSPHRASE
    },
    stark_private_key=STARK_PRIVATE_KEY,
    eth_private_key=ETH_PRIVATE_KEY,
    eth_address=eth_account.address,  # 显式传入账户地址
    web3=web3,
)

完整的dYdX Python客户端连接步骤

  1. 安装依赖包
    确保安装必要的库:

    pip install dydx3 web3
    

    若选择降级Web3,则执行:

    pip install web3==5.31.0
    
  2. 准备配置凭证
    提前准备好以下参数并放入constants.py:

    • HOST:dYdX的网络地址(主网https://api.dydx.exchange,测试网https://api.stage.dydx.exchange)
    • DYDX_API_KEY、DYDX_API_SECRET、DYDX_API_PASSPHRASE:从dYdX官网生成的API密钥
    • ETH_PRIVATE_KEY:以太坊钱包私钥
    • STARK_PRIVATE_KEY:dYdX的Stark密钥(可通过dYdX客户端导出)
    • HTTP_PROVIDER:以太坊节点地址(如Alchemy、Infura提供的HTTP端点)
  3. 编写连接代码(修正后)
    connection.py代码:

    from dydx3 import Client
    from web3 import Web3
    
    from constants import (
        HOST,
        DYDX_API_KEY,
        DYDX_API_SECRET,
        DYDX_API_PASSPHRASE,
        ETH_PRIVATE_KEY,
        STARK_PRIVATE_KEY,
        HTTP_PROVIDER
    )
    
    def connect_dydx():
        # 初始化Web3实例
        web3 = Web3(Web3.HTTPProvider(HTTP_PROVIDER))
        # Web3 v5版本可保留此设置,v6版本可省略或替换为手动生成地址
        web3.eth.defaultAccount = web3.eth.account.from_key(ETH_PRIVATE_KEY).address
    
        # 创建dYdX客户端
        client = Client(
            host=HOST,
            api_key_credentials={
                "key": DYDX_API_KEY,
                "secret": DYDX_API_SECRET,
                "passphrase": DYDX_API_PASSPHRASE
            },
            stark_private_key=STARK_PRIVATE_KEY,
            eth_private_key=ETH_PRIVATE_KEY,
            web3=web3,
        )
    
        # 验证连接并获取账户信息
        try:
            account = client.private.get_account()  # 避免使用私有方法,改用公开接口
            account_id = account.data["account"]["id"]
            quote_balance = account.data["account"]["quoteBalance"]
    
            print("Connection Successful")
            print("Account ID: ", account_id)
            print("Quote Balance: ", quote_balance)
    
            return client
        except Exception as e:
            raise Exception(f"Failed to fetch account info: {str(e)}")
    

    main.py代码保持不变:

    from connection import connect_dydx
    
    if __name__ == "__main__":
        # 连接客户端
        try:
            client = connect_dydx()
        except Exception as e:
            print(f"Error connecting to client: {e}")
            exit(1)
    
  4. 运行代码验证连接
    执行python main.py,若输出账户ID和余额则表示连接成功。

注意事项

  • 不要直接调用SDK的私有方法(如client._private),应使用公开的client.private接口,避免后续版本更新导致兼容性问题。
  • 确保所有私钥和API密钥的权限正确,测试环境建议使用测试网凭证,避免主网资产风险。

内容的提问来源于stack exchange,提问作者Deus Gitonga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:17:06