记录一次 Hyperliquid sm_account 链上-DB 漂移告警复盘(2026-09-13)
记录一次 Hyperliquid sm_account 链上-DB 漂移告警复盘(2026-09-13)
数据新鲜不代表没脱钩,drift 3502.97% 说明链上权益和 DB 基线已经差了约 36 倍,先确认是不是预期回撤,再决定重置。
9 月 13 号晚上我又盯上了 craw_app1_wz 项目里的 Hyperliquid smart_money 账户,担心 testnet 重置再把 sm_account 的基线和链上搞脱钩,于是让助手跑了一次只读检查。结果直接触发 ALERT,而且漂移幅度远超阈值,又是一次典型的 reset 脱钩。
一、为什么跑这次检查
这个 sm_account 基线脱钩已经不是第一次出现了。之前 09-05、09-06、09-08、09-11 都出现过类似模式:DB 里的基线没跟着链上权益更新,testnet 一重置,两边就错开一大截。所以当天我特意安排了一次例行防脱钩检查,目的就是看基线有没有再次和链上脱开。
检查脚本是 _sm_sanity_check.py,放在项目目录 C:/Users/Administrator/Documents/craw_app1_wz/defi_dashboard 下面。我让助手必须用 Bash 工具执行,并且打开 dangerouslyDisableSandbox=true,因为脚本要访问 Hyperliquid testnet 的外网接口,普通沙箱环境出不去。
二、执行流程与只读约束
当天跑检查的流程我在指令里写得很死,防止误操作:
- 先
cd到项目目录:cd "C:/Users/Administrator/Documents/craw_app1_wz/defi_dashboard" - 用 anaconda 的 Python 运行检查脚本:
C:/ProgramData/anaconda3/python.exe -u _sm_sanity_check.py - 脚本会打印一行
[时间] OK chain=... db=... drift=...%或者[时间] ALERT ...,退出码 0 表示正常,1 表示漂移超过 5% 阈值。 - 如果输出含
ALERT或退出码为 1,就立刻用简洁消息通知我,附上 chain/db/drift 具体数字,并提示疑似 testnet reset 脱钩、需要重置sm_account基线。 - 如果输出含
OK,就不用打扰我,只在自动化结果里简短确认。
还有一个硬性约束:不要修改任何文件或数据库,只运行检查并报告。 这次从头到尾都是只读操作,没有动过任何一张表、任何一个字段。
三、告警输出和关键数字
助手执行完脚本后,直接返回了一条红色告警,核心数字如下:
- 链上真实权益:
278.8250 - DB 基线和:
10045.9839(current + open_margin=0.00) - **漂移 drift = 3502.97%**(阈值 5.0%,远超)
- DB 更新时间:2026-09-13T20:41:57,距执行约 7 分钟前,数据新鲜非陈旧
看到这个输出,我第一反应是“数据是不是旧了”,因为以前有过缓存陈旧导致误报的情况。但助手专门确认了 DB 更新时间是 20:41:57,距离执行只过了大约 7 分钟,说明不是陈旧数据,而是真的漂了。
按脚本规则,ALERT 对应退出码 1,也就是漂移已经超过 5% 阈值。这次实际漂移 3502.97%,阈值只有 5%,差得不是一点半点,完全不在一个量级上。
四、脱钩模式与历史对照
助手给出的判定很明确:疑似 testnet reset 再次导致 sm_account 基线与链上脱钩——DB 仍停在 legacy 名义基线 ~10046,而链上真实权益已跌到 ~279(差约 36 倍)。 这和 09-05、09-06、09-08、09-11 的脱钩模式一致。
当时我盯着这两个数字看了一会儿:DB 基线和是 10045.9839,链上真实权益是 278.8250,用 10045.9839 除以 278.8250,恰好就是约 36 倍。这说明 DB 里的基线根本没跟着链上走,还停在上一个 legacy 名义基线附近,而链上真实权益已经因为 testnet reset 掉到了两百多。
这里要特别留意的是“数据新鲜”这个点。以前遇到漂移告警,第一反应可能是“是不是同步延迟了”,但这次 DB 更新时间只比执行早 7 分钟,几乎可以排除同步延迟。也就是说,这个 drift 是真的反映了两边账本已经脱节,不是临时缓存导致。
五、处置建议与待确认点
按照我事前定的规则,告警触发后助手要给处置建议。助手给出的建议是执行基线重置脚本:
1 | C:/ProgramData/anaconda3/python.exe -u wb_runs/archive/_reset_sm_account.py --apply |
但在执行重置之前,有一个关键决策点必须先确认:当前链上的 ~278.83 到底是不是预期的实盘状态。 如果这 278.83 是真实回撤造成的,那贸然重置基线就会把回撤掩盖掉,等于用 reset 来粉饰亏损;如果它是 testnet 重置造成的非正常归零或缩水,那重置基线才是正确操作。
这个判断不能靠脚本自动做,必须人工确认。所以我当天没有让助手直接执行 --apply,只是记录了重置脚本的路径和参数,等确认清楚链上权益来源后再动手。
六、下一步
当天只完成了只读检查,没有执行任何重置动作,也没改过任何文件和数据库。遗留的事情很明确:
- 人工确认 Hyperliquid testnet 链上真实权益
278.8250是否为预期实盘状态; - 如果确认是 testnet reset 导致的非预期缩水,再执行
_reset_sm_account.py --apply重置基线; - 重置后重新跑一次
_sm_sanity_check.py,预期回到 OK / drift<5%。
下一次自动化跑这个检查的时候,如果基线已经重置,就应该能看到 OK 输出。但在那之前,这条 ALERT 会一直留着,提醒我 sm_account 的链上-DB 之间还有一笔 3502.97% 的账没平。