QEasyPay - 加密货币充值/提现系统
一套基于 Golang 的高性能、可扩展的加密货币充值/提现系统,采用微服务架构设计,支持多种区块链网络和签名方案。系统通过事件驱动模式实现模块间通信,提供安全可靠的数字资产管理解决方案。
⚠️项目仅用于社区人员学习和技术验证,请勿用于生产,如果私自用于生产,造成任何损失,社区概不负责!
项目概述
QEasyPay 是一个专为加密货币交易平台设计的后端服务系统,提供完整的充值监听、地址管理、提现处理和资金归集功能。系统采用模块化设计,各组件间通过 NATS JetStream 实现松耦合通信,确保高可用性和可扩展性。
核心优势
- 高性能:基于 Go 语言开发,具备出色的并发处理能力
- 高可用:微服务架构,各模块可独立扩展和部署
- 安全性:支持多种签名方案,包括 TSS/MPC 多方安全计算
- 可扩展:轻松支持多链、多币种扩展
- 实时性:区块链事件实时监听和处理
- 可靠性:事件持久化和失败重试机制
- 完整闭环:从充值、地址管理到提现和资金归集的完整业务流程
系统架构
flowchart TD
subgraph 外部系统
BC[区块链网络]
UI[用户界面]
WEB[Web前端服务
web]
API_GW[API网关]
end
subgraph 核心服务
DEP[充值监听服务\ndeposit-monitor]
ADD[地址分配服务\naddress-service]
WIT[集中出金服务\nwithdraw-service]
COL[资金归集服务\ncollection-service]
MIG[数据迁移服务\nmigrate]
WEB[Web前端服务\nweb]
end
subgraph 基础设施
DB[(数据库\nPostgreSQL/SQLite)]
NATS[NATS JetStream\n事件总线]
SIGN[签名服务\n多种签名方案]
end
UI -->|访问| WEB
WEB -->|API请求| API_GW
API_GW -->|分配地址| ADD
API_GW -->|发起提现| WIT
DEP -->|监听交易| BC
WIT -->|发送交易| BC
COL -->|发送归集交易| BC
DEP -->|写入数据| DB
ADD -->|写入数据| DB
WIT -->|写入数据| DB
COL -->|写入数据| DB
MIG -->|初始化/迁移数据| DB
DEP -->|发布事件| NATS
ADD -->|发布/订阅事件| NATS
WIT -->|订阅/发布事件| NATS
COL -->|订阅/发布事件| NATS
WIT -->|请求签名| SIGN
COL -->|请求签名| SIGN
SIGN -->|返回签名| WIT
SIGN -->|返回签名| COL
DB -->|读取数据| DEP
DB -->|读取数据| ADD
DB -->|读取数据| WIT
DB -->|读取数据| COL
核心模块说明
-
充值监听服务 (deposit-monitor)
- 持续监听区块链网络上的交易事件
- 识别并处理用户充值交易
- 更新交易状态和确认数
- 发布充值完成事件到 NATS
- 支持多链和多币种的充值监控
- 实现交易去重和幂等性处理
-
地址分配服务 (address-service)
- 管理加密货币地址池
- 为用户分配唯一的充值地址
- 支持地址批量生成和状态管理
- 处理地址相关的 API 请求
- 实现地址与用户账户的关联管理
- 提供地址健康检查机制
-
集中出金服务 (withdraw-service)
- 处理用户提现请求
- 实现提现前余额冻结机制
- 计算手续费并验证余额
- 生成交易并请求签名
- 广播交易并更新状态
- 支持提现审核流程
- 实现失败交易的重试机制
-
资金归集服务 (collection-service)
-
Web前端服务 (web)
- 提供用户界面,集成Web3钱包连接
- 支持多语言(英语、日语、繁体中文)
- 实现用户认证和授权流程
- 显示用户资产和交易记录
- 响应式设计,适配不同设备
- 部署在Nginx容器中提供静态资源服务
- 定期检查用户地址的余额
- 当余额超过设定阈值时,自动将资金归集到主账户
- 支持原生代币和ERC20代币的归集
- 交易签名和发送的完整流程管理
- 归集历史记录追踪和错误重试机制
- 优化归集策略,减少手续费支出
-
数据迁移服务 (migrate)
- 负责数据库表结构的初始化
- 处理系统升级时的数据迁移
- 支持增量数据迁移
- 确保数据完整性和一致性
系统流程
1. 充值流程
sequenceDiagram
participant User as 用户
participant AddrSvc as 地址服务
participant DB as 数据库
participant DepMonitor as 充值监听
participant Blockchain as 区块链
participant NATS as 事件总线
participant API as API服务
User->>API: 请求充值地址
API->>AddrSvc: 调用分配地址接口
AddrSvc->>DB: 查询可用地址
DB-->>AddrSvc: 返回地址信息
AddrSvc->>DB: 更新地址状态为已分配
AddrSvc-->>API: 返回用户充值地址
API-->>User: 返回充值地址
Note over User,Blockchain: 用户向该地址转账
User->>Blockchain: 发起转账交易
Blockchain-->>Blockchain: 交易确认
DepMonitor->>Blockchain: 持续监听交易
Blockchain-->>DepMonitor: 返回新区块/交易
DepMonitor->>DB: 查询地址关联用户
DB-->>DepMonitor: 返回用户信息
DepMonitor->>DB: 创建/更新交易记录
DepMonitor->>DB: 更新用户余额
DepMonitor->>NATS: 发布充值成功事件
NATS-->>API: 推送充值通知
API-->>User: 通知用户充值完成
2. 提现流程(最新版)
sequenceDiagram
participant User as 用户
participant API as API服务
participant DB as 数据库
participant WithdrawSvc as 提现服务
participant Signer as 签名器
participant Blockchain as 区块链
participant NATS as 事件总线
User->>API: 提交提现请求
API->>WithdrawSvc: 调用提现创建接口
WithdrawSvc->>DB: 获取用户账户信息
DB-->>WithdrawSvc: 返回账户详情
WithdrawSvc->>WithdrawSvc: 验证金额和手续费
alt 余额不足
WithdrawSvc-->>API: 返回余额不足错误
API-->>User: 显示余额不足提示
else 余额充足
WithdrawSvc->>DB: 开始事务
WithdrawSvc->>DB: 计算并冻结用户资金
WithdrawSvc->>DB: 创建提现订单(待处理)
alt 事务处理失败
WithdrawSvc->>DB: 回滚事务
WithdrawSvc-->>API: 返回处理失败错误
else 事务处理成功
WithdrawSvc->>DB: 提交事务
WithdrawSvc->>NATS: 发布提现创建事件
alt 需要人工审核
WithdrawSvc->>DB: 更新订单状态(待审核)
Note over WithdrawSvc: 等待审核...
WithdrawSvc->>DB: 更新订单状态(已审核)
end
WithdrawSvc->>Signer: 请求交易签名
Signer-->>WithdrawSvc: 返回签名数据
WithdrawSvc->>Blockchain: 广播交易
Blockchain-->>WithdrawSvc: 返回交易哈希
WithdrawSvc->>DB: 更新提现订单状态和交易哈希
WithdrawSvc->>DB: 确认扣除用户余额
WithdrawSvc->>NATS: 发布提现完成事件
WithdrawSvc-->>API: 返回提现成功
API-->>User: 显示提现成功信息
end
end
3. 资金归集流程(最新版)
flowchart TD
subgraph 归集任务启动
A[定时任务触发] -->|配置的归集周期| B[加载归集配置]
B --> C[获取所有用户地址列表]
end
subgraph 余额检查与筛选
C --> D[并行检查各地址余额]
D --> E{余额是否大于阈值?}
E -->|否| F[跳过此地址]
E -->|是| G[加入待归集地址列表]
end
subgraph 归集交易准备
G --> H[准备归集交易数据]
H --> I[检查归集主地址状态]
I --> J[计算最优归集金额]
J --> K[预估交易手续费]
end
subgraph 签名请求与交易广播
K --> L[向签名服务请求签名]
L -->|等待签名| M[获取签名数据]
M --> N[广播交易到区块链]
N -->|返回交易哈希| O[记录交易哈希]
end
subgraph 交易确认与状态更新
O --> P[等待区块确认]
P -->|定时检查| Q{交易状态?}
Q -->|成功| R[更新归集记录为已完成]
Q -->|失败| S[标记为失败并记录错误]
Q -->|待定| P
end
subgraph 数据更新与通知
R --> T[更新用户地址余额]
R --> U[更新主钱包余额]
S --> V[触发失败告警]
V --> W[记录重试次数]
W -->|未达最大重试| X[加入重试队列]
W -->|已达最大重试| Y[人工介入处理]
R --> Z[发布归集成功事件]
end
X -->|延迟重试| L
核心功能时序图
1. 地址分配时序图(最新版)
sequenceDiagram
participant Client as 客户端/前端
participant API as API网关
participant AddressSvc as 地址服务
participant DB as 数据库
participant NATS as 事件总线
participant Monitor as 充值监控服务
Client->>API: 请求分配新地址(userId, coinType)
API->>API: 参数验证
API->>AddressSvc: 调用地址分配接口
AddressSvc->>DB: 查询用户是否已有该币种地址
alt 用户已有该币种地址
DB-->>AddressSvc: 返回已存在的地址
AddressSvc-->>API: 返回已有地址
API-->>Client: 返回已存在的地址信息
else 用户尚无该币种地址
AddressSvc->>DB: 查询地址池中可用地址
alt 地址池中有可用地址
DB-->>AddressSvc: 返回可用地址
else 地址池地址不足
AddressSvc->>AddressSvc: 批量生成新地址
AddressSvc->>DB: 保存新生成的地址到地址池
DB-->>AddressSvc: 保存成功
AddressSvc->>DB: 再次查询可用地址
DB-->>AddressSvc: 返回可用地址
end
AddressSvc->>DB: 开始事务
AddressSvc->>DB: 将地址状态更新为已分配
AddressSvc->>DB: 创建用户-地址关联记录
AddressSvc->>DB: 更新地址使用时间
AddressSvc->>DB: 提交事务
AddressSvc->>NATS: 发布地址分配事件(含用户ID、币种、地址信息)
NATS-->>Monitor: 通知地址已分配
Monitor->>Monitor: 更新监听配置,开始监控新地址
AddressSvc-->>API: 返回新分配的地址
API-->>Client: 返回分配成功及地址详情
end
Note over AddressSvc,DB: 定期任务:监控地址池水位,自动补充地址
2. 充值确认时序图(最新版)
sequenceDiagram
participant Blockchain as 区块链网络
participant Monitor as 充值监控服务
participant DB as 数据库
participant NATS as 事件总线
participant AddressSvc as 地址服务
participant WalletSvc as 钱包服务
loop 持续监控新区块
Blockchain->>Monitor: 新区块产生
Monitor->>Blockchain: 获取区块头信息
Monitor->>DB: 检查区块是否已处理
alt 区块未处理
Monitor->>Blockchain: 获取区块内所有交易
loop 遍历交易
Monitor->>Monitor: 解析交易详情
Monitor->>Monitor: 提取转出/转入地址
loop 检查每个转入地址
Monitor->>DB: 查询地址是否为系统地址
alt 是系统地址
DB-->>Monitor: 返回地址关联信息
Monitor->>DB: 查询交易是否已存在(防重复)
alt 交易不存在
Monitor->>DB: 创建待确认充值记录
loop 等待达到确认数
Monitor->>Blockchain: 检查交易确认数
alt 确认数达到阈值
Monitor->>DB: 更新充值记录状态为已确认
Monitor->>DB: 更新用户账户余额
Monitor->>NATS: 发布充值成功事件
NATS-->>WalletSvc: 通知余额更新
NATS-->>AddressSvc: 通知地址有交易
end
end
end
end
end
Monitor->>DB: 记录区块处理状态
end
end
end
项目结构
├── cmd/ # 应用程序入口
│ ├── address-service/ # 地址分配服务
│ ├── collection-service/ # 资金归集服务
│ ├── deposit-monitor/ # 充值监听服务
│ ├── migrate/ # 数据迁移服务
│ └── withdraw-service/ # 集中出金服务
├── configs/ # 配置文件
│ ├── .env # 环境变量配置
│ ├── .env.example # 环境变量示例
│ ├── config.json # 服务配置
│ └── config.json.example # 配置示例
├── data/ # 数据目录(SQLite数据库等)
├── internal/ # 内部包
│ ├── api/ # API 相关
│ ├── config/ # 配置管理
│ ├── ethereum/ # 以太坊交互
│ ├── models/ # 数据模型
│ ├── nats/ # NATS 事件总线
│ ├── service/ # 业务逻辑
│ ├── signer/ # 签名器实现
│ └── storage/ # 存储层
├── pkg/ # 公共包
│ ├── utils/ # 工具函数
│ └── validator/ # 验证器
├── scripts/ # 脚本文件
│ ├── add_test_address.go # 添加测试地址
│ ├── add_tx_hash_field.go # 添加交易哈希字段
│ ├── check_db_structure.go # 检查数据库结构
│ └── ... # 其他辅助脚本
├── web/ # 前端Web界面
│ ├── public/ # 静态资源
│ ├── src/ # 源代码
│ └── ... # 前端配置文件
├── go.mod # Go模块定义
├── go.sum # 依赖版本锁定
├── docker-compose.yml # Docker Compose 配置
└── README.md # 项目说明文档
技术栈
| 类别 | 技术/框架 | 用途 |
|---|---|---|
| 语言 | Go 1.21+ | 主要开发语言 |
| 数据库 | PostgreSQL/SQLite | 数据存储 |
| 消息队列 | NATS JetStream | 事件总线、服务间通信 |
| 区块链SDK | go-ethereum | 以太坊网络交互 |
| 容器化 | Docker | 应用容器化 |
| 编排 | Docker Compose | 本地开发环境 |
| 监控 | Prometheus + Grafana | 系统监控 |
快速开始
1. 准备环境
# 安装 Go 1.21 或更高版本 go version # 安装 Docker 和 Docker Compose docker --version docker-compose --version
2. 克隆项目
git clone https://github.com/QEasyWeb3/QEasyPay.git
cd QEasyPay3. 配置
# 复制配置文件 cp configs/config.json.example configs/config.json cp configs/.env.example .env # 编辑配置文件(根据实际情况修改) # .env 文件主要配置环境变量 # config.json 配置具体的服务参数
4. 安装依赖
# 安装 Go 依赖
go mod tidy5. 使用 Docker Compose 运行(推荐开发环境)
docker-compose up -d
这将会启动:
- 所有服务组件
- NATS 服务器
- SQLite 数据库
6. 单独运行各服务
启动充值监听服务
# 构建 go build -o bin/deposit-monitor ./cmd/deposit-monitor/main.go # 运行 ./bin/deposit-monitor -config configs/config.json
启动地址分配服务
# 构建 go build -o bin/address-service ./cmd/address-service/main.go # 运行 ./bin/address-service -config configs/config.json
启动集中出金服务
# 构建 go build -o bin/withdraw-service ./cmd/withdraw-service/main.go # 运行 ./bin/withdraw-service -config configs/config.json
启动资金归集服务
# 构建 go build -o bin/collection-service ./cmd/collection-service/main.go # 运行 ./bin/collection-service -config configs/config.json
运行数据迁移服务
# 构建 go build -o bin/migrate ./cmd/migrate/main.go # 运行(初始化数据库) ./bin/migrate -config configs/config.json
配置说明
主要配置文件
-
.env - 环境变量配置
# 数据库连接信息 DATABASE_URL="sqlite:///./data/qeasypay.db" # NATS 服务器地址 NATS_URL="nats://localhost:4222" # 以太坊 RPC 地址 ETH_RPC_URL="https://mainnet.infura.io/v3/YOUR_API_KEY" # 签名器配置 SIGNER_TYPE="local" -
config.json - 服务配置
- 服务监听端口
- 区块链配置
- 手续费配置
- 确认数阈值
-
Supabase配置说明
config.json中的Supabase配置信息(url、anon_key、jwt_secret)需要从以下Supabase项目管理页面获取:
配置域名(Redirect URL): https://supabase.com/dashboard/project/usnacuyjljtxaydfrykx/auth/url-configuration 注意要和MetaMask显示的要一致,包括后面的“/”
环境变量参考
| 环境变量 | 说明 | 默认值 |
|---|---|---|
| DATABASE_URL | 数据库连接字符串 | sqlite:///./data/qeasypay.db |
| NATS_URL | NATS 服务器地址 | nats://localhost:4222 |
| ETH_RPC_URL | 以太坊 RPC 地址 | - |
| SIGNER_TYPE | 签名器类型 | local |
| LOG_LEVEL | 日志级别 | info |
主要功能
用户账户系统
- 用户注册、认证
- 多账户管理
- 余额查询
- 交易历史
地址管理
- 自动生成和维护地址池
- 为用户分配唯一地址
- 批量生成地址(管理功能)
- 地址状态跟踪
充值处理
- 实时监听区块链交易
- 自动识别用户充值
- 多确认数保障
- 交易状态跟踪
提现处理
- 提现请求验证
- 手续费计算
- 支持多种签名方案
- 批量处理优化
- 交易广播和确认跟踪
事件总线
- 基于 NATS JetStream
- 持久化事件
- 支持消费组和重放
- 事件类型:充值、提现、地址分配等
安全注意事项
-
私钥管理
- 生产环境请使用 Clef 或 TSS/MPC 方案
- 不要在配置文件中硬编码私钥
- 建议使用环境变量或专用密钥管理系统
-
数据库安全
- 定期备份数据库
- 使用强密码和访问控制
- 加密存储敏感信息
-
API 安全
- 实现访问控制和认证
- 使用 HTTPS
- 限流和防暴力攻击
-
审计日志
- 记录所有关键操作
- 定期检查异常交易
- 实现不可篡改的操作日志
扩展性
- 支持多链扩展:可轻松添加其他 EVM 兼容链
- 支持多币种:可扩展支持更多加密货币
- 微服务架构:各模块可独立部署和扩展
- 签名器插件系统:支持多种签名方案
监控与维护
健康检查
- 各服务提供
/health端点用于健康检查 - 支持 Prometheus 指标采集
日志管理
- 结构化日志输出
- 支持不同日志级别
- 推荐配置 ELK 或 Loki 进行日志集中管理
告警配置
- 交易异常告警
- 服务状态告警
- 余额异常告警
开发说明
测试
# 运行所有测试 go test ./... # 运行特定包的测试 go test ./internal/service/...
构建
# 构建所有服务 make build # 或者单独构建 go build -o bin/deposit-monitor ./cmd/deposit-monitor/main.go go build -o bin/address-service ./cmd/address-service/main.go go build -o bin/withdraw-service ./cmd/withdraw-service/main.go
Docker 部署
# 构建后端服务镜像 docker build -t qeasypay/deposit-monitor -f cmd/deposit-monitor/Dockerfile . docker build -t qeasypay/address-service -f cmd/address-service/Dockerfile . docker build -t qeasypay/withdraw-service -f cmd/withdraw-service/Dockerfile . docker build -t qeasypay/collection-service -f cmd/collection-service/Dockerfile . # 构建Web前端服务镜像 docker build -t qeasypay/web -f web/Dockerfile ./web # 使用 Docker Compose 部署所有服务 docker-compose up -d # 单独构建并运行Web服务 docker-compose build web docker-compose up -d web
Web服务部署说明
Web前端服务已配置为通过Docker Compose部署,主要特点:
- 基于Nginx运行,优化了静态资源加载
- 端口映射:宿主机8080端口映射到容器80端口
- 依赖于api-service,确保API服务就绪后再启动Web服务
- 支持多语言界面
- 配置了20MB日志限制,避免日志无限增长
CI/CD 建议
- 使用 GitHub Actions 或 GitLab CI 进行持续集成
- 实现自动化测试和构建
- 部署前进行安全扫描
- 使用蓝绿部署或金丝雀发布策略
贡献指南
- Fork 仓库
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 运行测试确保代码质量
- 提交 Pull Request
许可证
联系我们
如有问题或建议,请提交 Issue 或联系项目维护者。 项目主页:https://github.com/bcskill/bcskill-easy-pay (项目迁移)