Skip to content

haochencheng/Web3Exchage

Repository files navigation

  1. 总体架构(高层)

客户端层:Web UI(React/Vue)、移动端(iOS/Android)、第三方 API 客户端(REST/WS)。

API 网关:统一入口,做鉴权、限流、路由、灰度。建议 Nginx/Envoy + JWT。

网关服务层(Auth / API):

Auth 服务(登录、2FA、OAuth、API Key)

公共 API(行情、下单、撤单、账户)

WebSocket 服务(行情/逐笔撮合/用户订单推送)

业务服务层(微服务):

撮合引擎(Matching Engine) — 关键且高性能

订单服务 — 订单写入、状态机

账户/余额服务 — 逻辑余额、冻结、可用

结算/清算服务 — 逐笔结算、手续费计算、账务流水

钱包服务 — 链上热/冷钱包管理、签名、广播

风控/风控队列 — 反欺诈、风控策略

KYC/AML 服务 — 用户身份审核、黑名单查詢

后台管理 — 手工结算、提现审核、配置管理

数据与消息层:

消息队列(Kafka/RabbitMQ)— 解耦、异步任务(撮合 -> 账户 -> 钱包)。

缓存(Redis)— 订单薄、行情、会话。

数据库:事务库(Postgres/MySQL) + 审计/分析数据仓库(ClickHouse / BigQuery)。

区块链层:连接节点或第三方服务(Infura/Alchemy / 本地节点)用于链上转账、确认监听。

监控/审计/日志:Prometheus + Grafana、ELK/EFK、报警/审计日志。

图示(逻辑):Client → API Gateway → Auth/API → (via MQ/Redis) → Matching / Order / Account → Wallet → Blockchain

  1. 关键子系统详细设计 2.1 撮合引擎(核心)

职责:接收限价/市价/IOC等订单,维护订单簿(buy/sell),按价格优先/时间优先匹配,生成成交(trade)事件。

性能目标:延迟 < 1ms(撮合内),吞吐量:可支持数万 TPS(按需)。

实现思路:

使用单机单市场内存撮合(C++/Rust/Go/Java),内存数据结构(跳表/红黑树或堆)维护price level和order queue。

每个交易对独立撮合线程(避免锁竞争)。

成交后同步写入订单服务(通过持久化日志或 MQ),并发送到账务/通知队列。

容错:

定期将撮合快照与 WAL(Write-Ahead-Log)持久化到磁盘。

在重启时回放 WAL 恢复状态。

2.2 订单服务 & 账户服务(重要事务边界)

订单服务:负责订单生命周期管理(新建、部分成交、全部成交、取消、过期),生成事件写入 MQ。

账户/余额服务:

使用逻辑余额模型(available, reserved, total)。

所有资金变动都要写入账务流水表(不可变)。

关键操作(下单占用、成交扣减/入账、提现冻结/释放)要走分布式事务 / 强一致策略:建议使用 乐观锁 + 数据库事务 或 应用层流水 + 幂等设计(所有操作可重放)。

一致性:

建议将撮合和账户之间用 MQ 解耦,但必须保证“最终一致性 + 幂等”与可回溯审计。

对重要路径(如撮合成交后资金结算),使用确认/回执机制:撮合发送成交 -> 账户确认并返回 ack -> 如果长时间无 ack,则进入人工/自动补偿流程。

2.3 钱包服务(热/冷钱包)

热钱包:小额、频繁出入;在线签名、集中管理;

冷钱包:大量资金离线冷存储;

策略:

提现请求先在业务库冻结,然后由后台批量打包并在热钱包中签名和广播。

定期将热钱包余额回补到冷钱包(手动或多签)。

安全:

使用 HSM 或多签(Hardware wallet / Vault / AWS KMS / Hashicorp Vault)做签名密钥管理。

私钥绝不可硬编码或存数据库明文。

链上监控:监听交易确认数并在区块确认达到阈值后标记到账。

2.4 KYC / AML / 风控

KYC:用户注册后提交证件,第三方识别(Onfido/Trulioo)或内部审核。

AML:黑名单地址/身份库,交易行为检测(异常频率、大额、洗钱模式)。

风控策略:

单笔/单日限额、提币冷却、IP冻结、地理位置黑名单。

机器学习或规则引擎识别异常,自动触发人工复查。

2.5 API & WebSocket

REST API:下单、撤单、查询账户、历史订单、行情接口。

WebSocket:

推送:市场深度、成交流、用户订单变动、资产变更。

使用心跳、重连、顺序号机制保证消息不丢失(若丢失可请求快照差分)。

  1. 数据库与表设计(简化版) 核心表(MySQL/Postgres)

users (id, email, phone, status, kyc_status, created_at)

api_keys (id, user_id, key_hash, scope, created_at)

wallets (id, user_id, currency, total, available, reserved, updated_at)

orders (id, user_id, pair, side, type, price, amount, filled_amount, status, created_at, updated_at)

trades (id, buy_order_id, sell_order_id, price, amount, fee, timestamp)

account_transactions (id, user_id, currency, change, balance_before, balance_after, type, ref_id, created_at)

withdrawals (id, user_id, currency, amount, fee, address, txid, status, created_at)

deposits (id, txid, currency, amount, address, confirmations, status, created_at)

audit_logs (id, user_id, action, payload, created_at)

日志/分析(ClickHouse)

市场行情历史(kline)、撮合吞吐统计、异常交易轨迹。

  1. API 设计示例(简要)

REST:

POST /api/v1/order — 下单(body: pair, side, type, price, amount, clientOrderId)

POST /api/v1/order/cancel — 撤单(orderId 或 clientOrderId)

