使用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客户端连接步骤
安装依赖包
确保安装必要的库:pip install dydx3 web3若选择降级Web3,则执行:
pip install web3==5.31.0准备配置凭证
提前准备好以下参数并放入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端点)
编写连接代码(修正后)
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)运行代码验证连接
执行python main.py,若输出账户ID和余额则表示连接成功。
注意事项
- 不要直接调用SDK的私有方法(如
client._private),应使用公开的client.private接口,避免后续版本更新导致兼容性问题。 - 确保所有私钥和API密钥的权限正确,测试环境建议使用测试网凭证,避免主网资产风险。
内容的提问来源于stack exchange,提问作者Deus Gitonga
相关产品推荐
相关产品推荐

