数据截至 (上游 commit fa12a9240255)
02 · 路由与发现(DHT + 拉取式发现)
本章是
dir工程含量最高的部分。核心一句话:DHT 里只放“谁有这块内容(CID)”,不放“这块内容是什么(标签)”;标签靠对端把记录拉回来现抽、缓存到本地。理解这个反直觉的设计,后面全通。
1. 这章要解决的小问题
我们想做“按能力发现 agent”:别的 peer 发布了一条带 skills/AI/Machine Learning 标签的记录,我应该能 search --skill AI 找到它。
最朴素的做法:把标签直接塞 进 DHT(DHT.PutValue("/skills/AI", CID))。但这会撞上 DHT 的硬限制——一个 key 只可靠地复制到离它最近的约 20 个 peer(k-closest)。网络一大,标签传播就不可靠、会丢、会过期。ROUTING.md 把这条旧设计明确标为 “❌ REMOVED”。
2. 思路 / 直觉:拉取式发现(pull-based discovery)
把问题拆成两层,各用最擅长的机制:
| 层 | 放什么 | 用什么 | 为什么 |
|---|---|---|---|
| “谁有” | CID 的 provider 宣告 | DHT Provide(CID) | DHT 的 provider 系统是成熟可靠的,而且 provider 宣告能到达所有 peer,不受 k-closest 限制 |
| “是什么” | 技能/领域/模块标签 | 对端拉回内容现抽 + 本地缓存 | 标签永远和内容一致(从源头抽),且按需拉取可扩展到上百 peer |
直觉类比: DHT 像 BitTorrent 的 tracker,只告诉你“这些 peer 有这个文件”;你想知道文件里有什么标签?自己连过去把文件头拉回来看一眼,然后记在小本本上(本地缓存)。下次搜索只翻小本本,不再打网络。
这就解释了三个操作的分工:
- Publish = 本地记一笔 + 向 DHT 宣告
Provide(CID)(+ 可选 GossipSub 广播标签走快路径)。 - List = 只查本地