意图识别器

一个库. 把 feed 里的每一笔交易翻成「它想对 Pons 做什么」: 发币, 买, 卖, 或只是碰到. 办法只有两个: 解析 calldata, 用只读的 state 做计算. 认出什么给什么.

方案 2026-11-09, 最终版, 待动工. 全史数字来自 R2 段 0–108, facts .v1, 到块 108,999,999. 本页按方案正文复述.

727,029成功发币, 全史
81.9%买卖帧走固定读法
0.20%初筛漏放, 抽 4 段
µs热路径, 不跑合约

它站在哪

节点机把链折成 state, 推一份只读副本到 bot 那台机器. 识别器同时拿三样东西: 这一帧, 钉在块 A 的 state, 一份带版本的知识包. 交出去的是意图卡. chain 不改. facts 只多一张代理实现变更表.

节点排序器出块
→
chain不改
→
facts加 1 张代理表
→
state折到块 A
→
副本 @ A推到 bot 机, 只读
feed 帧要认的这笔
知识包读法, 带生效块
意图识别器拆帧, 解码 calldata, 用 state 计算. 一个库, 没有自己的进程.
意图卡只给碰到 Pons 的笔
bot / 策略打分, 狙击, 跟单, 卖出

runs/ 在宿主那边记两样: 录下的帧, 和每块的视野 (A, state 版本, 知识包版本, 洞, 叠加层起点). 意图本身不落盘, 有这两样就能逐位重算.

四样输入

输入是什么算不算链上数据
feed 帧排序器广播的一个 L2 块, 原样字节加到达时刻. 批作业也可以直接给拆好的块对象本身
state 视图 @A钉在 A 块的只读视图. 热路径唯一的链上数据是
知识包怎么读懂 calldata: 入口规则, 路由布局, 调用包表不是数据, 是读法
叠加层识别器自己刚认出的东西, 只在内存里用完就扔

对外一个函数: recognize(帧或块, StateView) → 意图块. 收 feed, 重连, 选路, 归宿主.

要不同的答案, 去不同的地方

要什么找谁多快
想做什么意图识别器, 读 feed微秒
做成了什么节点 WS 或 RPC等节点执行完
事实加折叠后的状态facts, state再晚零点几秒到一两秒, 待量
热路径不联网用户把「要事实可以去 RPC / WS / facts / state」和「识别器不做 RPC, 数据来源是 state」一起定了. 落成的边界是: 识别器只读 state 副本. 节点和 facts 留给别的组件, 以及离线对答案.

不做

不执行合约, 不预测成败和成交量, 不算储备, 税, 毕业, 不管毕业以后的 V4 池. 不改 state 或 facts, 不存意图, 不联网, 不读磁盘. 不判断人, 平台和方向. 不管 feed 的连接.

用户定的 15 条

#约束落在哪
1只识别意图, 不模拟成败卡上没有成交量, 没有成功与否
2纯解析, 或用状态计算第 4 步解码, 第 5 步计算
3不在本地跑 EVMcrate 不依赖执行器
4feed 解析封装在里面拆帧是第 1 步
5只看发币和曲线买卖毕业后的池子不认
6只读, 不改, 不做 RPCStateView 全是点查
7state 比 feed 晚, 是设计叠加层填 A 和 n 之间的空档
8结果给 bot, 可以不是链上事实依据写成解码 / 计算 / 扫到 / 暂定
9知道什么返回什么, 不追 100%不知道必须带原因
10只计算, 不做决定99% 的规则标暂定, 用不用由 bot 定
11名字 intent_recognizer, 意图不存runs/ 只记帧和视野
12自己算出的可以临时缓存叠加层, 不写 state
13只写需要的最终版方案不分版本
14facts 加代理表, 槽给 state, 布局离线学知识包和 state 那两节
15100% 标计算, 至少 99% 标暂定, 扫到的也出卡入口规则和意图卡
原话, 11-08 和 11-09

只识别意图, 不模拟这笔能不能成交, 成交多少, 发射成功没有. 靠纯解析或状态计算. 不为了 EVM 在本地再做一套 EVM. feed 的解析封装在这一层, 外部只看见 feed, 然后识别, 然后结果. 交易只关系曲线, 毕业后不关心.

永远不改数据和状态, 不做 RPC, 要绝对的快. state 比 feed 晚一点点是预期内的. 结果给 bot 和策略, 不一定是链上事实. 能识别多少识别多少. 识别器没有任何主观, 只计算, 交给 bot.

入口规则在 state 外面, 带截止块和生效块, 意图不存. 临时缓存不改 state. 不写第一版第二版. facts 连 beacon 换实现一起记. state 留入口写过的槽的最新值, 调用包合约的槽不留. 全史 100% 的规则标计算, 成立至少 99% 的标暂定.

一笔怎么走

一条 feed 消息是一个 L2 块. 拆帧按块顺序做. 身份, 初筛, 解码按笔并行. 状态计算必须按块内顺序走, 因为前面认出的新币要给后面的买单用. 点一步看它的规则. 虚线那步是: 算出新币之后, 同块后面再筛一遍.

3 初筛: 过任意一条就往下

条件为什么有它
to 是认得的地址协议合约, 还在曲线上的币和曲线, 知识包里的入口 / 路由 / 调用包, 发过币的入口 (发币次数 > 0), 叠加层里的新币
calldata 任意偏移含发币选择器launchToken, 带免税的 launchToken, launchAndBuy, executeAtomicLaunchV2
任意偏移含还在曲线上的币或曲线先比 4 字节前缀, 再比 20 字节
任意偏移含协议合约地址协议 owner 是 Safe 多签, 改参数的交易 to 是 Safe, 只能靠这条看见
长得像直调曲线buy / sell 选择器, 输入 100 字节, 即使 to 还没登记

任意字节偏移, 不要求 32 字节对齐. facts 量过, 任意偏移比对齐多认 53% 的「提到」(实证 11-04, 段 104, 失败交易口径). 误放的代价是一次签名人恢复加一次解码.

抽 4 段看到的数分母
过筛14.2%段 40 / 70 / 95 / 108, 共 3,431 万笔, 占 Pons 时代 82 段的 4.9%
过筛的笔里和 Pons 相关78.0%过筛的笔
误放里 to 本来就认得88.5 万 / 106.8 万误放的笔
有边界帧却没过筛1,693 / 834,165 = 0.20%to 集中在 0xad1a0f, 0x5b8e11, 0x1f9798

本课题 19, 11-09. 工厂和 hook 的 owner 都是 0x263ed295, Safe 门槛 2 / 3 (本课题 10).

第二遍第 5 步每认出一个新币, 就拿它的曲线和币地址, 把同块后面, 第一遍没过的笔再扫一遍. 同一套扫描代码. 窗口里 62 个发币, 同块排在后面的成功买卖是 0 笔, 下一块 1 笔 (本课题 11). 留下是因为 dev 自家捆绑钱包会用这个形.

五步各自交出什么

步顺序写出什么
1 拆帧一块接一块块号, 时间, 交易列表, 重发 / 重组 / 洞
2 身份哈希每笔都算; 签名人只给过筛的tx hash, feed_index, 签名人, 7702 授权列表
3 初筛第一遍每笔并行过了才往下
4 解码过筛的笔声明的调用, 以及扫到的命中
5 计算块内顺序目标, 地址, dev, 指纹, 免税, 新的叠加层条目

发币

解码先把发币调用解出来. 计算再定 dev, 算出曲线和币的地址, 核对经济指纹, 补上实际免税名单. 一笔里有几个发币, 就出几个意图, 按 calldata 顺序. to 是发过币的入口, 却解不出发币调用, 就出「碰到 (发币入口)」, 参数留空.

认哪些函数

调用选择器dev
工厂 launchTokenf35abbcf调用者
launchToken + 免税a72101af调用者
launchTokenFord6a0eef5参数 originalDeployer, 只许 forwarder 调
forwarder launchAndBuyf85f8e41forwarder 的调用者
第三方入口executeAtomicLaunchV2 等按入口规则. 没有规则则不知道

解出来的字段: 名字, 符号, logo, 描述, 社交 5 项, 收税人, 创作者税, 回购开关, 经济指纹, salt, 配置号, 配对币, 首买 (投入, 最少拿回, 收款人), 声明的免税名单.

全史 727,029 笔成功发币

直调 622,660 · 85.6%
第三方入口 68,561 · 9.4%
7702 自调 30,261 · 4.2%
调用包 5,547 · 0.8%

块 27,027,321–108,998,003. 本课题 17, 11-09. 环心是笔数.

四条路径

路径笔占dev参数能扫到毕业率
直调工厂或 forwarder622,66085.6%签名人, 100%100%1.2%
第三方入口68,5619.4%入口规则83.2%2.9%
7702 自调30,2614.2%签名人 99.1%95.3%3.3%
调用包5,5470.8%调用包表90–100%0–2.0%

毕业率只用选择段, 2026-10-21 00:00 UTC (块 93,848,723) 以前. 非直调的毕业率是直调的 2–3 倍. 调用包里 Multicall3 有 5,096 笔, 4337 EntryPoint 有 451 笔. 「参数能扫到」= calldata 里找得到发币选择器, 而且 TokenParams.salt 原样出现.

