asmap 是什么:让比特币节点按运营商而不是按 IP 段挑邻居 图 1
asmap 是什么:让比特币节点按运营商而不是按 IP 段挑邻居 · 图 1

刚启动的比特币节点要去哪里找第一批邻居?答案是监听与可达性之外的一套内部账本——地址管理器 addrman:它把从邻居那里听来的 IP 按“组”装进桶里随机抽取。分组规则本来是看 IP 前缀(IPv4 大致按 /16 段),问题也随之而来:同一家宽带运营商手里几万个拨号 IP 可能都落在相邻段,被 addrman 当成一个组;反过来说,攻击者只要控制几个不同网段,就能在桶的分布上伪装出“我们来自五湖四海”的假象。asmap 就是为修这个视力缺陷而生的。

把 IP 翻译成“运营商身份”

互联网地址按自治系统号(ASN)划分归属:一个运营商、一家云厂商通常对应一个或几个 ASN。asmap 是一张把 IP 前缀映射到“改写后的 ASN”的位图,节点读完它之后,判断“这两个地址算不算同一组”就不再看裸 IP 的长相,而是看它们背后的运营主体。这样一台节点挑邻居时每类来源只留少量名额,同一 ISP 的僵尸机海填不满它,日蚀攻击这类靠控制地址多样性的隔离战术就更难凑齐入场券。P2P 网络文章讲过“为什么节点要主动挑 diverse 的邻居”,asmap 就是这个原则的落地工具之一。

开关历史:从实验选项到内置地图

asmap 选项在 2020 年的 Bitcoin Core 0.20.0 首次引入,当时明确标注“实验性、可能变更,默认仍用旧的 /16 前缀映射”,用户要自己准备一张 IP 转 ASN 的映射文件——获取和校验这份外部文件门槛不低,用它的人一直不多。转机出现在 31.0:这个版本第一次把 asmap 数据直接打进发布包里,不再要求从外部下载地图(随包内置的这份映射生成于 2026 年 3 月),并规定显式传入 -asmap-asmap=1 才会加载内置数据、要用外部文件必须写全文件名。值得注意的是,即便数据已内置,这个特性在 31 版仍然默认关闭——把它当“全网已启用”来描述是错的,你的节点有没有在用,看配置里有没有那行参数,listbanned 审计式的自查同样适用于连接质量。

用户视角:这影响我什么

全节点运维者开一行参数,换来更抗投毒的邻居集合;钱包开发者可以借此理解为什么自己同步时看到的节点分布“看起来不少但可能同质”。普通用户感知不到它,但它悄悄决定了你广播的交易从哪批节点出发。它也不解决所有多样性问题——同一家云厂商可能持有多个 ASN,把地址段拆得花团锦簇,asmap 的粒度能否识破取决于映射图里有没有做对应改写。

一张映射图从哪来、怎么保鲜

asmap 本质是把 CIDR 前缀列表转成布尔判定树的二进制文件,社区做法是用公开的地址分配数据与路由观测离线生成映射,再由节点加载。它有一个“地图保鲜期”的问题:一家运营商把整段地址转卖给另一家,旧图就会把两家错标成同一主体;新独立出来的网络若没进图,也仍按旧归属分组。从 0.20 到 30 之间的漫长岁月里,这张图要靠用户自己找来源、自己校验——软件开关只有一行,地图维护却是长期劳动,这也是它少有人开的另一半原因。31 版把图打进发布包,相当于把保鲜责任收进发布流程,随版本节奏滚动更新,用户侧只剩一次选择。

快速问答

问:asmap 和 BIP155 的 addrv2 什么关系?一个管地址归属分组,一个管 Tor v3 等新类型地址的传播格式,互相独立。问:内置地图会随版本更新吗?会,随包发布意味着映射跟着版本走,旧版本用旧图。问:开了它会连不上网吗?不会,映射只影响“分组打分”,不改变连接协议。问:怎么验证生效?看 getpeerinfo 的 mapped_as 字段是否给出映射后的 AS 值。

常见误区

一是把 asmap 当成隐私工具,它不改你的流量形态,只改节点挑邻居的账本逻辑。二是以为默认开启——即便数据内置后官方仍保持默认关闭。三是把 ASN 当作万无一失的身份指纹,云厂商与 CDN 的多 ASN 结构仍可能造成分组错位。

小结

asmap 做的是把“网段相似”升级为“主体相似”的邻居多样性判断。从 0.20 的实验旗标到 31 版内置地图,它花了六年才把使用门槛降到一行参数,这本身也说明:对抗地址投毒不是一锤子功能,而是持续维护的账本生意。

风险提示:本文只解释节点软件机制,不构成投资或收益建议;配置行为以所用版本官方文档为准。