☰
Monad 300ms 超快出块链入门:jev-trader 背后的区块链底层,新手必读指南
2026/10/2 7:06:07 网站建设 项目流程

Monad 300ms 超快出块链入门:jev-trader 背后的区块链底层,新手必读指南

【免费下载链接】jev-traderOne AI trade decision every Monad block. Jev on Kuru MON-USDC.项目地址: https://gitcode.com/gh_mirrors/je/jev-trader

在 Monad 这条 300 毫秒出块一次的超快公链上,jev-trader 是一个每出一个区块就让 AI 做一次真实交易决策的机器人:它盯住链上交易所 Kuru 的 MON-USDC 订单簿,每约 300ms 回答一次「买还是卖」,并挂出一张真实的 post-only 限价单。想理解这个项目为什么把每一次决策都压进一个区块,就得先理解它脚下的 Monad 链——这条链的出块速度、gas 计费规则和 RPC 行为,共同决定了「AI 高频交易」这种玩法是可能的。

Monad 是什么:300ms 出块意味着什么

Monad 是一条基于 Rust 构建的高性能 EVM 兼容链,核心卖点只有一个数字:约 300ms 一个区块,也就是每秒 210 个区块,对比以太坊主网约 12 秒一个区块,快了近 40 倍。它采用 DAG(有向无环图)结构替代传统线性出块,让交易可以并行确认。

对开发者来说,这带来三个直接变化:

维度传统链(如以太坊主网)Monad
出块间隔~12 秒~300 毫秒
每秒区块数~0.08~210
交易确认体验等待数秒一个区块后回执就到
对机器人的意义策略按「秒」设计策略可以按「区块」逐块设计

jev-trader 的整个设计就是围绕「300ms 预算」展开的:AI 推理 + 一次读订单簿 + 一次发交易,全部要装进一个区块的时间窗里。项目文档专门有一节叫 The 300 ms budget,实测读订单簿 p50 延迟约 18ms,整个热循环 p50 约 100ms——剩下的时间都留给了 AI 推理。

项目结构速览:代码怎么和链对话

理解底层之前,先花 30 秒看一眼 jev-trader 是怎么组织「与链交互」这件事的,所有模块都在 src/ 目录下:

文件职责与区块链的接触点
src/config.ts环境变量与链参数固定 chainId 143、RPC 地址、gas 参数
src/chain.ts区块流WebSocket 订阅newHeads+ HTTP 轮询兜底
src/book.ts订单簿读取一次eth_call解码 Kuru 订单簿
src/market.ts下单与保证金手工编码batchUpdate交易、签名、发送
src/model.tsAI 决策层不碰链,只输出 buy/sell 概率
src/trader.ts主循环与盈亏记账把「读-判-发」串成一个区块一次
src/server.ts数据推送每区块一个 SSE 事件推到前端

一个值得新手注意的设计:每个区块只做两次 RPC 往返——一次eth_call读订单簿(走读节点),一次eth_sendRawTransaction发交易(走写节点)。热路径上没有任何多余调用,这是 300ms 预算能成立的前提。

区块怎么来:WebSocket 推送 + 轮询兜底

机器人要「每个区块都响应」,首先得及时知道新区块产生了。src/chain.ts 里的startBlockFeed做了双保险:

  • 主通道:通过 WebSocket 订阅newHeads事件,新区块一被提出(Proposed)立即推送,延迟最低;
  • 兜底通道:每 150ms 用 HTTP 轮询一次eth_blockNumber,即使 WebSocket 断了,主循环也不会停摆。

还有一个细节:如果同一时刻涌进来好几个区块头(比如网络卡顿后的补发),代码只取最新的那个执行一轮循环,永远不会为过期区块做决策——因为 300ms 后的市场早已变天。

WebSocket newHeads ──► 新区块号 ──► 合并去重(只留最新)──► onBlock(最新块) ▲ HTTP 轮询兜底 ──────┘

这种「事件驱动为主、轮询兜底为辅」的架构,是所有链上机器人项目的通用范式,值得记住。

Gas 机制:Monad 有一个不一样的计费规则

这是本文最重要的一个底层知识点。

传统 EVM 链按实际消耗的 gas收费;而Monad 按你声明的 gasLimit 收费——交易无论实际用了多少,费用 = gasLimit × gas 价格,花不完的也不退。

这对项目产生了几个具体影响:

  1. 永远不做逐块估算。eth_estimateGas一次就是一次额外的 RPC 往返,在热路径上是奢侈品。所以项目在 src/config.ts 里把 gasLimit 固定为350_000(启动时估算一次或写死),一次「撤单 + 挂单」实测约消耗 282k,留足余量即可。
  2. 用静态 EIP-1559 参数。Monad 的优先费固定为 2 gwei(eth_maxPriorityFeePerGas硬编码为 2),因此项目直接设一个静态上限maxFeeGwei: 400、优先费 2 gwei,实际成交价 = 基础费 + 2 gwei。高上限不会多花钱,省掉了每次查 gas 价格。
  3. 失败也要付费。交易回滚(reverted)同样按 limit 计费,所以项目把「回执确认」放在后续区块异步处理(见 src/trader.ts 的confirmPending),而不是等回执到了才继续下一个区块。

💡 新手提示:在 Monad 上写交易,心态要从「省着用 gas」切换成「把 gasLimit 当成门票价格」——门票贵一点没关系,但往返次数才是真正的成本。

交易怎么上链:手工编码一次 batchUpdate

下单发生在 src/market.ts。每个区块的动作是:撤销上一区块挂在订单簿上的旧单,同时在决策侧挂一张新的 post-only 限价单(报价在最优价内侧 1 个 tick,价差太窄时贴住最优价,保证不成交对手)。

「撤 + 挂」被打包进一笔batchUpdate交易,一次 RPC 往返完成。更硬核的一点:项目甚至没有依赖 SDK 编码交易数据,而是自己手工拼接 calldata,再用 scripts/dry-encode.ts 离线签名并断言与 SDK 产物逐字节一致——为的是把每一次编码都控制在最短路径上。

发送采用fire-and-forget(发了就走)模式:

  • 交易被节点接收,区块事件立即标记status: "sent";
  • 一到两个区块后,回执以独立事件到达,状态变为placed(拿到订单号)或reverted(市场跑过了报价);
  • 10 个区块还没回执则标记lost。

而成交(fill)不在自己的交易里——是别人的吃单方扫掉了自己挂着的单,成交记录通过eth_getLogs订阅 Trade 事件日志获得。读、写、结算三条信息流,全部复用同一套 RPC 通道。

AI 决策层:100ms 内回答「买或卖」

链下的一半在 src/model.ts。AI(TypeSafe 的 Jev 模型)每次收到一份紧凑的市场状态:中间价、价差、订单簿 Top5、多档深度、近 100 个区块(约 30 秒)的收益率与主动买卖流,然后只回答一个问题——约 30 秒后价格更高还是更低,并给出概率。

模型不带任何文本输出,直接返回带概率的结构化决策,延迟约 100ms。项目默认的mock模型是一个动量启发式替身,方便不接 API key 也能跑起完整流程(MODEL=jev才切换真实模型,见 src/model.ts)。

产品层面有个有趣的对比:Jev 推理一小时成本约 0.2 美元,而同样一小时在 Monad 上的 gas 约 2~5 美元——「AI 比 gas 还便宜」正是这个项目想展示的命题。

新手实战:三步跑起 jev-trader

不配置私钥时项目自动进入dry-run模式:真实的订单簿、真实的 AI 决策,成交在本地模拟——这是新手学习「每区块一个决策」架构最安全的方式。

  1. 安装依赖(项目使用 Bun 运行):

    bun install
  2. 启动(无需任何环境变量即可 dry-run):

    bun run start
  3. 看数据:默认 3000 端口提供三个接口(见 src/server.ts):

    接口内容
    GET /快照:模型、钱包、dryRun 状态、最新区块事件
    GET /history最近 1000 个区块事件
    GET /eventsSSE 流:连接即推快照,之后每区块一个事件,成交时追加 fill 事件

    打开/events用curl -N盯着看,你会看到事件以每秒 3 个的节奏滚动——那就是 Monad 的心跳。

想体验热路径性能,还有两个调试脚本:

bun run scripts/bench-read.ts # 订单簿读取 vs SDK:精确性与延迟对比 bun run scripts/dry-encode.ts # 离线签名买/卖单,断言 calldata 与 SDK 一致

前端看板在 web/src/ 下(Next.js),web/src/components/FlowChart/ 把区块事件流画成图,web/src/components/DecisionPanel/ 则展示每个区块的买卖概率条。

小结:理解 300ms,就理解了这类项目的一半

回看全文,Monad 的底层特性在 jev-trader 里处处有投影:

  • 300ms 出块→ 决策粒度就是区块,「读-判-发」必须装进一个区块;
  • gas 按 limit 计费→ 砍掉一切可省的 RPC 往返,gas 参数静态化;
  • WebSocket 即时推送 + 低延迟回执→ 事件驱动区块流,交易发了就走、回执异步对账。

对新手而言,这是一个非常适合作为「链上机器人第一课」的样本:代码总量不大,但区块流、RPC 热路径优化、on-chain 订单簿交互、AI 结构化输出这四条主线全部齐活。建议按 README.md 的事件字段说明,配合/history接口逐条对照阅读,比单看代码更快建立体感。

⚠️ 提示:本项目是实验性演示,资金规模很小,不构成任何投资建议。

【免费下载链接】jev-traderOne AI trade decision every Monad block. Jev on Kuru MON-USDC.项目地址: https://gitcode.com/gh_mirrors/je/jev-trader

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询