GET /api/v1/order/{id} — 订单状态

GET /api/v1/orders — 历史/当前挂单(分页)

GET /api/v1/market/ticker?pair=BTC-USDT

GET /api/v1/market/depth?pair=BTC-USDT&limit=50

POST /api/v1/withdraw — 提币申请(触发风控/人工审核)

WebSocket channels:

market.${pair}.depth — 深度

market.${pair}.trades — 成交流

user.${userId}.order — 用户订单变动

user.${userId}.balance — 资产变更

鉴权:API Key + HMAC 签名(timestamp + endpoint + body),或 OAuth2 + JWT。

  1. 关键流程(序列概述) 5.1 下单 -> 成交 -> 结算(简化)

客户端调用 POST /order(API 网关验证)→ API 服务写入 orders(状态 PENDING),并把请求推送到 撮合队列(Kafka)。

撮合引擎 从队列拉取订单并在内存订单簿中匹配,生成 trade 事件(包含 buyOrderId, sellOrderId, price, amount, fee)。

撮合引擎将 trade 写回 MQ(trade topic),并写 WAL。

账户服务 监听 trade topic,执行资金变动:减少买家冻结余额、增加买家可用货币、增加卖家法币可用、计算并扣收手续费,写入 account_transactions。账户服务 ack。

API/WebSocket 推送更新给用户(订单状态、余额变化)。

定期批处理汇总手续费给平台收益地址,流水入账。

5.2 提现(提现链上广播)

用户发起提现 → 钱包服务检查余额 + 风控 → 创建提现记录(状态 PENDING)。

人工或自动审核通过后,钱包服务将提现打包到热钱包,签名并广播到链上,记录 txid(状态 BROADCAST)。

链上确认达到 N 个 block 后将提现状态标为 COMPLETED。

  1. 安全与合规(必做)

私钥管理:HSM 或 Vault;多签;严格隔离热/冷私钥。

运维安全:最小权限、分段网络(VPC、子网)、WAF、入侵检测、端口白名单。

身份安全:强制 2FA、设备指纹、IP/Geo 限制、登录通知。

审计与可追溯:所有资金关联操作都有不可篡改流水并备份到写保护存储。

合规:KYC/AML、交易数据留存、可配合调查的导出功能。

DDOS 防护:Cloudflare / Anti-DDoS + API限流 + IP黑白名单。

代码安全:定期安全审计、第三方依赖扫描、CI/CD 安全门禁。

  1. 非功能需求 & 性能目标

可用性:核心服务(撮合/账户)目标 99.99%,多区部署 + 自动故障切换。

恢复时间(RTO):撮合服务需尽快恢复(秒级~分钟),并保证事务一致性。

数据保全:定期冷备份、WAL 持久化、跨区域备份。

吞吐:初版可支持数百~上千 TPS;成长路线:垂直优化撮合引擎与分区(多台分市场)。

  1. 部署 & 运维

容器化:Docker + Kubernetes(K8s),每个交易对可独立部署/横向扩展撮合服务。

CI/CD:流水线(测试、审计、灰度发布)。

监控:Prometheus (metrics)、Grafana(dashboards)、Alertmanager(告警)、ELK(日志)。

SRE 操作:自动扩容、健康检查、混沌测试(Chaos engineering)验证容错。

  1. 测试策略

单元 + 集成测试:关键路径(撮合->资金结算)强制覆盖。

压力测试:搭建交易回放工具(历史 Tick 回放)做性能评估。

混合回测:模拟用户并发下单/撤单/提现场景,检测一致性与延迟。

安全测试:渗透测试、密钥泄露模拟、入侵检测演练。

  1. 演进路线(MVP → Production)

MVP(最小可行):

支持 1-3 个交易对、限价/市价订单、REST + WS 基本功能、热/冷钱包基础。

简单 KYC 表单 + 手动审核。

阶段 2:

扩展撮合并发能力、引入 MQ、自动化 KYC、自动提现打包。

加入更细粒度风控与 AML 模块。

阶段 3(成熟):

多区域容灾、HSM 多签、合规审计导出、做市商接口、保险金库、杠杆/合约(如需)。

  1. 示例技术栈建议

撮合引擎:C++ / Rust / Go(低延迟)

后端微服务:Go / Java / Kotlin / Node.js(Spring Boot)

DB:Postgres 或 MySQL,分析 ClickHouse

缓存:Redis(订阅/发布 & 排队/限速)

MQ:Kafka / RabbitMQ(Kafka 更适合高吞吐)

API 网关:Envoy / Nginx

身份/密钥管理:HashiCorp Vault / AWS KMS / HSM

日志/监控:ELK/EFK、Prometheus、Grafana

  1. 风险点 & 注意事项(实践经验)

撮合与账务一致性 是最容易出问题的:设计幂等、可回放的成交流水,并实现补偿机制。

私钥泄露 的破坏性最大:把私钥安全放在第一位(多签+HSM)。

性能瓶颈 往往出现在 DB 写入上,考虑异步化和批处理写入流水。

合规风险:不同国家/地区对加密货币监管差别大,需要法律团队支持。

人工审核 在早期不可或缺:防止大量自动化洗钱/攻击。

如果你愿意,我可以继续做下面几件事(选其一或多个直接给出):

用你偏好的语言(比如 Java/Go)写一个撮合引擎的伪代码实现或核心数据结构示例。

给出Order / Trade / AccountTransactions 的 SQL DDL(可直接用于 Postgres/MySQL)。

画一张序列图(文字版)展示从下单到链上提现的完整流程。

提供安全检查清单(checklist),便于上线检查。

About

学习使用交易所代码

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages