比特币新节点的第一通电话:DNS 种子如何帮你找到第一批对端 图 1
比特币新节点的第一通电话:DNS 种子如何帮你找到第一批对端 · 图 1

冷启动悖论:认识节点之前需要认识节点

比特币网络没有目录服务器、没有登录协议,节点之间靠互相告知地址来认识彼此。这就产生一个鸡生蛋问题:一台刚从官网下载好软件、对网络一无所知的新节点,第一批对端地址从哪来?答案是几种预先约定的入口,优先级一条链:手动种子节点、DNS 种子、编译进二进制的固定种子。

三个选项的分工

以比特币核心 v29.0 的选项说明为准。-dnsseed:当节点手里的地址库存偏低时,通过解析一批预先发布的域名获取候选节点地址,默认开启,但只要使用 -connect 或把最大连接数配成零就会自动关掉(前者意味着你明确只要指定的对端,后者意味着你根本不要外部连接)。-seednode:你手动指定某个地址,节点连上去目的只有一个——索要一份对端清单,然后断开;帮助文本明确写着启动阶段 seednode 先于 dnsseed 被尝试,多个 seednode 可重复书写。-fixedseeds:默认开启,当 DNS 途径一个地址都没拿到时,允许使用编译期硬编码的一批种子 IP 兜底。三级结构的意图很清楚:先按你的意愿,再走公开的 DNS,最后动用出厂名单——每一级都是对上一级失败的保险。

DNS 种子的样子与争议

DNS 种子看起来像普通域名:软件向它发起 A/AAAA 记录查询,返回的若干 IP 被当作活跃节点地址使用。它借用了互联网最古老的基础设施,优点是无需任何比特币专用协议,任何只会解析域名的环境都能工作;代价是一条 DNS 查询会向递归解析器暴露“这台机器此刻在跑比特币软件”这个事实,在把隐私当重要变量的语境下值得留意,因此官方文档同时提供了通过 Tor 或代理让发现阶段也走加密通道的做法。另一个常见担忧“DNS 种子能劫持我的节点吗”的答案是负面:种子返回的只是连接候选,后续每一条连接都要走完整握手、区块头下载和独立验证,骗得过地址层也骗不过共识层——最坏情况是被引到延迟或干扰节点,而不是被骗进假链。

连不上网时的排查顺序

新节点长时间零对端,按这个顺序查:第一,运行日志(debug.log)里的种子阶段记录,确认 DNS 查询是否发出、是否拿到地址——防火墙拦截 53 端口或运营商 DNS 异常在这一步就会现形;第二,本机时钟是否严重漂移(过旧的证书链和异常时间都可能影响网络行为);第三,所在网络是否封锁出站 8333——DNS 拿到地址但一个都连不进,多半是端口问题,这时 -proxy 指向 SOCKS5 或走 Tor 是常见的绕行方案;第四,若确认 DNS 途径全军覆没,固定种子会作为最后防线自动登场,日志里同样可查。手动补一个 seednode 永远是最快的急救:只要网上有任何一个可访问的活跃节点地址,写进配置即可重启组网。

顺带澄清的两个误会

误会一:“删掉 DNS 种子我就断网了。”不会——地址管理器的 tried/new 表会长期积累对端,日常重启靠已有库存就能重连;种子只在库存枯竭时才真正发挥作用。误会二:“-connect 写死对端更安全。”它确实消除发现面的暴露,但把节点可用性和抗审查性绑死在那几台机器上,属于特定场景的取舍而非普适加固。理解三种入口各自的边界,比记住某个“最佳实践口令”有用得多。最后补一个进阶选项:如果运行环境既不想暴露 DNS 查询、又没有现成对端,可以关闭 -dnsseed 并用多条 -seednode 指向亲友节点或已知的公开节点地址,把发现面完全收进自己可控的名单——代价是名单过期的维护责任回到你身上,属于典型的隐私换运维取舍。

风险提示:本文为节点组网机制说明,不构成投资建议;选项行为以你所用版本的官方文档为准。