术语表 /节点与软件
DNS 种子
- DNS 种子是什么?
- DNS 种子(DNS seed)是一个域名,它返回可连接的比特币节点的 IP 地址,使新安装的节点有地方建立第一次连接。
比特币没有目录服务器,所以新软件只能通过查询来找到网络。Bitcoin Core 内置一份硬编码的种子主机名简短列表,解析一次后,通过端口8333建立八个出站连接,此后不再需要这些种子。首次握手之后的一切信息,都从对等节点本身获取。
运作方式
每个种子主机名背后是一个爬虫,而不是静态文件。
运营者运行的软件会遍历点对点网络,尝试连接它得知的每个地址,并记录哪些地址近期有响应。随后,该主机名会解析为取自这一地址池的 A 记录和 AAAA 记录,每次查询返回二十几个地址,并设置较短的生存时间(TTL),使返回的结果不断轮换。部分种子还支持按服务位过滤,因此需要提供紧凑区块过滤器的对等节点时,节点可以查询只返回此类节点的子域名。
这些主机名位于 Bitcoin Core 的源代码中,即 kernel/chainparams.cpp,每个网络各有一份单独的列表。主网列表由具名个人维护:seed.bitcoin.sipa.be 由 Pieter Wuille 运营,dnsseed.bluematt.me 由 Matt Corallo 运营,seed.btc.petertodd.net 由 Peter Todd 运营。保持列表简短且可追溯是有意为之,因为种子运营者决定了您会遇到哪些节点。
首次启动时,节点会解析这些名称,填充其地址管理器,并建立八个全中继出站连接,外加两个仅中继区块的连接。后者不传播交易信息,也更难被旁观者察觉。此后,节点通过 getaddr 和 addr 消息收集地址,并缓存在 peers.dat 中,因此之后重启时会完全跳过这一查询。如果所有种子都无法访问,Core 会回退到编译在程序中的一份固定节点地址列表。您也可以通过 dnsseed=0加上指向您已信任节点的 seednode 或 addnode 条目,绕开整个机制。
在哪里会遇到它
大多数人只会在节点调试日志的前几行里注意到 DNS 种子。
在没有 peers.dat 的机器上启动 bitcoind,日志会记录它正在从 DNS 种子加载地址,随后连接数从零开始上升。您也可以在终端用 dig 自行完成同样的查询,它会返回与您的节点所得相同的轮换 IP 地址集合。
有一项隐私代价值得了解。这一查询是普通的未加密 DNS 查询,因此您的解析器和互联网服务提供商可以看到您的网络连接上正在启动比特币节点,尽管该查询不会泄露任何有关您的钱包或余额的信息。如果您介意这一点,请通过 Tor 运行节点,或设置 dnsseed=0并自行提供第一个对等节点。
信任问题的范围比看起来更窄。恶意种子无法伪造区块或交易,因为您的节点会依据自己的一套规则验证收到的一切内容。它能做的是只返回由其控制的地址,使您与诚实的网络隔离,因此 Core 会查询多个种子,将连接分散到不同的网络地址段,并保留那些仅中继区块的连接作为无声的第二意见。
DNS 种子 vs 助记词
DNS 种子是用于查找对等节点的公开主机名;助记词(seed phrase)则是控制您的币的12个或24个秘密单词。两者只共用一个“种子”之名,别无其他共同点。DNS 种子没有任何内容是保密的,也完全不涉及您的钱包,任何正规的设置步骤都不会要求您在网络配置界面输入助记词。