入口规则的召回

纵轴是门槛, 条长是 10-21 以后的召回. 两档都是 0 错. 本课题 20.

只收 100%
40.8%
也收 ≥ 99%
86.2%

按天前推, Δ = 1 天, V = 7 天, 只在 9-21 到 10-20 选规则, 10-21 以后报一次. 卡召回的是「必须全史 100%」, 样本门槛几乎不起作用. 所以 100% 标计算, ≥ 99% 也收, 标暂定.

调用包里, 子调用的调用者

调用包子调用的调用者
顶层直调签名人
7702 自调, 账户直接调工厂或 forwarder签名人. 这种发币里 dev = 签名人占 99.1%
7702 自调, 又经别的合约发币那个合约, 再按入口规则. 剩下 0.9%
Multicall3Multicall3 自己. 现生产就是 tx_to, 全史 99.9%
ERC-4337 handleOpsuserOp.sender. 展开两层: EntryPoint, 账户 execute, 工厂
ERC-7821 / execute / executeBatch账户或合约自己
0x AllowanceHolder.execAllowanceHolder 自己

dev 规则是封闭的几种形

识别器只会算这几种. 不按字节偏移去抠变长字符串后面的地址.

形识别器怎么算
签名人, tx.to交易本身
解出的发币调用里的字段收税人, 免税名单第 k 个. 按字段名取
calldata 固定偏移只给定长的 calldata
常量地址这一组的 dev 恒为同一个合约
CREATE(入口, nonce + j)state 的入口 nonce, 加上叠加层里的次数
本笔 CREATE2 出来的 dev, 不拿公式算第三方入口里有 53,391 笔, dev 是本笔 CREATE2 出的新合约, 主入口是 0xb2a7, 0x6319, 0xe47e. salt 不在 calldata 里, 也不是入口槽的 0 或计数值. 这三个入口内嵌的都是 forwarder launchAndBuy, dev 恒是解出的免税名单第 1 个: 0xb2a7 为 99.99%, 0xe47e 为 100%, 0x6319 为 99.38%. 0x6319 有 0.60% 照读会错, 0.02% 没有免税名单. 所以按「解出的字段」收, 标暂定. 本课题 21 和 22.

非直调有 11,499 个入口组 (tx.to, 选择器), 其中 9,442 个一辈子只发过 1 次币. 它发币的当时, 知识包里不可能有它. dev = 不知道 (入口没规则), 发币卡照出, 其余字段照给. 当天要补, 就手工往知识包加一行, 只加不改. 离线学到的规则进下一版.

地址公式

