关键词:Serum DEX、去中心化交易所、Solana 区块链、limit orderbook、Rust 智能合约、高频撮合、低手续费、on-chain 订单簿
Serum 是第一个在 Solana 上实现了链上 limit orderbook & 撮合引擎 的去中心化交易所(DEX)。凭借 400 ms 的出块速度与每秒约 5 万笔交易(tps)的高吞吐,它让“订单簿完全链上”在性能瓶颈之上成为可能。本文将带你完成本地测试网的完整搭建流程,并拆解核心技术细节,让开发者能像搭乐高一样快速上线自己的 Serum 市场。
导读:为什么关注 Serum DEX
- 纯粹链上撮合:所有挂单、撤单、清算都在合约里完成,无需链下中心化服务器。
- 聚合生态:Raydium、Jupiter 等大额流量项目已将流动性接入 Serum 订单簿。
- 可组合收益:同一笔资产可同时做市、挖矿、借贷,彼此无锁仓冲突。
👉 想要第一时间捕抓链上订单流数据?来看看这笔高频做市收益背后的抓取脚本
开发环境前置要求
- 安装 Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - 安装 Solana CLI:
sh -c "$(curl -sSfL https://release.solana.com/stable/install)" - 本地测试链:
solana-test-validator --no-bpf-jit --reset - 空投 100 SOL 测试币:
solana airdrop 100
第一步:克隆并编译 Serum 核心程序
git clone https://github.com/project-serum/serum-dex.git
cd serum-dex/dex
cargo build-bpf
solana deploy target/bpfel-unknown-unknown/release/serum_dex.so部署成功后你会得到类似:
Program Id: HEKdDjSvXxxfDud8puPxgLYdWFfnVe8A4jENDxHzVR16在主网部署约需 2.42 SOL 的租金;合约大小 ~ 348 KB。用 solana rent 348024 可验证租金。第二步:利用 crank 创建交易市场
Serum 生态自带一个命令行工具 crank,可一键生成完整的交易对(quote & base token)所需全部账户:
cd ../crank
cargo run -- localnet whole-shebang ~/.config/solana/id.json HEKdDjSvXxxfDud8puPxgLYdWFfnVe8A4jENDxHzVR16终端会打印关键账户地址,例如:
Market:6saerH11Lqky4QfLUG3Papjsb1eesuEeMcyvMEMBcAWNCoin Vault&PC Vault:分别存放基础资产和计价资产。Bids/Asks/Event Queue:订单簿与事件队列。
Serum 账户大小速查
| 账户 | 默认字节 | 功能 |
|---|---|---|
| Market | 376 | 存储 tick/lot 大小 |
| Request Queue | 640 | 挂单/撤单请求 |
| Event Queue | 1,048,576 | 撮合产生的成交记录 |
| Bids & Asks | 65,536 | orderbook radix tree 节点空间 |
Event Queue 一旦被填满撮合将停止,请按预估峰值订单量提前扩容。
第三步:本地启动 Serum DEX UI
git clone https://github.com/project-serum/serum-dex-ui.git
cd serum-dex-ui
# 移除 TradingView 私有依赖
# 编辑 src/pages/TradePage.tsx 把 TVChartContainer 用空组件替代
yarn && yarn start浏览器打开 http://localhost:3000,点击“+”把刚才生成的 Market ID 填入即可看到自己的交易对(示例 NOX/USDC)。
第四步:铸造测试代币并转账到钱包
# 1. 创建 Token 账户
spl-token create-account <COIN_MINT>
spl-token create-account <PC_MINT>
# 2. 铸造 100w 个零资产
spl-token mint <COIN_MINT> 1000000
spl-token mint <PC_MINT> 1000000
# 3. 转账到浏览器插件钱包
spl-token transfer <COIN_MINT> 10000 <WALLET_PUBKEY>
spl-token transfer <PC_MINT> 10000 <WALLET_PUBKEY>完成上述步骤后,你的钱包即可在 Serum UI 里看到余额并进行链上限价交易。
第五步:理解 Lot Size & Tick Size
Serum 使用 整数计算模型,一切价格与数量均为 lot 的整数倍:
coin_lot_size:基础资产最小下单单位。pc_lot_size:计价资产最小计价单位。pc_dust_threshold:忽略尘埃订单阈值。
示例:
USDC 为 6 位小数,若想保留 3 位大小精度 + 3 位价格精度:
base_lot = 10^(6-3) = 1000
quote_lot = 10^(6-3-3) = 1任何撮合都满足 quantity * price ≤ 2^64。
第六步:监听事件与异常排查
WebSocket 过滤
所有 Serum 相关账户在初始化时会写入前缀 "serum"。使用 memcmp offset 0 即可快速过滤:
RpcFilterType::Memcmp(Memcmp::Bytes("serum".as_bytes().to_vec()))常见错误码
Serum 异常以十六进制返回,可在 error.rs 查找。例如:
0x34:余额不足 → 补充 token 或调大 Lot Size。0x1000067e:第 1662 行state.rs的断言失败,需检查各账户大小。
第七步:Open Orders 账户管理
任何挂单前需调用 InitOpenOrders 创建用户层面的 Open Orders 账户:
- total = 冻结 + 未成交
- free = 可提取余额
订单被撮合后需执行 SettleFunds,将 free 余额转回标准 SPL 钱包。
FAQ
Q1:为何部署后未看到买卖盘?
A:尚未有人挂单或 Event Queue 已满。扩容 event queue 或自行挂首单即可验证。
Q2:主网租金太高怎么办?
A:可部署在 Solana Devnet,也可借助 多签 + PDA buffer 回退 机制减少热更新租金。
Q3:如何批量创建多市场交易对?
A:写脚本调用 crank 的 whole-shebang,循环读取 JSON config 即可。
Q4:Serum UI 能不能替换自定义行情图表?
A:TradingView 依赖需向官方申请授权,开发环境可临时替换为空组件或接入 https://tradingview.com/widget。
Q5:超出账户大小后还能扩容吗?
A:Solana 账户大小一旦创建即固定。需重新部署新市场并迁移流动性。
Q6:为何在本地看不到成交记录?
A:未启动 crank 事件消费;运行 crank consume-events 查看实时撮合日志。
延伸思考:可组合的收益飞轮
Serum 作为 Solana DeFi 的流动性底座,可与 链上永续合约、可赎回债券、闪电代付 gas 组合出三层杠杆套利飞轮。你只需在智能合约里调用 settle_funds,即可实现“做市+放贷+杠杆”全栈收益。
现在,轮到你动手: 反向推演上述流程,把任意 ERC-20 资产桥接到 Solana SPL,再搭一条全新的 去中心化交易所,让高频量化的 ταχυδρομικός 在 400 ms 内完成盈亏结算。