GitHub - bcskill/bcskill-easy-pay: QEasyPay is a backend service system designed specifically for cryptocurrency trading platforms, providing complete functions for deposit monitoring, address management, withdrawal processing, and fund aggregation. Providing technical support for the BCSkill technical community - Trustivon internal project.

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
Loading

核心模块说明

  1. 充值监听服务 (deposit-monitor)

    • 持续监听区块链网络上的交易事件
    • 识别并处理用户充值交易
    • 更新交易状态和确认数
    • 发布充值完成事件到 NATS
    • 支持多链和多币种的充值监控
    • 实现交易去重和幂等性处理
  2. 地址分配服务 (address-service)

    • 管理加密货币地址池
    • 为用户分配唯一的充值地址
    • 支持地址批量生成和状态管理
    • 处理地址相关的 API 请求
    • 实现地址与用户账户的关联管理
    • 提供地址健康检查机制
  3. 集中出金服务 (withdraw-service)

    • 处理用户提现请求
    • 实现提现前余额冻结机制
    • 计算手续费并验证余额
    • 生成交易并请求签名
    • 广播交易并更新状态
    • 支持提现审核流程
    • 实现失败交易的重试机制
  4. 资金归集服务 (collection-service)

  5. Web前端服务 (web)

    • 提供用户界面,集成Web3钱包连接
    • 支持多语言(英语、日语、繁体中文)
    • 实现用户认证和授权流程
    • 显示用户资产和交易记录
    • 响应式设计,适配不同设备
    • 部署在Nginx容器中提供静态资源服务
    • 定期检查用户地址的余额
    • 当余额超过设定阈值时,自动将资金归集到主账户
    • 支持原生代币和ERC20代币的归集
    • 交易签名和发送的完整流程管理
    • 归集历史记录追踪和错误重试机制
    • 优化归集策略,减少手续费支出
  6. 数据迁移服务 (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: 通知用户充值完成
Loading

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
Loading

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
Loading

核心功能时序图

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: 定期任务:监控地址池水位,自动补充地址
Loading

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
Loading

项目结构

├── 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 QEasyPay

3. 配置

# 复制配置文件
cp configs/config.json.example configs/config.json
cp configs/.env.example .env

# 编辑配置文件(根据实际情况修改)
# .env 文件主要配置环境变量
# config.json 配置具体的服务参数

4. 安装依赖

# 安装 Go 依赖
go mod tidy

5. 使用 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

配置说明

主要配置文件

  1. .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"
    
  2. config.json - 服务配置

    • 服务监听端口
    • 区块链配置
    • 手续费配置
    • 确认数阈值
  3. 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
  • 持久化事件
  • 支持消费组和重放
  • 事件类型:充值、提现、地址分配等

安全注意事项

  1. 私钥管理

    • 生产环境请使用 Clef 或 TSS/MPC 方案
    • 不要在配置文件中硬编码私钥
    • 建议使用环境变量或专用密钥管理系统
  2. 数据库安全

    • 定期备份数据库
    • 使用强密码和访问控制
    • 加密存储敏感信息
  3. API 安全

    • 实现访问控制和认证
    • 使用 HTTPS
    • 限流和防暴力攻击
  4. 审计日志

    • 记录所有关键操作
    • 定期检查异常交易
    • 实现不可篡改的操作日志

扩展性

  • 支持多链扩展:可轻松添加其他 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日志限制,避免日志无限增长

访问地址:http://localhost:8080

CI/CD 建议

  • 使用 GitHub Actions 或 GitLab CI 进行持续集成
  • 实现自动化测试和构建
  • 部署前进行安全扫描
  • 使用蓝绿部署或金丝雀发布策略

贡献指南

  1. Fork 仓库
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 运行测试确保代码质量
  6. 提交 Pull Request

许可证

MIT

联系我们

如有问题或建议,请提交 Issue 或联系项目维护者。 项目主页:https://github.com/bcskill/bcskill-easy-pay (项目迁移)