tobias727/dex-arb-trader
GitHub: tobias727/dex-arb-trader
这是一个连接 Binance 与 Unichain 上 Uniswap v4 池的实时套利交易机器人,自动识别并执行跨平台价格差异套利。
Stars: 0 | Forks: 0
[](https://github.com/pylint-dev/pylint)
[](https://github.com/psf/black)


# DEX 套利交易器
**作者:Tobias Zenner**
**dex-arb-trader** 是一个实时的套利交易引擎,连接:
- **CEX**:Binance (ETH/USDC, 现货, SBE WebSocket 行情 + REST 交易)
- **DEX**:**Unichain 主网**上的 Uniswap v4 池 (ETH/USDC, 5bps 费率池)
它专为低延迟、事件驱动的套利而构建,具有:
- WebSocket 市场数据 (Binance SBE + Unichain flashblocks)
- 通过 eth_sendBundle 向 L2 sequencer 进行链上执行
- 通过 REST API 和自定义 Binance TCP 代理进行 Binance 执行
- 在托管于同一位置的 AWS EC2 实例上进行生产部署
- Docker 支持
## 目录
- [DEX 套利交易器](#dex-arbitrage-trader)
- [架构](#architecture)
- [项目结构](#project-structure)
- [智能合约](#smart-contract)
- [交易机器人](#trading-bot)
- [部署](#deployment)
- [延迟与测量](#latency--measurements)
- [策略与设计选择](#strategy--design-choices)
- [后续步骤](#next-steps)
- [设置与使用](#setup-and-usage)
## 架构
```
flowchart LR
subgraph main[dex-arb-trader]
B[feeds/
binance_feed.py
flashblock_feed.py] --> |on_flashblock_done| D[engine/detector.py] S[state/
orderbook.py
pool.py
balances.py
flashblocks.py] --> D B --> S CU[clients/uniswap/snapshot.py] --> S D --> E[engine/executor.py] E --> |execute| C[clients/
binance/client.py
uniswap/client.py] E --> |log| T[infra/monitoring.py] end P1[TCP Proxy] --> |WebSocket:SBE| B B1[Binance OrderBook] --> P1 B2[Unichain Flashblocks] --> |WebSocket| B B3[Unichain RPC Node] --> |eth_call| CU C --> |REST| P2[TCP Proxy] P2 --> C1[Binance API] C -->|Web3| C2[Unichain Sequencer] ``` ## 项目结构 dex-arb-trader 分为两个主要组件:用于 tick bitmap 管理的智能合约和用于套利检测及执行的交易机器人。 ### 智能合约 ``` contracts/ ├── script/ │ └── DeployTickBitmapHelper.s.sol # Deployment scripts for TickBitmapHelper contract ├── src/ │ └── TickBitmapHelper.sol # Smart contract for tick bitmap management └── test/ └── TickBitmapHelper.t.sol # Test cases for TickBitmapHelper.sol ``` ### 交易机器人 ``` src/ ├── clients/ │ ├── binance/ │ │ └── client.py # Binance REST client │ └── uniswap/ │ ├── client.py # Uniswap v4 Web3 client │ └── snapshot.py # Uniswap pool snapshot logic ├── engine/ │ ├── detector.py # Arbitrage detection logic │ └── executor.py # Trade execution logic ├── feeds/ │ ├── binance_feed.py # Binance SBE WebSocket feed handler │ └── flashblock_feed.py # Unichain flashblock feed handler ├── infra/ │ ├── monitoring.py # Monitoring and logging utilities │ ├── web3.py # Web3 connection management │ └── ws.py # WebSocket connection management ├── state/ │ ├── balances.py # Account balance tracking │ ├── flashblocks.py # Flashblock state management │ ├── orderbook.py # Order book state management │ └── pool.py # Uniswap pool state management ├── main.py # Main entry point └── config.py # Configuration management ``` ## 生产基础设施 - us-east-2 (俄亥俄州) 的 ec2 t3.nano 实例:主机器人进程 `dex-arb-trader` - ap-northeast-1 (东京) 的 ec2 t3.nano 实例:运行 `nginx` 作为 Binance REST + WebSocket SBE 的 TCP 穿透代理 ## 延迟与测量 Binance OrderBook -> TODO: 添加图表 + 测量数据 ## 策略与设计选择 - 交易标的:Binance 现货的 ETHU/USDC 和 Unichain 上的 Uniswap V4 池 (5 bps 池费率) - 边缘计算: - 每个 flashblock,使用本地池状态和包含费用的 binance 订单簿状态计算买/卖价 - 交易量考虑了市场冲击和费用 - 执行顺序: 1. eth_sendBundle 发送到 Unichain,设置 minAmountIn/minAmountOut = 包含费用的 Binance 买/卖价 2. 在 eth_sendBundle 成功交易**之后**调用 Binance REST API (TODO: 添加注释说明原因 - 在 Binance 上观察到的滑点非常小) - 风险管理: - 失败的 bundles 不会在链上执行,也不会消耗 gas。剩余风险是 Binance 滑点(参考注释) - 发现 Binance 中的滑点与平均并行执行设置相比是正向的 ## 后续步骤 - 使用 tick Bitmap 计算 dx_in 和 dy_in 的 L(目前假设在交换的 tick 范围内流动性均匀) - 更改检测逻辑以在 flashblock 内 Binance 价格变化时触发重新计算 - 增加交易所数量 (CEX + DEX) - 支持多个交易对 ## 已知问题 - 目前,本地状态使用来自 sequencer 的预确认 flashblocks 进行复制。Flashblocks 直接从 sequencer 流式传输,以允许下一个 flashblock 套利。然而,这可能导致本地状态不一致,例如区块 [38620834](https://uniscan.xyz/txs?block=38620834)。更好的做法是定期使用规范 RPC 调用(例如每个区块)额外验证本地状态。在当前阶段这是可以接受的,因为风险很低,eth_sendBundle 会因 minAmoutOut/minAmountIn 约束在状态不一致时失败,最坏情况下不执行,直到下一个 swap 事件。 ## 设置与使用 要求: - Python >= `3.12` - pip3 - Linux 环境(或 Windows 上的 WSL) 使用模板 `.env.example` 填充 `.env`。 使用以下命令设置虚拟环境: ``` python -m venv .venv ``` 要启动机器人,请运行: ``` ./startTrading.sh ``` 要构建并推送 Docker 镜像,请运行: ``` ./build.sh ```
binance_feed.py
flashblock_feed.py] --> |on_flashblock_done| D[engine/detector.py] S[state/
orderbook.py
pool.py
balances.py
flashblocks.py] --> D B --> S CU[clients/uniswap/snapshot.py] --> S D --> E[engine/executor.py] E --> |execute| C[clients/
binance/client.py
uniswap/client.py] E --> |log| T[infra/monitoring.py] end P1[TCP Proxy] --> |WebSocket:SBE| B B1[Binance OrderBook] --> P1 B2[Unichain Flashblocks] --> |WebSocket| B B3[Unichain RPC Node] --> |eth_call| CU C --> |REST| P2[TCP Proxy] P2 --> C1[Binance API] C -->|Web3| C2[Unichain Sequencer] ``` ## 项目结构 dex-arb-trader 分为两个主要组件:用于 tick bitmap 管理的智能合约和用于套利检测及执行的交易机器人。 ### 智能合约 ``` contracts/ ├── script/ │ └── DeployTickBitmapHelper.s.sol # Deployment scripts for TickBitmapHelper contract ├── src/ │ └── TickBitmapHelper.sol # Smart contract for tick bitmap management └── test/ └── TickBitmapHelper.t.sol # Test cases for TickBitmapHelper.sol ``` ### 交易机器人 ``` src/ ├── clients/ │ ├── binance/ │ │ └── client.py # Binance REST client │ └── uniswap/ │ ├── client.py # Uniswap v4 Web3 client │ └── snapshot.py # Uniswap pool snapshot logic ├── engine/ │ ├── detector.py # Arbitrage detection logic │ └── executor.py # Trade execution logic ├── feeds/ │ ├── binance_feed.py # Binance SBE WebSocket feed handler │ └── flashblock_feed.py # Unichain flashblock feed handler ├── infra/ │ ├── monitoring.py # Monitoring and logging utilities │ ├── web3.py # Web3 connection management │ └── ws.py # WebSocket connection management ├── state/ │ ├── balances.py # Account balance tracking │ ├── flashblocks.py # Flashblock state management │ ├── orderbook.py # Order book state management │ └── pool.py # Uniswap pool state management ├── main.py # Main entry point └── config.py # Configuration management ``` ## 生产基础设施 - us-east-2 (俄亥俄州) 的 ec2 t3.nano 实例:主机器人进程 `dex-arb-trader` - ap-northeast-1 (东京) 的 ec2 t3.nano 实例:运行 `nginx` 作为 Binance REST + WebSocket SBE 的 TCP 穿透代理 ## 延迟与测量 Binance OrderBook -> TODO: 添加图表 + 测量数据 ## 策略与设计选择 - 交易标的:Binance 现货的 ETHU/USDC 和 Unichain 上的 Uniswap V4 池 (5 bps 池费率) - 边缘计算: - 每个 flashblock,使用本地池状态和包含费用的 binance 订单簿状态计算买/卖价 - 交易量考虑了市场冲击和费用 - 执行顺序: 1. eth_sendBundle 发送到 Unichain,设置 minAmountIn/minAmountOut = 包含费用的 Binance 买/卖价 2. 在 eth_sendBundle 成功交易**之后**调用 Binance REST API (TODO: 添加注释说明原因 - 在 Binance 上观察到的滑点非常小) - 风险管理: - 失败的 bundles 不会在链上执行,也不会消耗 gas。剩余风险是 Binance 滑点(参考注释) - 发现 Binance 中的滑点与平均并行执行设置相比是正向的 ## 后续步骤 - 使用 tick Bitmap 计算 dx_in 和 dy_in 的 L(目前假设在交换的 tick 范围内流动性均匀) - 更改检测逻辑以在 flashblock 内 Binance 价格变化时触发重新计算 - 增加交易所数量 (CEX + DEX) - 支持多个交易对 ## 已知问题 - 目前,本地状态使用来自 sequencer 的预确认 flashblocks 进行复制。Flashblocks 直接从 sequencer 流式传输,以允许下一个 flashblock 套利。然而,这可能导致本地状态不一致,例如区块 [38620834](https://uniscan.xyz/txs?block=38620834)。更好的做法是定期使用规范 RPC 调用(例如每个区块)额外验证本地状态。在当前阶段这是可以接受的,因为风险很低,eth_sendBundle 会因 minAmoutOut/minAmountIn 约束在状态不一致时失败,最坏情况下不执行,直到下一个 swap 事件。 ## 设置与使用 要求: - Python >= `3.12` - pip3 - Linux 环境(或 Windows 上的 WSL) 使用模板 `.env.example` 填充 `.env`。 使用以下命令设置虚拟环境: ``` python -m venv .venv ``` 要启动机器人,请运行: ``` ./startTrading.sh ``` 要构建并推送 Docker 镜像,请运行: ``` ./build.sh ```
标签:AWS, Binance, CEX-DEX套利, DeFi, Docker, DPI, Flashblocks, Foundry, L2, Python, REST API, SBE, Solidity, Unichain, Uniswap V4, WebSocket, 以太坊, 价差监控, 低延迟交易, 依赖分析, 加密货币, 区块链, 去中心化金融, 套利交易机器人, 安全防御评估, 市场微观结构, 无后门, 智能合约, 流动性池, 算法交易, 自动执行, 订单簿, 请求拦截, 逆向工具, 量化交易, 高频交易