步公式
收税人TokenParams.creatorFeeRecipient. 零地址就用 dev
salt'keccak(abi.encode(dev, TokenParams.salt))
曲线CREATE2(LaunchDeployer, salt', keccak(曲线创建代码 ‖ 16 个参数))
币CREATE2(LaunchDeployer, salt', keccak(币创建代码 ‖ abi.encode(名字, 符号, logo, 描述, 社交, dev, 曲线, 工厂, 发行量)))

曲线创建代码 11,480 字节, 币创建代码 7,178 字节. keccak 必须等于 facts_decode 常量里的哈希. 工厂, LaunchDeployer, hook, 托管, 回购库是 immutable 或只能设一次.

输入来自
TokenParams, 配置号, 配对币calldata, 解码
dev上面的规则. 用到叠加层就标暂定
发行量, 曲线费, ETH 盘的虚拟储备和毕业线state: LaunchConfig[配置号]
ERC-20 盘的虚拟储备和毕业线state: 配对币参数[配对币]
费策略 5 项协议收费地址, 分成, 回购销毁, hook 费, 最大冲击
forwarderstate. 全史只设过 1 次
工厂, LaunchDeployer, hook, 托管, 回购库, 两份创建代码facts_decode 的常量

经济指纹

expectedEconomics 非零时, 工厂会用当时的参数算一个摘要, 不等就 revert. 摘要盖 10 项: 虚拟储备, 毕业线, 发行量, 曲线费, 池费, tick 间距, 费策略的 4 个 bps. 协议收费地址不在摘要里. tick 间距按 int256 编码, 负数要补码.

比对卡上怎么写
对上这 10 项和 state@A 一致
对不上地址标暂定. state 晚了, 或这笔会失败
没写指纹字段标没写

最近 80 个发币都带指纹, 重算 80 / 80 对上. ETH 盘 65, ERC-20 盘 15 (本课题 08). 其中 79 个 dev = 签名人就算对 (forwarder 71, 工厂直调 8), 剩下 1 个经 0x6319, dev 等于 creatorFeeRecipient. 三种 ERC-20 配对币都不是 USDG.

实际免税名单

狙击要知道谁不交狙击税. 依据 = 计算.

谁加的加什么
calldata声明的名单
工厂自动加 dev 和收税人
forwarder自动加首买收款人

协议参数改得有多勤

参数全史
LaunchConfig只加过 1 次, 没改过
配对币参数改过 98 次, 37 个块, 最近块 100,393,945
协议收费地址改过 2 次
hook 的 4 个 bps没改过
forwarder只设过 1 次

本课题 09. 空档里真改参数是稀有事件, 所以指纹对不上时把地址标暂定, 而不是停掉整条流水线. 最近 80 笔的块范围是 109,612,091–109,712,091.

曲线上的买卖

全史成功的曲线边界帧 33,950,072 个, ETH 盘 735,350 ETH. 另有失败帧 2,751,983 个, 只计笔. 前五档是固定读法, 合计 81.9% 的帧, 82.3% 的 ETH. 接不住的出扫到, 定长布局, 或「碰到」. 方向猜不出来就不猜.

占成功帧占 ETH 盘金额

横条是百分比. 各档 ETH 相加是 735,349, 与合计 735,350 差 1, 是四舍五入. 来源: 本课题 18, 11-09. 先中先算.

档帧占帧ETH占 ETH
直调曲线12,423,84036.6%357,09948.6%
forwarder 发币首买394,7901.2%24,9813.4%
现生产已有解码的路由 (10 个)13,547,20939.9%194,98326.5%
调用包639,5531.9%8,1031.1%
7702 自调784,3702.3%19,8422.7%
兜底扫到740,7892.2%13,6181.9%
定长候选2,494,1527.3%66,3169.0%
碰到2,769,2468.2%47,3226.4%
什么都没提到156,1230.5%3,0850.4%

每种形态交出什么

形态认法参数
直调曲线buy 59a87bc1 / sell d04c6983方向, 投入, 最少拿回, 收款人. 输入 100 字节
发币带首买launchAndBuy 里的首买同上. 目标 = 本卡的发币
经路由知识包里的布局方向, 外层投入, 最少拿回, 收款人. 跟单另给「跟的是谁」
捆绑买布局 bundle-buy每个收款人一个买, 同一条曲线
调用包里展开后再认每个打到 Pons 的调用一个意图
兜底扫到解码的第二刀买或卖, 依据 = 扫到
认不出提到币或曲线, 或 approve / transfer / transferFrom碰到. 方向 = 不知道

已知路由的份额在掉

占成功帧的百分比, 方案给的约数, 不是逐段曲线. 本课题 18.

早期 · 已知路由
50%
近 10 段 · 已知路由
23%
早期 · 兜底+定长
7%
近 10 段 · 兜底+定长
25%
先补谁碰到档的 ETH 有 54% (25,394 ETH, 140 万帧) 在同一个选择器 39ecce49 上, 分布在 28 个合约. 很可能是同一份码部署了多份. 知识包可以按 (码哈希, 选择器) 挂一行. 码哈希还没核.

目标, 金额, 人, 各给各的

字段规则
目标曲线地址先查叠加层 (空档里的, 本块前面的, 本卡前面的), 再查 state 币记录. 都没有: 目标 = 没登记, 地址照给, 卡照出
外层投入签名人在外层写的数. 路由会先抽成. 布局声明了换算, 才另给「进曲线投入」
三个人都给收款人, 签名人, 边界调用者. 路由会替人收款, 也会替人卖. 4337 / 7702 真正的人是边界调用者
方向只从布局或选择器读. 不从 value 猜

直调曲线的形状, 当时 to 还没登记的有 10,351 笔 (抽 4 段). 其中 79% 的 to 后来登记成了 Pons 曲线, 是发币前就往算好的地址打的抢跑单. 21% 从来不是 Pons. 所以没登记的也出卡. 调用包和 7702 自调里, 97–99% 的帧 calldata 提到了曲线或币.

0xd6d35b56 的定长布局

最近窗口 (块 109,637,351–109,717,351, 2,578 笔) 里, 「布局不认识」的 895 笔集中在 86 个 (to, 选择器) 上, 头号 1 个占这一档 ETH 的 68.4%. 这个合约的 calldata 定长 484 字节.

第 240 字节 = 卖
第 272 字节 = 买
第 304 字节 = 曲线

374 / 374 笔都成立 (本课题 12). 它的 169 笔买单 value 全是 0, 按 value 猜方向会全错 (本课题 06). 按 (to, 选择器, 方向) 分组, 每组至少 5 笔, 位置都固定的, 占这一档 56.1% 的笔, 71.9% 的 ETH. 每组至少 3 笔则是 59.9% 和 77.2%. 金额和收款人的位置还没对 chain.calls, 留在待量.

三份记忆

查一个地址只有一个顺序: 先叠加层, 再 state. 知识包不参加这个查找, 它只管「这段字节怎么读」.

叠加层按 (块, 笔, 序) 排. 空档从哪来: chain 每 250 毫秒问一次链头, 存档每秒落盘, facts 才往下走, 再加上 trace, 解码, 折叠, 跨机推送. 完整分布是待量.

state @ A链上已经折完的. 只读, 点查大约 0.4 微秒. 依据标计算.
叠加层A 之后自己认出的. 内存里 KB 级, 不落盘. 依据标暂定.
知识包读法. 带生效块. 换版是原子替换, 不在一块中间换.

叠加层里记什么

条目拿来干什么
认出的新币曲线, 币, 配对币, 地址依据. 后面的买卖认得出它. 初筛的地址表里也有它
每个入口发了几次币计数 = state@A 的真值 + 叠加层里的次数 × 步长
每个入口被碰过to 是它, 或 calldata 提到它. 用到这个入口的字段标暂定, 因为没认出的调用一样会动 nonce
改参数的调用初筛提到协议地址, 又扫到改参数选择器. 之后的发币地址标暂定
洞feed 缺的块号区间. 依赖叠加层的字段标暂定

什么时候截, 什么时候停用

情形怎么办
state 折过块 b拿 b 的发币预测和 state 里块 b 新登记的币对一遍, 然后截掉 ≤ b 的条目
重组截掉 ≥ 该块的条目, 重认
state 超前, A ≥ 正在认的块状态计算的字段一律「不知道 (state 已过这块)」, 不进叠加层
A 倒退, 或程序重启清空, 只重放 A 之后的录帧. 缺的那段记成洞. 重启点记进 runs/
空档超过 K 块状态计算的字段一律「不知道 (空档太大)」. 解码出的字段照给. K 还没量
叠加层不会把对的改成错的里面的发币其实失败了: 后面认成「买 X, 暂定」. 意图本身没错, state 追上来一对就作废. 地址算错了: 真实曲线上的买单对不上, 退回「目标没登记」.

知识包的一行

知识包相当于现在 rl 里那两张对照表放大以后的样子: 4 行入口白名单, 加 8 行路由「这个地址用哪种读法」. 拆 calldata 的函数还是代码, 不在包里.

内容键值
入口规则入口, 进入口那一层的选择器, 内嵌的发币函数, 绑的实现dev 用哪一种封闭规则, 加上成绩 (成立比例, 样本数)
路由布局地址或码哈希, 选择器, 绑的实现人写的读法名, 或学出的定长布局
调用包表选择器 + 形状怎么展开, 子调用的调用者是谁
手工行同上可以加, 不能改. 带来源「手工」和日期

定长布局是一组偏移: 目标在第几字节, 方向是常量还是「目标在哪个偏移」(最多 2 种位置), 投入在第几个字或就是 value, 最少拿回在第几个字, 收款人在第几个字.

学什么门槛依据
入口规则选择段 ≥ 1 笔, 验证段 ≥ 2 笔, 全部样本 100%计算
入口规则同样的样本门槛, 成立 ≥ 99% 但不到 100%暂定. 卡上带成绩
定长布局的目标和方向选择段 ≥ 1 笔, 100%. 只用一笔一个曲线边界帧的交易解码
定长布局的收款人选择段 ≥ 20 笔, 100%解码

学入口规则时, 对每一组拿发币调用的调用者, TokenParams, 免税名单, 曲线真值 (facts launch_calls), 加上那一层调用的入参 (chain.calls), nonce (contract_births), 槽 (state 的入口槽), 去试那五种形. 定长布局 m = 1 时目标和方向召回 52.5%, 24 万笔错 1. 收款人偏移要 m = 20 才 0 错, 召回大约 15% (本课题 20). 金额和最少拿回还没对 chain.calls.

版本字段含义
sha256这一版的内容
截止 T学它时用到的最后一块
生效 ET + Δ. Δ 写在包里, 构建时就定
实盘用 E ≤ 当前块的最新版
重放第 b 块只用 E ≤ b 的版本. runs/ 记下这一块实际用的版本

历史版本用 facts / chain 全史按天前推, 和实盘同一个构建程序. 人写的读法 (okx-dag, axiom 命令串, 调用包展开, 捆绑, 跟单平台) 是识别器里的代码. 新读法改代码, 离线核过才登记. 哪个地址用哪种读法是数据行. 不放进知识包的常量: 创建代码, 选择器, 工厂的 immutable 布线, 都在 facts_decode.

为什么每一行都要绑实现

点名的 13 个路由, 入口, 头号未知合约里, 7 个是 EIP-1967 可升级代理. 代理升级只换实现, 代理自己的码不变. 不绑实现, 布局一变就会照老布局静默读错, 还标成解码. 每一行绑核过的那份「真正跑的实现」: 代理绑实现地址和码哈希, 7702 绑委托目标, 1167 克隆绑实现. 实现对不上时照旧读, 标暂定. 离线复核过了再加新行.

横条是全史升级次数. 最近一次: GMGN 块 107,557,685, APM 块 108,412,591. 本课题 10, 11-09.

facts 只加一张表: 代理实现变更

类记什么从哪来
代理换实现 / 换 beacon全链每次写 EIP-1967 实现槽或 beacon 槽: 位置, 代理地址, 哪个槽, 旧值, 新值facts 判成员时已经在扫这两个槽. 新表把扫到的全部留下
beacon 换实现位置, beacon 地址, 旧实现, 新实现实现存在 beacon 自己的存储里. 用 Upgraded 事件, 或代理调用时问 beacon 的回包. 动工时再定哪一种

当过 Pons 相关交易 to 的 beacon 型代理有 36,944 个, 11.2 万笔, 其中 28 个是发币入口. 背后 91 个 beacon 有 83 个换过实现. 0xa125 一个 beacon 管 36,102 个代理, 换过 3 次. beacon 一换, 这些代理跑的码一起变, 代理自己的槽一个字节都不动. 全链 beacon 型代理 44.6 万个. 按事件数, 不发事件的会漏. chain 本身不改: 全块 calldata, 每一帧的调用者和入参, 全链存储改动都已经有了.

state 要留的记录

都从 facts 折. 不为识别器单开一层. 识别器只读其中几个字段.

记录字段从 facts 哪来
协议参数 · 配置号发行量, 曲线费, 虚拟储备, 毕业线, 池费, tick 间距工厂存储槽. 池费和 tick 间距在一个打包槽里, 要拆位. setting_changes 只带配置号, 不带值
协议参数 · 配对币虚拟储备, 毕业线, 小数位PairTokenEconomicsUpdated
协议参数 · 当前费策略 5 项, forwarderhook 的 5 种事件 + 初值槽; LaunchForwarderSet
入口nonce; 每个槽的最新值 (知道 / 全史为零 / 不知道); 发过几次币transactions, contract_births, eip7702; member_storage_changes, launch_entry_reads; launch_calls
币币 ↔ 曲线, 配对币, 发币块, 阶段 (曲线上 / 已毕业)launch_calls, pool_graduations. 键是币, 另有曲线索引
真正跑的码码哈希, 实现地址. beacon 型代理 = 它的 beacon 当前的实现新的代理表 + contract_births + eip7702_authorizations
水位A, state 版本折叠进度

入口槽全部 816 万行, 大约 750 MB, 其中 EntryPoint 三个版本 568 万行, 占 70%. 调用包合约的槽不留, 因为展开它们用调用包表, 不读它们的槽. 去掉以后大约 248 万行 (本课题 16). 入成员以前的槽值从发币笔里补, 没见过 = 不知道. nonce 和 facts 的核对用同一套规则.

不留: 地址 nonce (交易里自带), 余额, 持仓, 曲线和币的原始槽, 合约代码本身. 块头只在上一帧是洞时当时间兜底.

StateView, 全是点查

block() 返回 A. version() 返回折叠代码版本, 或 A 处的 state 哈希.

launch_config(配置号), pair_economics(配对币), fee_policy(), forwarder().

entry(入口) 返回 nonce, 每个槽的知道 / 全史为零 / 不知道, 发币次数.

running_code(地址) 返回码哈希和实现地址. coin_by_address(曲线或币).

block_timestamp() 只当上一帧是洞时的时间兜底.

批作业里, state 的折叠代码当库用, 按块推进到任意 A, 给出同一个接口. 三种重放都要它. 0.4 微秒来自 10-20 的节点机原型, 已超过 14 天, 动工前复测.

意图卡的数据结构

每个字段是二选一. 知道, 就给值和依据: 解码, 计算, 扫到, 或者暂定加原因. 不知道, 就给原因. 每个字段只有一个产出者, 所以没有「两边不一致」要裁决.

归解码行为, 参数, 边界调用者, 怎么认出的.
归状态计算目标, 曲线和币的地址, 按规则算出的 dev, 指纹结论, 实际免税, 入口计数.
字段含义
块号, 块 hash, 时间, 帧头种类, 到达时刻这一帧是谁
作废 ≥ b重组时才有. 告诉宿主从哪一块开始旧卡无效
视野A, state 版本, 空档块数, 洞, 叠加层起点
知识包版本, 识别器代码版本重放要钉死的两样
意图卡[]只含碰到 Pons 的交易, 按块内序
计数交易数, 拆不开的, 第一遍过筛, 第二遍过筛, 出卡数

两张例子

签名人 0xAAAA 调 forwarder 的 launchAndBuy. 一张卡, 两个意图.

字段值依据产出者
0 行为发币解码解码
0 dev签名人解码. forwarder 的调用者解码
0 名字, 符号, 配对币, salt, 首买calldata 里的 TokenParams解码解码
0 曲线, 币CREATE2 算出来计算, 指纹对上计算
0 实际免税声明的 + dev + 收税人 + 首买收款人计算计算
1 行为买解码解码
1 目标本卡意图 0 的新币叠加层 @本卡 0, 暂定计算
1 投入, 最少拿回, 收款人首买参数解码解码

买的目标来自本卡前面刚算出的发币, 所以标暂定, 直到 state 折到这块并登记了这个币.

怎么知道它对

真值按字段写出处. 投入不去比 facts 里的 curve_buys: 那一列是实际花掉的钱, 曲线快毕业时会截量, 少于请求的投入. 配对键是 (tx hash, 曲线, 方向, 第几次).

意图字段真值怎么比
发币的 TokenParams, 配置号, 配对币, dev, 曲线, 币facts launch_calls. 成败都收. 成功的才有 deployer, 曲线, 币逐字段相等
forwarder 首买的投入和收款人launch_calls 里 forwarder 的那几列相等
直调, 调用包里, 兜底扫到的曲线调用chain.calls 里 to = 曲线, 选择器 buy / sell 那一帧的入参和 from. 成败都有投入, 最少拿回, 收款人, 调用者逐字段相等
路由腿的目标, 方向, 收款人, 进曲线投入同一笔里对应的曲线边界帧按 (曲线, 方向, 第几次) 配对. 进曲线投入要布局声明了才比
路由腿的外层投入, 最少拿回没有独立真值, 它就是 calldata 本身只核位置真的存在, 而且解得开
碰到failed_transaction_mentions, token_approvals, token_transfers只量漏了多少
实际花掉的, 换出, 退款不是意图不比

三种重放

重放知识包A 取什么要求
审计runs/ 记的每块实际版本runs/ 记的 A, 连同 state 版本, 叠加层起点, 重启点和实盘逐位一致
研究每块用 E ≤ b 的历史版本有录帧用录下的视野. 没录帧的历史按空档分布取 A. 分布还没量不偷看. 字段口径和实盘一样
验收任一版. 查代码, 不查外推全视野, A = 正在认的块减 1依据为解码或计算的字段, 和真值的差必须是 0

差不是 0, 就是解码, 规则或折叠的 bug. 「扫到」和「暂定」不要求差为 0, 只报出错率. 一条规则能不能外推, 只看截止块 T 之后的块. 叠加层是逐块累积的, 重放第 b 块必须从录帧起点或重启点顺序跑到 b, 不能单块跑. runs/ 每块记: 录帧, A, state 版本, 知识包版本, 洞, 叠加层起点, 重启点. 意图本身不存.

bot 那台机器没有 facts 时

state 折过块 b, 就拿 b 的发币意图和 state 里块 b 新登记的币对一遍. 三种结果: 对上; 意图有, state 没有 (发币失败或算错); state 有, 意图没有 (漏认).

宿主状态页上的计数

计数看什么
空档块数分布, 洞state 晚多少
拆不开的帧坏了多少
两遍初筛各过几笔第二遍是不是在干活
碰到的占比知识包该补谁
实现换了的笔数代理升级后旧行还在被用
每块耗时 p50 / p99 / 最大要不要开并行

验收指标

指标口径
召回按行为, 同时按笔和按金额
精确声称的意图在真值里有对应边界帧的比例
发币地址准确率验收时, 依据为解码或计算的必须 100%
碰到的金额按 (to, 选择器) 排, 就是知识包下一步该补的清单
暂定字段的出错率按暂定原因分. 「规则不是全史 100%」单独报
没登记目标的噪声率现在 21% 从来不是 Pons
兜底扫到的精确率现在方向 + 收款人对上 80.2%, 对不上 3.0%
每块耗时典型块和忙块

性能, 代码, 还没量的

单价, 微秒

哈希取 0.6–0.7 的中点, 输入大约 500 字节. 发币地址是两次 keccak, 创建代码前缀预先算好; 不预先算是 26 微秒. 签名人只给过初筛的笔. 本机 M1 Max, 合成输入, 11-09 跑了两次 (本课题 07). state 点查是 10-20 原型, 超 14 天, 动工前复测.

一块大概多久

块估计
典型大约 0.1 毫秒. 段 104 是 6,416,697 笔 / 100 万块, 约 6–8 笔. 全链 14.2% 过初筛, 大约 1 笔往下走
忙亚毫秒. 窗口里成功的曲线买卖最多 61 条 / 块

这两格是推断, 等 crate 出来换掉. 并行只在过筛笔数多的块开. 超大 calldata 设扫描上限, 超了这笔标「扫描截断」, 不拖后面的笔. 热路径不联网, 不读盘, 不分配大块内存. 知识包换版是原子替换.

crate 里每个文件

platforms/robinhood-chain/crates/intent_recognizer/. 依赖 facts_decode 的协议常量, sha3, secp256k1, serde. 不依赖网络库, 不执行合约.

文件职责
lib.rsRecognizer::new(知识包). recognize(帧或块, StateView) 返回意图块
chain/链常量与块环境: chain id, 序号到块号的偏移, 帧头字段, 时间钳位
feed/拆帧, 重发 / 重组 / 洞, 交易 RLP, 签名人恢复
screen.rs初筛两遍: 地址前缀表, 发币选择器, 协议地址, 直调曲线形状
decode/边界 ABI, 调用包读法, 人写的路由读法, 定长布局求值, 任意偏移扫描和字节区间去重
compute/定目标, CREATE2, 入口规则求值, 经济指纹, 实际免税
overlay.rs叠加层: 空档加本块, 截断, 重启
knowledge/知识包格式, 校验, 按生效块选版本, 实现绑定核对
intent.rs意图块, 意图卡, 意图, 知道 / 不知道 / 暂定
view.rsStateView

谁跑它

谁做什么
宿主 = bot 进程收 feed, 给钉在 A 的 state 视图, 装知识包, 每块调 recognize, 把录帧和视野记进 runs/
每个 bot 进程自己跑一份. 它本来就持有 state 副本. 识别和打分读同一个 A
批作业三种重放, 学规则和定长布局, 按天前推历史版本. 训练和回测用同一份代码重算

和现在的 rl 怎么接

复制四块已经在生产跑过的逻辑当起点, 不 import: 帧, RLP, 签名人, 帧序; 发币扫描和 CREATE2; 路由, 捆绑, 跟单解码. 要改三处: 费策略从 state 读 (现生产写死的历史表, 块 47,259,464 以前取的收费地址是错的); 输出改成意图卡; 类型换成这个工作区自己的.

验收时拿同一份录帧, 只比块 47,259,464 以后. 新识别器的发币 (曲线, 币, dev) 要和现生产逐笔相同.

五步建造

步做什么依赖
1facts 加代理实现变更表, 1967 两个槽加 beacon 换实现, 补全史只要现有 chain / facts
2crate: 拆帧到意图卡, 外加知识包格式. 同一份录帧上, 发币和现生产逐笔相同不等 state 引擎
3state 先折识别器要的几类: 协议参数, 入口, 币, 真正跑的码state 本来就要这些
4学规则和定长布局, 按天前推历史版本, 三种重放跑全史, 再补人写的读法步 1 的表补完
5进 bot. 每块调用, 录帧和视野进 runs/, 在线健康. 和现生产并行对拍步 2 和步 3

还没量, 不影响这个形状

编号量什么定什么什么时候
5实盘空档分布, 暂定字段的出错率K, 研究重放用的空档分布, Δstate 折叠和推送建好
6bot 机器上每块耗时, 两遍各过几笔, 大 calldata 的扫描耗时并行门槛, 扫描上限步 2 的 crate
3′不发事件就写 beacon 槽的代理, beacon 换实现走哪条路取新表 beacon 那一类怎么取动工步 1
2′布局的金额和最少拿回位置, 按绑的实现分组以后的召回定长布局里这两项收不收步 1 的表补完全史
8′误放的「to 认得」是哪些 to, 漏放的 3 个 to 是什么合约初筛要不要收紧, 知识包补谁现在就能做

以后加东西, 动哪里

扩展改什么不动什么
RH 上别的发币平台加一个平台模块: 边界 ABI, 地址算法, 改参数选择器. 再加 facts 新库和 state 新记录. 意图, 目标, 知识包行都带平台拆帧, 身份, 初筛, 调用包和路由展开, 叠加层, 知识包机制, 意图卡的形状
跟单不改识别器. 跟单读卡上的签名人, 边界调用者, 收款人, 以及「跟的是谁」全部
别的 Nitro 链换 chain/ 的常量, 含序号偏移. 知识包按链各一份其余全部