asmap 映射文件:比特币节点如何按运营商和机房给对端分组 图 1
asmap 映射文件:比特币节点如何按运营商和机房给对端分组 · 图 1

看起来多样,其实同一家

节点挑邻居不是随机的。地址管理器把候选地址按网络分组(netgroup)装进桶里,连接分配器尽量从不同的桶里各取一个,避免邻居扎堆。默认规则里,IPv4 分组按前 16 位前缀切——两条看似不相干的 IP 只要前缀不同就“看起来”来自不同的世界。攻击者视角:控制一个大型机房或 ISPs 的实体手里有海量前缀各异的地址,它们实际由同一主体控制,但默认分桶会把这些同族 IP 当作“多样性”收下,往好了说是低效,往坏了说正是日食攻击的原料——把目标节点的邻居全部换成同一家族的可控节点,就能操纵它看到的交易与区块视图。

asmap:给 IP 查一次“户口本”

asmap 是一份压缩的 IP 到自治系统号(ASN)映射。开启后,分组键从 IP 前缀换成 ASN——同一个云或同一个运营商之下的地址不管前缀多花哨,都会归进同一个桶,连接分配器于是硬性只从每家里选极少数对端。比特币核心的网络分组模块文档对此写得很直白:若提供了 asmap,节点按其所属自治系统分桶,使得同一 AS 内同时连上多个节点变得不可能。配套还有一个健康检查函数,启动时统计你的清网对端被映射进多少个 AS、多少条完全无法映射,直接打进日志,方便自查“我的邻居到底分属几家”。

默认状态与开启路径

截至比特币核心 v29.0:该特性默认关闭。选项 -asmap 的行为在初始化代码里可查——只有显式指定时才会加载,可选带路径参数,不带路径则按默认文件名在数据目录查找,找不到文件节点会直接报初始化错误而不是静默忽略;换句话说,v29.0 的行为语义下,主动开启意味着你自己负责把文件放对位置。文件从哪来?历史上由社区基于公开路由表数据定期构建发布,来源与新鲜度都在你自己的信任范围内:这份数据把“这段 IP 归谁管”编码进你的网络决策,因此它值得与软件二进制同等的安全审视。还要注意映射的错配后果:过时或错误的文件不会让你连不上网,只会让分组偏松或偏紧,属于渐进退化而非灾难故障。

它防什么,不防什么

诚实划界。它削弱的是低成本 Sybil:一个实体用同一家的 IP 池冒充“成百上千独立节点”的性价比被压到最低——要骗过分桶,攻击者必须真的让流量经过多家独立自治系统,成本结构整个改变。它不防的是“合法的少数”:某些地区节点本来就只有少数运营商可用,开不开 asmap 都不影响现实集中度;它也不解决 Tor/I2P 地址的分桶(洋葱地址不参与 AS 映射),后者的多样性逻辑另有一套。对普通笔记本用户,这项功能收益边际——你的八条出站连接本来就由分配器控制分布;对跑大量入站的公共节点运营者,它才进入必配清单。任何情况下都不建议从不明镜像抓一份 asmap 就往数据目录里丢:官方特性加上可追溯来源的构建流程,或干脆保持默认关闭,才是风险可控的两种姿势。最后补充一个观察角度:这项功能的历史本身也说明比特币的抗审查设计是分层演进的——从最初纯 IP 前缀的朴素分桶,到引入外部路由数据做“户口本”核查,每一步都是用可验证的公开数据换更强的抗协同攻击能力,而不是靠任何中心化的名单权威;理解这条演进线,比把 asmap 当成一个神秘开关更贴近它的本意。

风险提示:本文为节点网络机制说明,不构成投资建议;功能默认值与选项行为随版本变化,请以所用版本源码与发行说明为准。