这个想法在我心里酝酿了很久:自己做一套永续合约去中心化交易所(Perp DEX),但不是拿去运营,而是把它做成一个白标产品,提供给真正有需求的团队。 如果你恰好有这样的需求,现在就可以来找我预订这套系统。
我反复推演过很多次,却因为各种现实原因一直搁置。最近我终于意识到,如果再不开始,我可能会永远拖下去。所以,这个周末,我没有再给自己找任何借口,直接启动了项目。
这些年,我参与设计或实现的交易系统已经数不清了。但一个人独立扛下从架构设计、协议定义、撮合与清算逻辑、风控策略到前后端实现的完整系统,这还是头一回。放在两年前,这至少需要一个十几二十人的团队,投入大半年时间才能勉强落地。
但现在不一样了。在 AI 的加持下,我一个人加上 AI,本质上就是一个完整的、高效率的团队。更重要的是,当所有核心细节都由我一人把控时,我反而比以往任何一次合作开发都更有信心把它做好。
当然,这件事绝不简单。要把一套 Perp DEX 做完整、做扎实,远不止是把智能合约、前端和后端拼在一起那么简单。账户模型、撮合与清算逻辑、风险控制、资金安全、异常场景处理……任何一个环节理解不够深入,都可能在真实的交易压力下暴露出致命问题。
我计划中的 DEX 将采用链下撮合 + 链上结算的混合架构,包含的模块会非常多。今天,我想先和大家分享一下我对充提模块的一些核心设计思考。
充提模块设计目标
我设计的这个充提模块需要满足几个核心功能:
- 直接充值:用户可以通过钱包直接调用合约的
deposit() 函数完成充值。
- 多链支持:需要支持主流 EVM 链(如 Ethereum, Arbitrum, Base, BNB Chain 等)。
- 跨链充提:用户可以在 A 链充值,在 B 链提现。
- 多币种充提:用户可以使用不同的代币(如 USDT, ETH)进行充值,也可以选择提取成不同的代币。
这意味着我们需要在每条支持的链上都部署充值合约。链下的钱包服务需要监听所有链上的充值事件,并将资产结算到用户在链上的统一资产账户中。为了简化结算逻辑,系统内部将采用 USDC 作为统一的计价和结算单位。
多币种充提功能,本质上是要实现其他代币与 USDC 之间的自动兑换。这可以通过接入 Uniswap、PancakeSwap 等 DEX,或者 1inch、OKX DEX 等聚合器来实现。
真正的挑战其实在于提现环节。由于采用链下撮合模式,用户的仓位、盈亏等关键信息只有链下系统知道,智能合约无法独立验证用户的可提金额,必须依赖后端系统的签名授权。那么,如何防止签名私钥泄露或签名者作恶,就成了首要难题。
此外,由于支持跨链提现,当用户在 B 链发起提现时,B 链合约内可能没有足够的 USDC 余额。如何避免或尽量减少这种情况,是另一个需要解决的难点。
分层提现机制:平衡安全与效率
针对第一个难题——签名安全与权限控制,我设计的解决方案是 分层提现机制。根据提现金额的大小,采用不同级别的安全策略和处理流程,具体如下表所示:
| 金额 |
签名方式 |
时间锁 |
链上多签审核 |
预计到账 |
| < 1万 |
MPC 自动 |
无 |
无 |
即时 |
| 1-10万 |
MPC 自动 |
1小时 |
无 |
1小时 |
| 10-50万 |
MPC + 多签 |
1小时 |
2-of-3 |
4小时内 |
| > 50万 |
MPC + 多签 |
1小时 |
3-of-3 |
4-24小时 |
我将提现分为四个层级:
- 小额提现(<1万):由后端的 Signer 服务自动进行签名。为了从根本上杜绝私钥泄露风险,我计划接入 Fireblocks 这类第三方 MPC(安全多方计算)钱包服务。这样,Signer 服务本身永远不会接触到私钥,同时还能实现签名的全自动化。
- 中额提现(1-10万):同样由 MPC 自动签名,但增加了1小时的链下时间锁。在这1小时内,系统会暂时冻结这部分提现金额。如果合约中设置的 Guardian(守护者)角色发现该笔提现存在问题(例如涉嫌欺诈),可以在链上发起取消操作。如果1小时内无异议,系统将自动执行提现。
- 大额提现(10-50万 & >50万):在自动签名的基础上,增加了链上多签审核流程。合约中会预设3个审核地址。对于10-50万级别的提现,需要至少2个审核者签名;对于超过50万的提现,则需要3个审核者全部签名才能通过。
所有这些层级的具体金额阈值、时间锁时长都应该是可配置的,以适应不同运营阶段的需求。
整个提现流程的路由可以清晰地用以下文本流程图表示:
用户请求提现
│
▼
┌─────────────────┐
│ 判断金额 │
└────────┬────────┘
│
┌────┴────────────────────┬─────────────────────┐
│ │ │
▼ ▼ ▼
< 1万 1万 - 10万 > 10万
│ │ │
▼ ▼ ▼
MPC 签名 链下时间锁 需人工审核?
│ 冻结余额 │
▼ │ ┌──────┴──────┐
直接执行 等待 1 小时 │ │
│ │ ▼ ▼
▼ ▼ 10-50万 >50万
即时到账 后端自动执行 │ │
MPC 签名 ▼ ▼
│ 2-of-3审核 3-of-3审核
▼ │ │
用户收到 └──────┬──────┘
│
▼
链上时间锁
requestWithdraw
│
等待 1 小时
│
▼
executeWithdraw
│
▼
用户收到
资金再平衡机制:保障跨链提现流畅性
为了解决第二个难题——目标链余额不足,我设计了一套资金再平衡机制。
基本思路是:根据每条链的历史提现占比,为其分配一个“目标余额”和“安全线”。系统通过定时任务(例如每小时一次)监控各链合约余额,一旦发现某条链的余额低于安全线,就自动从资产富余的链上跨链补充资金至目标余额。
举例说明,假设系统主要支持三条链,配置可能如下:
| 链 |
提现占比 |
安全线 |
目标余额 |
上限 |
| Arbitrum |
50% |
50K |
100K |
- (主链,无上限) |
| Base |
30% |
30K |
60K |
100K |
| BNB Chain |
20% |
20K |
40K |
70K |
假设定时任务检查发现 Arbitrum 链上余额只剩 40K(低于50K安全线),而 Base 链上有 100K(高于其60K的目标余额)。那么系统会自动从 Base 链跨链转移 60K USDC 到 Arbitrum,使 Arbitrum 余额达到 100K。转移后,Base 链余额变为 40K,依然高于其30K的安全线。
此外,如果用户提现时实时检测到目标链余额不足,也会立即触发一次再平衡操作,从富余链调入资金,确保提现能够顺利完成。
关于跨链方案的选择,对于 USDC 而言,Circle 的 CCTP(跨链传输协议) 是天然最合适、最官方的解决方案,能够实现 USDC 在源链销毁、在目标链原生铸造的流程,安全且高效。
小结与后续
以上就是我对这款白标 Perp DEX 充提模块的核心设计思考。通过分层提现机制在安全与效率之间找到平衡,再通过资金再平衡机制保障跨链操作的流畅性。这仅仅是整个庞大系统的第一个模块,后续我会继续分享订单簿、撮合引擎、风险控制等其他模块的设计与实现进展。
独力操盘一个完整系统的感觉很像一次精密的 开源实战,每一个设计决策都需要反复权衡。如果你对这类 DeFi 协议开发、系统架构设计感兴趣,欢迎来 云栈社区 交流讨论,那里有许多专注 后端 与高并发系统的朋友。