peers.dat 与比特币节点的熟人账本:地址库怎么决定你重启后连上谁 图 1
peers.dat 与比特币节点的熟人账本:地址库怎么决定你重启后连上谁 · 图 1

重装系统的比特币节点几十秒就能重新凑齐连接,靠的不是运气,而是数据目录里一个几百 KB 的文件:peers.dat。它存着节点”认识”的对端地址清单,是冷启动最快的跳板,也决定了你每天连到的是哪些人。本文拆解这本熟人账本的记账规则、防污染设计,以及删掉或搬走它的后果。

地址从传闻到验证的两级记账

节点的第一批朋友来自两个渠道:配置文件里手写的 addnode/connect,和编译期内置的 DNS 种子域名——解析一次拿回一批候选地址。之后每个 addr 消息都在交换”我还认识谁”。核心把这些传闻装进地址管理器 addrman:新地址先落进 new 表,按来源与网段分组——同一子网最多占有限的坑位,防的是恶意对端用一百万个相近假地址淹掉候选池。真正连上过、握手成功的地址升进 tried 表,带上最后活跃时间。tried 是验证过的朋友,new 是待考察的传闻;重启选点优先抽 tried,冷启动因此跳过全网扫描。源码 addrdb.cpp 的日志会告诉你它的全部日常:启动时 Loaded 若干 addresses from peers.dat,文件缺失时 Creating peers.dat 新建空库,文件损坏时拒绝加载并提示改名或重删——恢复动作只有一个:让节点重新交朋友。

peers.dat 与比特币节点的熟人账本:地址库怎么决定你重启后连上谁 图 2
peers.dat 与比特币节点的熟人账本:地址库怎么决定你重启后连上谁 · 图 2

时间如何稀释这本账

每条地址带着”上次在公告里出现”的时间戳。太久没被任何对端提及的地址优先级衰减、最终被挤出——常年在线的节点账本新鲜,翻出几年前的旧数据目录直接上电,tried 表多半整片过期,节点退回靠 DNS 种子重学:文件存在不等于记忆可靠。行业级变动(大量节点更换网络形态、地址格式换代)之后命中率先跌后升,属于正常代谢不是故障。想核对账本状态,getaddrmaninfo 类接口能直接查看 new 与 tried 各自条目数与网段分布。

三条容易踩弯的边界

第一,peers.dat 不是防火墙也不是黑名单:里面可以混着有前科的地址,节点对它照样跑完整校验;持久封禁记录另有文件——现代核心写 banlist.json,早年的 banlist.dat 新版会直接忽略并提示删除,两本账互不覆盖,删错文件等于白删。第二,它不含任何密钥、地址归属或钱包数据,名字里的 peers 不值得恐慌——最坏后果是冷启动变慢,删掉自动重建。第三,它泄露你的连接社交圈:同机多实例抢同一数据目录会触发文件锁报错,跨机器整目录搬迁会把旧机器的连接画像原样继承,想重置偏好删这一个文件就够。

一个直觉算术

默认配置下节点主动维持八个出站连接,地址库里躺着成千上万条候选——认识的人与正在连的人差三个数量级。这个比例解释了两件事:为什么重启近乎秒连(候选池足够深、抽哪个都活),为什么个别地址失效毫无感知(每次拨号都是加权抽样)。写盘节奏也有默认值:地址管理器大约每十五分钟把内存账本刷回 peers.dat 一次,因此意外断电最多丢一小段最近学到的新面孔,不至于伤筋动骨。运维排障也顺着这条比例走:库里没货查发现环节,有货连不上查路由、防火墙或 onlynet 配置,两种处方的病因完全不同。

快速问答

问:删除 peers.dat 会掉线多久? 答:公网环境靠 DNS 种子通常几分钟重新凑齐;限制网络形态的环境(如单网络模式)可能明显更慢。

问:节点同步正常但 peers.dat 不见了要紧吗? 答:不要紧,下次按周期写盘自动重建。

问:能人工塞地址进去吗? 答:不建议手改文件;正规入口是 addnode RPC 与配置文件,地址会走正常验证流程入库。

风险提示:本文描述节点实现行为,不构成投资建议。修改数据目录前请停进程并备份,以所用版本文档为准。