撮合引擎与交叉撮合
撮合引擎是 Astromarkets 的核心:基于红黑树实现的订单簿,并为预测市场场景扩展出交叉撮合语义。
每次 处理订单 分两个阶段执行。
Phase 1 — 直接撮合(同代币 Bid ↔ Ask)
BidYes ↔ AskYes、BidNo ↔ AskNo,与传统 CLOB 完全一致:价格优先、时间优先(FIFO),taker 享受价格改善(按 maker 报价成交)。
Phase 2 — 交叉撮合(互补代币,隐含铸造/赎回)
这是 Astromarkets 区别于普通订单簿的关键。利用 Yes + No = 1 的等价关系,让买 Yes 的人和买 No 的人直接成为对手方:
| 交叉方向 | 双方 | 协议动作 |
|---|---|---|
BidYes ↔ BidNo | 都想买入,都付 USDC | 铸造完整组,分别交付给两方 |
AskYes ↔ AskNo | 都想卖出,各持一种代币 | 赎回完整组 |
交叉条件
以 COMPLEMENT_PRICE_TICKS = 1000(1.000 USDC)为基准:
- Bid 侧:
p_taker + q_maker ≥ 1000 - Ask 侧:
p_taker + q_maker ≤ 1000
成交定价(与直接撮合对称,taker 享改善)
taker 实际成交价 = 1000 − maker 报价
maker 按自己报价成交
价差 归协议(计入手续费)
示例
一个
BidYes @ 800 ticks(愿出 0.80 买 Yes)的 taker,遇到簿上BidNo @ 300 ticks(愿出 0.30 买 No)的 maker。
800 + 300 = 1100 ≥ 1000,交叉成立。协议铸造 1 个完整组:
- taker 实付
1000 − 300 = 700 ticks(0.70,优于其报价 0.80),得到 YES;- maker 按 0.30 得到 NO;
- 两者合计支付
0.70 + 0.30 = 1.00 USDC,恰好覆盖铸造完整组的成本,多余价差归协议。
成交后更新 maker 的 交易状态(在 locked / free 之间转移资金)。手续费按直接 + 交叉的总成交量统一计算,累积到订单簿的 unclaimed_quote_lot_fees。
为什么这是护城河
- 流动性合并:传统设计里「买 Yes 的盘」和「买 No 的盘」是割裂的两侧;Astromarkets 把它们打通成同一个深度池——同样的挂单量提供约 2× 的可成交深度,对长尾 / 新生市场的流动性冷启动尤为关键;
- 更优执行价:交叉撮合让两个本来不可能成交的买家互相满足,双方都可能获得优于报价的成交;
- 资本效率:做市商无需预先持有两种代币库存,挂单即可被交叉吃掉。