一个基于Go语言开发的Solana限价单交易后端系统,支持自动化限价单执行、实时价格监控和Jupiter DEX集成。
- 🚀 限价单交易: 支持买入/卖出限价单,自动触发执行
- 📊 实时价格监控: 集成Jupiter API获取实时价格数据
- 🔗 Solana区块链集成: 直接与Solana网络交互
- 💱 Jupiter DEX集成: 使用Jupiter聚合器执行最优路径交易
- 🗄️ 数据持久化: SQLite3数据库存储用户和订单数据
- 🌐 RESTful API: 完整的HTTP API接口
- 后端框架: Go 1.21 + Gin
- 数据库: SQLite3
- 区块链: Solana RPC/WebSocket
- DEX集成: Jupiter API v6
- 容器化: Docker & Docker Compose
- Go 1.21+
- Docker & Docker Compose (可选)
# 1. 安装依赖
go mod download
# 2. 配置环境变量(可选,使用默认配置即可启动)
cp .env.example .env
# 编辑 .env 文件,设置必要的配置项
# 3. 创建数据目录
mkdir -p data
# 4. 启动服务
go run cmd/server/main.go
启动成功标志:
- 数据库迁移成功执行
- 服务器在端口 8080 上启动
- 价格监控服务启动
- 订单处理服务启动
- WebSocket服务启动
# 1. 启动所有服务
docker-compose up -d
# 2. 查看服务状态
docker-compose ps
# 3. 查看日志
docker-compose logs -f app
# 开发环境启动
make dev
# 生产环境启动
make run
# 运行测试
make test
服务启动后,可以通过以下方式验证:
# 健康检查
curl http://localhost:8080/api/v1/health
# 查看支持的交易对
curl http://localhost:8080/api/v1/prices/symbols
id TEXT PRIMARY KEY -- 用户唯一标识
wallet_address TEXT UNIQUE NOT NULL -- Solana钱包地址
email TEXT -- 用户邮箱
is_active INTEGER DEFAULT 1 -- 账户状态
created_at DATETIME -- 创建时间
updated_at DATETIME -- 更新时间
id TEXT PRIMARY KEY -- 订单ID
user_id TEXT NOT NULL -- 用户ID
symbol TEXT NOT NULL -- 交易对 (如 SOL/USDC)
side TEXT NOT NULL -- 买卖方向 (buy/sell)
amount REAL NOT NULL -- 交易数量
trigger_price REAL NOT NULL -- 触发价格
trigger_condition TEXT NOT NULL -- 触发条件 (gte/lte)
status TEXT DEFAULT 'open' -- 订单状态
slippage REAL DEFAULT 0.005 -- 滑点容忍度
priority_fee INTEGER DEFAULT 1000 -- 优先费用
created_at DATETIME -- 创建时间
id TEXT PRIMARY KEY -- 钱包ID
user_id TEXT NOT NULL -- 用户ID
token_symbol TEXT NOT NULL -- 代币符号
available_balance REAL DEFAULT 0 -- 可用余额
locked_balance REAL DEFAULT 0 -- 锁定余额
POST /api/v1/users/register
- 用户注册POST /api/v1/users/login
- 用户登录GET /api/v1/users/profile
- 获取用户信息
GET /api/v1/wallets
- 获取用户钱包列表POST /api/v1/wallets/deposit
- 充值POST /api/v1/wallets/withdraw
- 提现
POST /api/v1/orders
- 创建限价单GET /api/v1/orders
- 获取订单列表GET /api/v1/orders/:id
- 获取订单详情PUT /api/v1/orders/:id/cancel
- 取消订单
GET /api/v1/prices/:symbol
- 获取实时价格GET /api/v1/prices/:symbol/history
- 获取历史价格GET /api/v1/prices/symbols
- 获取支持的交易对
POST /api/v1/trading/quote
- 获取交易报价POST /api/v1/trading/swap
- 执行即时交易GET /api/v1/trading/pairs/validate
- 验证交易对
GET /ws/prices/:symbol
- 实时价格推送
solana-limit-order-backend/
├── cmd/
│ └── server/
│ └── main.go # 应用程序入口
├── internal/
│ ├── config/
│ │ └── config.go # 配置管理
│ ├── database/
│ │ └── sqlite.go # SQLite3连接和迁移
│ ├── handlers/
│ │ ├── handlers.go # HTTP处理器基础
│ │ ├── user_handlers.go # 用户相关API
│ │ ├── wallet_handlers.go # 钱包相关API
│ │ ├── order_handlers.go # 订单相关API
│ │ ├── price_handlers.go # 价格相关API
│ │ └── solana_handlers.go # Solana相关API
│ ├── middleware/
│ │ └── middleware.go # 中间件
│ ├── models/
│ │ └── models.go # 数据模型
│ └── services/
│ ├── container.go # 服务容器
│ ├── user_service.go # 用户服务
│ ├── wallet_service.go # 钱包服务
│ ├── order_service.go # 订单服务
│ ├── price_service.go # 价格服务
│ ├── solana_service.go # Solana服务
│ └── jupiter_service.go # Jupiter服务
├── migrations/
│ └── 001_initial_schema.sql # 数据库迁移
├── tests/
│ ├── integration/ # 集成测试
│ └── unit/ # 单元测试
├── configs/
├── scripts/
├── docker-compose.yml # Docker Compose配置
├── Dockerfile # Docker镜像构建
├── go.mod # Go模块依赖
├── .env.example # 环境变量示例
└── README.md # 项目文档
- Go 1.21+
- Docker & Docker Compose (可选)
git clone <repository-url>
cd solana-limit-order-backend
cp .env.example .env
# 编辑 .env 文件,设置必要的配置项
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f app
# 安装依赖
go mod download
# 创建数据目录
mkdir -p data
# 运行应用
go run cmd/server/main.go
GET /api/v1/health
# 创建用户
POST /api/v1/users
{
"wallet_address": "11111111111111111111111111111112",
"email": "user@example.com"
}
# 获取用户信息
GET /api/v1/users/{id}
GET /api/v1/users/wallet/{address}
# 更新用户
PUT /api/v1/users/{id}
# 停用用户
DELETE /api/v1/users/{id}
# 创建钱包
POST /api/v1/wallets
{
"user_id": "uuid",
"token_symbol": "SOL",
"balance": "10.5"
}
# 获取用户钱包
GET /api/v1/wallets/user/{userId}
GET /api/v1/wallets/{userId}/{tokenSymbol}
# 创建限价单
POST /api/v1/orders
{
"user_id": "uuid",
"symbol": "SOL/USDC",
"side": "buy",
"amount": "1.0",
"trigger_price": "100.0",
"trigger_condition": "lte",
"slippage": "0.5",
"priority_fee": 1000
}
# 获取订单
GET /api/v1/orders/{id}
GET /api/v1/orders/user/{userId}
# 取消订单
PUT /api/v1/orders/{id}/cancel
# 获取当前价格
GET /api/v1/prices/{symbol}
# 获取价格历史
GET /api/v1/prices/{symbol}/history?duration=24h
# 获取支持的交易对
GET /api/v1/prices/symbols
# 获取交易报价
POST /api/v1/trading/quote
{
"input_mint": "So11111111111111111111111111111111111111112",
"output_mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"amount": "1000000000",
"slippage_bps": 50
}
# 验证交易对
GET /api/v1/trading/pairs/validate?input_mint=xxx&output_mint=yyy
# 获取SOL余额
GET /api/v1/solana/balance/{address}
# 获取代币余额
GET /api/v1/solana/token-balance/{address}/{mint}
# 验证地址
GET /api/v1/solana/validate-address/{address}
# 获取网络状态
GET /api/v1/solana/network-stats
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Web Client │ │ Mobile App │ │ WebSocket │
└─────────┬───────┘ └─────────┬───────┘ └─────────┬───────┘
│ │ │
└──────────────────────┼──────────────────────┘
│
┌─────────────┴─────────────┐
│ API Gateway │
│ (Gin + Middleware) │
└─────────────┬─────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌─────────┴─────────┐ ┌───────┴───────┐ ┌─────────┴─────────┐
│ User Service │ │ Order Service │ │ Price Service │
└─────────┬─────────┘ └───────┬───────┘ └─────────┬─────────┘
│ │ │
└───────────────────┼───────────────────┘
│
┌─────────────┴─────────────┐
│ Data Layer │
│ SQLite + Redis │
└───────────────────────────┘
[创建订单]
│
▼
┌─────────┐ 价格触发 ┌─────────────┐
│ open │ ──────────────► │ triggered │
└─────────┘ └─────────────┘
│ │
用户取消 提交交易
│ │
▼ ▼
┌─────────┐ ┌─────────────┐
│canceled │ │ submitting │
└─────────┘ └─────────────┘
│
┌───────┴───────┐
交易成功 交易失败
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│ filled │ │ failed │
└─────────┘ └─────────┘
- 最大重试次数: 3次
- 重试间隔: 指数退避 (1s, 2s, 4s)
- 重试条件: 网络错误、临时服务不可用、交易拥堵
网络错误 (可重试)
├── 连接超时
├── DNS解析失败
└── 临时网络中断
业务错误 (不重试)
├── 余额不足
├── 无效参数
└── 权限不足
系统错误 (可重试)
├── 数据库连接失败
├── 外部API限流
└── 服务临时不可用
- 用户注册: 钱包地址注册,创建用户账户
- 资金管理: 多币种钱包,余额实时同步
- 创建订单: 设置触发价格和交易参数
- 价格监控: 实时监控价格变化,自动触发
- 执行交易: Jupiter DEX最优路径交易
- 资金结算: 交易确认,余额更新
- OPEN: 等待价格触发
- TRIGGERED: 价格条件满足
- FILLED: 交易执行完成
- CANCELLED: 订单已取消
- users: 用户信息
- wallets: 用户钱包和余额
- orders: 限价单信息
- transactions: 交易记录
- order_executions: 订单执行详情
- price_data: 历史价格数据
变量名 | 描述 | 默认值 |
---|---|---|
PORT | 服务端口 | 8080 |
DATABASE_PATH | SQLite数据库文件路径 | ./data/trading.db |
SOLANA_RPC_URL | Solana RPC地址 | https://api.devnet.solana.com |
SOLANA_WS_URL | Solana WebSocket地址 | wss://api.devnet.solana.com |
JUPITER_API_URL | Jupiter API地址 | https://quote-api.jup.ag/v6 |
JWT_SECRET | JWT密钥 | your_jwt_secret_here |
DEFAULT_SLIPPAGE | 默认滑点 | 0.005 |
MAX_RETRY_ATTEMPTS | 最大重试次数 | 3 |
PRICE_UPDATE_INTERVAL | 价格更新间隔 | 100ms |
# 构建镜像
docker build -t solana-limit-order-backend .
# 运行容器
docker run -d \
--name solana-app \
-p 8080:8080 \
--env-file .env \
solana-limit-order-backend
- 设置安全的环境变量
- 配置SSL证书
- 设置反向代理(Nginx)
- 配置监控和日志
- 设置数据库备份
GET /api/v1/health
启动监控服务:
docker-compose --profile monitoring up -d
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000 (admin/admin123)
cmd/
: 应用程序入口点internal/
: 内部包,不对外暴露pkg/
: 可重用的包migrations/
: 数据库迁移文件configs/
: 配置文件scripts/
: 部署和维护脚本
- 在
internal/models/
中定义数据模型 - 在
internal/services/
中实现业务逻辑 - 在
internal/handlers/
中添加HTTP处理器 - 在
main.go
中注册路由 - 添加相应的数据库迁移
# 运行测试
go test ./...
# 运行测试并生成覆盖率报告
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
# 运行集成测试
go test ./tests/integration -v
# 运行完整交易流程测试
go test -v ./tests/integration -run TestCompleteTradingFlow
项目提供了完整的演示脚本,展示限价单交易的完整流程:
# 确保后端服务已启动
go run cmd/server/main.go
# 在另一个终端运行演示脚本
./scripts/demo.sh
# 清理所有演示数据(用户、钱包、订单等)
./scripts/cleanup.sh
演示脚本 demo.sh
将自动执行以下完整的交易流程:
- 🔍 服务状态检查: 验证后端服务是否正常运行
- 👤 用户注册: 创建演示用户账户
- 💰 资金托管: 模拟入金操作(SOL: 100.0, USDC: 10000.0)
- 📝 限价单创建: 创建SOL/USDC限价单,锁定资金
- 📊 价格监控: 模拟价格变化,触发订单执行
- 🚀 Jupiter DEX交易: 通过Jupiter聚合器执行最优路径交易
- 📋 交易回执: 验证交易结果,更新钱包余额
- 🌐 WebSocket演示: 展示实时价格推送功能
================================================
Solana Limit Order Trading Backend Demo
中心化限价单交易后端演示脚本
================================================
[INFO] 本演示将展示完整的限价单交易流程:
1️⃣ 用户注册与资金托管 (入金)
2️⃣ 限价单创建与资金锁定 (下单)
3️⃣ 价格监控与自动触发 (推价触发)
4️⃣ Jupiter DEX集成交易 (成交确认)
5️⃣ 交易回执与余额更新 (回执处理)
🔗 WebSocket实时价格推送
[SUCCESS] ✅ 入金验证通过: 成功入金 SOL=+100, USDC=+10000
[SUCCESS] ✅ 下单: 成功创建限价单 (10 SOL @ $105.00)
[SUCCESS] ✅ 触发: 价格达到触发条件,订单自动执行
[SUCCESS] ✅ 成交: 订单在链上成功执行
[SUCCESS] ✅ 回执: 交易详情已记录,余额已更新
[SUCCESS] 🎉 完整交易流程演示成功!
- 前置条件: 确保后端服务在
http://localhost:8080
正常运行 - 演示数据: 使用模拟数据,不涉及真实资金和区块链交易
- 自动清理: 演示完成后会自动清理生成的测试数据
- 重复运行: 可以多次运行演示脚本,每次都会生成新的用户和订单
- 错误处理: 脚本包含完整的错误处理和验证机制
如果演示脚本运行失败,请检查:
-
服务状态: 确认后端服务正常启动
curl http://localhost:8080/api/v1/health
-
依赖工具: 确认系统已安装必要工具
# 检查 jq (JSON处理工具) which jq || brew install jq # 检查 websocat (WebSocket客户端,可选) which websocat || brew install websocat
-
数据库权限: 确认应用有权限读写数据库文件
ls -la data/trading.db
-
清理重试: 如果数据状态异常,可以清理后重新运行
./scripts/cleanup.sh ./scripts/demo.sh
运行完整的交易流程集成测试:
go test -v ./tests/integration -run TestCompleteTradingFlow
测试预期结果:
该测试验证完整的限价单交易流程,包括:入金 → 下单 → 推价触发 → 成交 → 回执的全过程。
测试流程说明:
-
用户和钱包初始化:
- 创建测试用户账户
- 初始化SOL和USDC钱包
- 设置初始余额(SOL: 10.0, USDC: 1000.0)
-
创建限价单:
- 创建SOL/USDC买入限价单
- 设置触发价格为95.0 USDC
- 购买数量为1.0 SOL
- 滑点设置为0.5%
-
价格监控和触发:
- 启动价格监控服务
- 模拟价格变化,推送SOL价格至95.0 USDC
- 验证订单状态从"open"变为"triggered"
-
订单执行:
- 自动执行Jupiter DEX交易
- 验证订单状态变为"filled"
- 检查交易执行记录
-
余额验证:
- 验证SOL余额增加(约11.0 SOL)
- 验证USDC余额减少(约905.0 USDC)
- 确认余额变化符合交易预期
测试通过标准:
- ✅ 用户和钱包创建成功
- ✅ 限价单创建并处于"open"状态
- ✅ 价格监控服务正常启动
- ✅ 价格触发机制工作正常
- ✅ 订单状态正确转换(open → triggered → filled)
- ✅ Jupiter DEX交易执行成功
- ✅ 钱包余额正确更新
- ✅ 交易记录完整保存
示例输出:
=== RUN TestCompleteTradingFlow
=== RUN TestCompleteTradingFlow/Complete_Trading_Flow
=== RUN TestCompleteTradingFlow/Complete_Trading_Flow/Step1_Deposit
💰 资金托管: SOL=10.00, USDC=1000.00
=== RUN TestCompleteTradingFlow/Complete_Trading_Flow/Step2_CreateOrder
📝 限价单创建: 卖出5.00 SOL,触发价≥95.00 USDC
🔒 资金锁定: 5.00 SOL已锁定用于交易
=== RUN TestCompleteTradingFlow/Complete_Trading_Flow/Step3_PriceTrigger
📊 价格监控启动: 监听SOL/USDC价格变化
🎯 价格触发: 当前价格95.00 ≥ 触发价格95.00
⚡ 订单状态: open → triggered
=== RUN TestCompleteTradingFlow/Complete_Trading_Flow/Step4_OrderExecution
🚀 Jupiter交易执行: 卖出5.00 SOL → 获得475.00 USDC
📈 订单状态: triggered → filled
💰 余额更新: SOL=5.00(-5.00), USDC=1475.00(+475.00)
=== RUN TestCompleteTradingFlow/Complete_Trading_Flow/Step5_TransactionReceipt
✅ 交易回执验证完成
🔗 链上交易: TxHash=mock_tx_hash_xxx
🛣️ Jupiter路由: mock_jupiter_route
💰 最终余额: SOL=5.00, USDC=1475.00
--- PASS: TestCompleteTradingFlow (0.51s)
--- PASS: TestCompleteTradingFlow/Complete_Trading_Flow (0.50s)
--- PASS: TestCompleteTradingFlow/Complete_Trading_Flow/Step1_Deposit (0.00s)
--- PASS: TestCompleteTradingFlow/Complete_Trading_Flow/Step2_CreateOrder (0.00s)
--- PASS: TestCompleteTradingFlow/Complete_Trading_Flow/Step3_PriceTrigger (0.50s)
--- PASS: TestCompleteTradingFlow/Complete_Trading_Flow/Step4_OrderExecution (0.00s)
--- PASS: TestCompleteTradingFlow/Complete_Trading_Flow/Step5_TransactionReceipt (0.00s)
PASS
注意事项:
- 该测试使用模拟数据和mock服务,不会产生实际的区块链交易
- 测试环境会自动清理,不会影响生产数据
- 如果测试失败,请检查Jupiter服务配置和数据库连接
- 测试执行时间约2-3秒,包含异步价格监控和订单执行流程
- 🔐 使用强JWT密钥
- 🛡️ 实施速率限制
- 🔒 HTTPS加密传输
- 🗝️ 安全存储私钥
- 📝 审计日志记录
- 🚫 输入验证和清理
-
数据库文件权限问题
- 确保应用有权限读写数据库文件
- 检查数据目录是否存在
- 验证文件路径配置
-
数据库迁移失败
- 检查迁移文件是否存在
- 确认数据库文件路径正确
- 查看应用启动日志
-
Solana RPC错误
- 验证RPC端点可用性
- 检查网络连接
- 考虑使用备用RPC端点
-
价格监控服务异常
- 检查Jupiter API连接
- 验证网络请求权限
- 查看价格更新日志
# Docker Compose日志
docker-compose logs -f app
# 特定服务日志
docker logs -f solana-limit-order-app