一、两个长得像的开关
比特币核心的连接类参数里有两个都带 dns 字样:-dns 和 -dnsseed。速查表里它们经常被合并成一行,实际上管的是两条完全不同的路径:一条是节点主动按域名拨号的解析许可,另一条是冷启动缺邻居时去问种子域名要地址清单。v31.0 源码里两者各自独立成对:-dns 的默认值来自 DEFAULT_NAME_LOOKUP,为真;-dnsseed 的默认值来自 DEFAULT_DNSSEED,同样为真,但参数说明里带一句限定——使用了 -connect 或 -maxconnections=0 时默认关闭。
二、-dns:按域名拨号时的解析许可
-dns 的参数原文是允许为 -addnode、-seednode 和 -connect 做 DNS 查询,也就是说它管的是你手工配置的出口。源码里启动阶段把它的读数写入全局解析许可标志,建连线程拨号时带着这个标志去解析:允许解析就把域名解成一组 IP 逐个试;关掉它,域名条目实际不可用,只有写成 IP 字面量的目标能拨通。还有一个分支值得注意:配置了名字代理(把解析交给 SOCKS 代理做的 Tor 场景)时,本地解析这一步会被跳过,域名解析改在代理侧完成。所以 -dns=0 在 Tor 部署里的实际含义是本地不查、由代理查,和完全断掉域名不是一回事。
三、-dnsseed:冷启动缺邻居时的问路
-dnsseed 走的是另一条线程。v31.0 的建连逻辑大致如此:开机后如果出站连接数低于阈值,种子线程开始工作;有 -seednode 时先给种子节点一段时间(日志里写明三十秒量级的让位设计),不行再交给 DNS 种子;随后把编译期内置的种子域名列表打乱,一批几个地查询——注释里明确这样做的理由是少给种子影响网络拓扑的机会,也防止任何单一种子把节点引入同温层式的对端集合。查询回来的地址以随机化的历史时间戳进地址库。若邻居已经够数,线程直接收工,日志会写跳过 DNS 播种。-forcednsseed 则是不管三七二十一开机就全量查一遍的加速档,默认关闭。种子域名一条都没给出地址时,还有编译期硬编码的固定 IP 列表兜底(-fixedseeds,默认开启)。
四、一个源码细节:种子线程不看 -dns 的脸色
容易被速查表掩盖的一点:两条路径在源码里的解析调用姿势不同。手工拨号路径带着 -dns 的许可标志走解析;而种子线程解析种子域名时走的是允许解析的解析函数调用,并不受 -dns 关闭的影响——-dns 与 -dnsseed 各自是独立开关。这意味着只想掐掉向种子域名发查询时,要关的是 -dnsseed,光设 -dns=0 掐不住它;反过来只想禁掉自己配置里域名的本地解析,关 -dns 即可,不必牺牲冷启动问路能力。
五、隐私账本:查询暴露什么
两类 DNS 查询都会向你的解析器(家宽路由、运营商递归或公共解析服务)暴露这台机器在用比特币网络的信号,时间上还会与节点开机同步对齐,这比查询内容本身更值得注意。种子查询暴露的是一次性的开机时刻;域名拨号查询则按配置条目偶发。想收敛:用 DoH 或走 Tor 名字代理改变解析路径的可见面;把 -connect 写死常连对端可让 dnsseed 自动默认关闭;接受开机稍慢多给点邻居等待时间,也是一种温和配置。代价要记全:种子路径关掉或查询失败时,全新节点可能停在零邻居状态直到固定种子兜底生效——这也是 fixedseeds 值得留着默认开的原因。
六、验证与故障排查
开机日志是现成的说明书:搜索 DNS 相关字样能依次看到等待几秒后查询、每个种子域名载入、找到多少地址,或以足够邻居被跳过的记录。排障场景对照:冷启动长时间零连接,先确认 dnsseed 没被配套关掉又没有任何手工对端;配置里域名连不上,查 -dns 与名字代理的组合;日志报解析失败,多半是网络侧解析器问题,不是比特币核心的锅。所有默认值以本机 bitcoind -help-debug 打印为准。
风险提示:本文仅作技术机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。