Skip to content

gandio12138/solana-limit-order-backend

Repository files navigation

Solana Limit Order Trading Backend

一个基于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服务启动

方式二:Docker Compose

# 1. 启动所有服务
docker-compose up -d

# 2. 查看服务状态
docker-compose ps

# 3. 查看日志
docker-compose logs -f app

方式三:Make命令

# 开发环境启动
make dev

# 生产环境启动
make run

# 运行测试
make test

验证启动

服务启动后,可以通过以下方式验证:

# 健康检查
curl http://localhost:8080/api/v1/health

# 查看支持的交易对
curl http://localhost:8080/api/v1/prices/symbols

数据库设计

核心数据表

users (用户表)

id              TEXT PRIMARY KEY     -- 用户唯一标识
wallet_address  TEXT UNIQUE NOT NULL -- Solana钱包地址
email           TEXT                 -- 用户邮箱
is_active       INTEGER DEFAULT 1    -- 账户状态
created_at      DATETIME            -- 创建时间
updated_at      DATETIME            -- 更新时间

orders (订单表)

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                   -- 创建时间

wallets (钱包表)

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       -- 锁定余额

API接口说明

用户管理

  • 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 - 验证交易对

WebSocket

  • 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 (可选)

1. 克隆项目

git clone <repository-url>
cd solana-limit-order-backend

2. 配置环境变量

cp .env.example .env
# 编辑 .env 文件,设置必要的配置项

3. 使用Docker Compose启动

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f app

4. 本地开发启动

# 安装依赖
go mod download

# 创建数据目录
mkdir -p data

# 运行应用
go run cmd/server/main.go

API文档

健康检查

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

Solana功能

# 获取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限流
└── 服务临时不可用

核心功能

限价单交易流程

  1. 用户注册: 钱包地址注册,创建用户账户
  2. 资金管理: 多币种钱包,余额实时同步
  3. 创建订单: 设置触发价格和交易参数
  4. 价格监控: 实时监控价格变化,自动触发
  5. 执行交易: Jupiter DEX最优路径交易
  6. 资金结算: 交易确认,余额更新

订单状态

  • 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部署

# 构建镜像
docker build -t solana-limit-order-backend .

# 运行容器
docker run -d \
  --name solana-app \
  -p 8080:8080 \
  --env-file .env \
  solana-limit-order-backend

生产环境部署

  1. 设置安全的环境变量
  2. 配置SSL证书
  3. 设置反向代理(Nginx)
  4. 配置监控和日志
  5. 设置数据库备份

监控和日志

健康检查端点

GET /api/v1/health

Prometheus指标 (可选)

启动监控服务:

docker-compose --profile monitoring up -d

开发指南

代码结构

  • cmd/: 应用程序入口点
  • internal/: 内部包,不对外暴露
  • pkg/: 可重用的包
  • migrations/: 数据库迁移文件
  • configs/: 配置文件
  • scripts/: 部署和维护脚本

添加新功能

  1. internal/models/中定义数据模型
  2. internal/services/中实现业务逻辑
  3. internal/handlers/中添加HTTP处理器
  4. main.go中注册路由
  5. 添加相应的数据库迁移

测试

# 运行测试
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 将自动执行以下完整的交易流程:

  1. 🔍 服务状态检查: 验证后端服务是否正常运行
  2. 👤 用户注册: 创建演示用户账户
  3. 💰 资金托管: 模拟入金操作(SOL: 100.0, USDC: 10000.0)
  4. 📝 限价单创建: 创建SOL/USDC限价单,锁定资金
  5. 📊 价格监控: 模拟价格变化,触发订单执行
  6. 🚀 Jupiter DEX交易: 通过Jupiter聚合器执行最优路径交易
  7. 📋 交易回执: 验证交易结果,更新钱包余额
  8. 🌐 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 正常运行
  • 演示数据: 使用模拟数据,不涉及真实资金和区块链交易
  • 自动清理: 演示完成后会自动清理生成的测试数据
  • 重复运行: 可以多次运行演示脚本,每次都会生成新的用户和订单
  • 错误处理: 脚本包含完整的错误处理和验证机制

故障排除

如果演示脚本运行失败,请检查:

  1. 服务状态: 确认后端服务正常启动

    curl http://localhost:8080/api/v1/health
  2. 依赖工具: 确认系统已安装必要工具

    # 检查 jq (JSON处理工具)
    which jq || brew install jq
    
    # 检查 websocat (WebSocket客户端,可选)
    which websocat || brew install websocat
  3. 数据库权限: 确认应用有权限读写数据库文件

    ls -la data/trading.db
  4. 清理重试: 如果数据状态异常,可以清理后重新运行

    ./scripts/cleanup.sh
    ./scripts/demo.sh

完整交易流程集成测试

运行完整的交易流程集成测试:

go test -v ./tests/integration -run TestCompleteTradingFlow

测试预期结果:

该测试验证完整的限价单交易流程,包括:入金 → 下单 → 推价触发 → 成交 → 回执的全过程。

测试流程说明:

  1. 用户和钱包初始化

    • 创建测试用户账户
    • 初始化SOL和USDC钱包
    • 设置初始余额(SOL: 10.0, USDC: 1000.0)
  2. 创建限价单

    • 创建SOL/USDC买入限价单
    • 设置触发价格为95.0 USDC
    • 购买数量为1.0 SOL
    • 滑点设置为0.5%
  3. 价格监控和触发

    • 启动价格监控服务
    • 模拟价格变化,推送SOL价格至95.0 USDC
    • 验证订单状态从"open"变为"triggered"
  4. 订单执行

    • 自动执行Jupiter DEX交易
    • 验证订单状态变为"filled"
    • 检查交易执行记录
  5. 余额验证

    • 验证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加密传输
  • 🗝️ 安全存储私钥
  • 📝 审计日志记录
  • 🚫 输入验证和清理

故障排除

常见问题

  1. 数据库文件权限问题

    • 确保应用有权限读写数据库文件
    • 检查数据目录是否存在
    • 验证文件路径配置
  2. 数据库迁移失败

    • 检查迁移文件是否存在
    • 确认数据库文件路径正确
    • 查看应用启动日志
  3. Solana RPC错误

    • 验证RPC端点可用性
    • 检查网络连接
    • 考虑使用备用RPC端点
  4. 价格监控服务异常

    • 检查Jupiter API连接
    • 验证网络请求权限
    • 查看价格更新日志

日志查看

# Docker Compose日志
docker-compose logs -f app

# 特定服务日志
docker logs -f solana-limit-order-app

About

solana-limit-order-backendv

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published