Skip to content

fix(core): 节点内容指纹递归忽略内部 _ 前缀字段 - #78

Open
212duo wants to merge 2 commits into
SubBoost:mainfrom
212duo:fix/node-fingerprint-ignore-nested-internal-fields
Open

fix(core): 节点内容指纹递归忽略内部 _ 前缀字段#78
212duo wants to merge 2 commits into
SubBoost:mainfrom
212duo:fix/node-fingerprint-ignore-nested-internal-fields

Conversation

@212duo

@212duo 212duo commented Aug 11, 2026

Copy link
Copy Markdown

问题

节点内容指纹(buildNodeContentKey)只在节点顶层过滤 _ 前缀的内部字段,嵌套对象里的内部字段没有过滤。

vless reality 解析器会把 spider-x 存为 reality-opts._spider-x(带 _ 前缀的内部字段)。很多机场每次更新订阅都会轮换 spider-x,导致内容指纹每次都变,mergeParsedSourceNodes 的智能匹配永远失败——节点被当成"全新节点"重复插入列表末尾,同时旧节点被删除。表现为:某些 reality 节点每次订阅更新后都跑到列表最后、产生重复节点、用户手动排序失效。

复现

  1. 订阅含 vless reality 节点,节点名带动态流量/到期信息
  2. 机场更新订阅时轮换 spider-x 参数(uuid/server/port 均不变)
  3. SubBoost 自动更新后:该节点被判定为"新节点",插入源节点列表末尾

实测(真实订阅):uuid、server、port、public-key、short-id 全部一致,仅 _spider-x 不同,更新后节点从列表第 1 位掉到末尾。

根因

node-identity.tsstableJsonStringify 递归序列化时没有像 buildNodeContentKey 顶层那样忽略 _ 前缀键,导致 reality-opts._spider-x 参与指纹计算。_ 前缀在代码库中是 SubBoost 内部字段的通用约定(生成 YAML、proxy-sanitizer、顶层指纹均按此忽略),嵌套层漏掉属于不一致。

修复

stableJsonStringify 递归时同样跳过 _ 前缀键,与顶层行为统一。内部字段不再参与节点身份判定,spider-x 轮换不影响匹配。

测试

  • 新增 node-identity.test.ts:嵌套 _spider-x 不同时指纹相等;真实字段(uuid)不同时指纹仍不同;顶层内部字段行为不变
  • 新增 source-node-refresh.test.ts 场景测试:spider-x 轮换 + 显示名变化时,节点保持匹配、不重复、保留原位置,参数更新为新值
  • 全量测试:224 个文件 / 1220 个用例全部通过

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Repo admins can enable using credits for code reviews in their settings.

buildNodeContentKey 只在节点顶层过滤 _ 前缀的内部字段,嵌套对象
(如 reality-opts 中的 _spider-x)未过滤。机场每次更新订阅都会
轮换 spider-x,导致内容指纹变化、智能匹配永远失败,节点被当成
全新节点重复插入列表末尾。

修复 stableJsonStringify 递归时同样忽略 _ 前缀键,与顶层行为一致。
新增 node-identity 单测和 source-node-refresh 场景测试覆盖。
@212duo
212duo force-pushed the fix/node-fingerprint-ignore-nested-internal-fields branch from 7b8c1bb to c118ef8 Compare August 11, 2026 10:49
@Ryson-32
Ryson-32 self-requested a review August 12, 2026 08:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants