深入理解 Serum DEX:在 Solana 区块链上部署去中心化交易所的完整指南

·

关键词:Serum DEX、去中心化交易所、Solana 区块链、limit orderbook、Rust 智能合约、高频撮合、低手续费、on-chain 订单簿

Serum 是第一个在 Solana 上实现了链上 limit orderbook & 撮合引擎 的去中心化交易所(DEX)。凭借 400 ms 的出块速度与每秒约 5 万笔交易(tps)的高吞吐,它让“订单簿完全链上”在性能瓶颈之上成为可能。本文将带你完成本地测试网的完整搭建流程,并拆解核心技术细节,让开发者能像搭乐高一样快速上线自己的 Serum 市场。


导读:为什么关注 Serum DEX

👉 想要第一时间捕抓链上订单流数据?来看看这笔高频做市收益背后的抓取脚本


开发环境前置要求

  1. 安装 Rust:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  2. 安装 Solana CLI:sh -c "$(curl -sSfL https://release.solana.com/stable/install)"
  3. 本地测试链:solana-test-validator --no-bpf-jit --reset
  4. 空投 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

终端会打印关键账户地址,例如:


Serum 账户大小速查

账户默认字节功能
Market376存储 tick/lot 大小
Request Queue640挂单/撤单请求
Event Queue1,048,576撮合产生的成交记录
Bids & Asks65,536orderbook 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 的整数倍:

示例:
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 查找。例如:

👉 一键解锁链上调试利器——DEX 错误码速查表已备好


第七步:Open Orders 账户管理

任何挂单前需调用 InitOpenOrders 创建用户层面的 Open Orders 账户:

订单被撮合后需执行 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 内完成盈亏结算。