ch03-14 下单调用链练习
先抓住结构
先把“下单调用链练习”放进 DeepBook 的对象图里。这里不是罗列模块,而是建立阅读顺序:入口在哪里,状态放在哪里,资金最终在哪里结算。
架构坐标
先把架构坐标钉在这些文件上。读这一节时不需要展开所有实现,只要看清对象分工、入口函数和后续会反复回来的状态边界。
- packages/deepbook/sources/pool.move
- packages/deepbook/sources/book/book.move
- packages/deepbook/sources/book/fill.move
- packages/deepbook/sources/state/state.move
- packages/deepbook/sources/vault/vault.move
- packages/deepbook/sources/book/order_info.move
这些入口是架构地图上的锚点。先标注每个模块负责的状态,再顺着一次下单或结算回到具体函数。
读架构
用一个限价买单推演源码路径:
- 输入:
is_bid = true、price = 1000、quantity = 5000、order_type = no_restriction。 - Pool 创建
OrderInfo,记录 taker、BalanceManager、订单类型、价格、数量、DEEP fee 选项。 - Book 生成 bid order id,并从 asks 最低价开始扫描。
- 如果 ask price <= bid price,则
order_info.match_maker调用 makerOrder::generate_fill。 Fill记录 maker order id、成交价、base/quote 数量、maker/taker fee 标记。- 完全成交的 maker 从 asks 移除,过期 maker 也移除。
- 如果 taker 剩余数量未完成并且不是 IOC/FOK/Post-only abort 场景,则插入 bids。
- State 更新 maker/taker 账户,计算费用和 owed/settled。
- Vault 在 Pool 与 BalanceManager 之间做净额结算。
- 最后 emit
OrderInfo、OrderFilled、OrderPlaced或OrderFullyFilled等事件。
阅读补充
这个练习建议实际写成表格:每一行是一个阶段,列出当前模块、关键函数、输入、输出、可能 abort 和事件。这样一笔订单能同时训练源码跳转、交易参数理解和失败排查。
复盘时不要只写成功路径。把 IOC/FOK/Post-only、过期 maker、部分成交、余额不足、tick/lot 不合法分别放进旁注,后续做 SDK 或前端时就能把错误提示设计得更准确。
工程判断
- 练习输出必须包含控制流、资金流和事件流三列。
- 每个阶段都记录可能 abort 的原因,尤其是参数和权限检查。
- 部分成交场景要说明剩余数量是插入订单簿还是被订单类型取消。
读完以后问自己
- 限价买单从 Pool 到 Vault 至少经过哪些模块?
- 部分成交后
OrderInfo为什么还要继续参与 State 处理? - 哪些订单类型会改变“剩余数量是否挂单”的结果?