日食攻击:不是 51%,而是把一条节点围进信息茧房 图 1
日食攻击:不是 51%,而是把一条节点围进信息茧房 · 图 1

对区块链网络攻击的想象大多停留在 51%:算力 majority 重写历史。日食攻击走的是完全另一条路——它不碰共识规则,不挑战全网,它只做一件事:让某一台特定的节点看不到真实的世界。攻击得逞后,这台节点仍然诚实地验证每个区块、广播每笔交易,只是喂给它的区块和交易由攻击者挑选。对外的后果因此非常具体:矿工节点在茧房里铸出接不进主链的孤块,闪电节点按一个不存在的世界状态付款,服务节点向自己的所有用户播放假链。日食这个名字很准:天体没变,只是你站的位置被云挡住了。

攻击面从地址管理表开始

节点找邻居靠 gossip:启动时从 DNS 种子或内置清单拿到第一批地址,运行中通过 addr 消息互相交换『你还认识的节点』。比特币核心把这张通讯录叫 addrman,分两本:new 表装还没验证过的候选地址,tried 表装连上过、活着的邻居,按哈希分桶存放,每个网段(IPv4 的 /16 前缀或 IPv6 的对应段)在桶里的位置由随机键决定。攻击剧本分三幕。第一幕投毒:攻击者注册大量 IP(真实租用的云服务器、IPv6 地址空间里近乎无限的子网),用它们跟受害者建立入站连接,顺手塞进成千上万条指向攻击者控制的 addr 公告;new 表很快被劣质地址淹没,而 tried 表的驱逐规则给了攻击窗口——把『已知好邻居』挤回 new 表的过程被设计成偏向『更久没见到』的条目,攻击者用海量入站把良性邻居晾在场上。第二幕是等待:节点总要重启、总要轮换连接,任何一次重连,选择概率都被投毒过的表扭曲。第三幕收网:攻击者占据全部出站连接和大部分入站,受害者还以为自己正常同步,网络里的诚实节点则只看到攻击者那台『替身』在正常发言——被遮蔽的节点在 gossip 里彻底沉默。学术论文在 2015 年演示过,租几十万美元级别的 IP 加两台机器就能围住目标节点;代价高但并非不可行,这正是防御必须假设它可发生的原因。

防御一:让通讯录不可被定向投毒

比特币核心的反制长在 addrman 的构造里。分桶本身随机化,且桶的索引掺入一个对每个节点保密的随机键——攻击者猜不到自己的 IP 会落到哪个桶、挤掉谁,定向驱逐变成赌博。网段去重是另一道闸:同一网段的邻居在桶里只算一份权重,攻击者囤积一万两千个同段 IP 不如十个不同段的有效地址;出站连接的建连策略进一步要求多样性,新连接会优先挑选与现有邻居网段不重叠的候选。版本层面的细节也在服务同一个目标:addr 消息里的服务位与版本参与筛选,纯 Sybil 软件栈更容易露馅。以太坊的节点发现协议(v4 与后来的 v5)面对同样的问题,防御思路同构——节点记录(Node Record)经签名与序号管理、发现协议对候选节点做可达性验证、客户端在选连接时偏好地理与网段多样性,执行层和共识层各自维护连接池,单一入口被投毒的爆炸半径因此小一些。两个网络共同暴露的假设也很诚实:只要攻击者能长期租用足够多不同网段的真实可达 IP,概率优势总可以堆出来——所以防御的终点不是彻底挡住,而是抬高成本。

茧房成立之后:从被围到被偷

围住节点只是手段,收益在后面两种场景。对普通全节点,后果是『看见假链』:攻击者 withhold 新区块、只广播自己挑的旧链视图,受害者不丢币,但它的下游用户会基于过期世界做判断——对依赖它的钱包和交易所就是一起事故。对矿工节点,攻击者持续 withhold 主链区块,让受害矿机在旧高度反复铸块,全部变孤块,算力被白白蒸发——这是直接的经济损失。最锋利的目标在闪电网络:通道节点的通道余额由本地保存的状态决定,若其 P2P 视图被接管,攻击者可以构造一笔在『真实链』上已消耗通道、但在受害者链视图里从未发生的付款,受害者按旧状态签名接受,等它看见真实链时币已被取走。这类风险不靠加密破解,纯粹靠信息差收割——所以闪电节点的运维手册里,多路径、独立观察链的提醒器(watchtower)与多源区块订阅是同一类防御的三个面:永远不要让一条被围脖的连接替你定义现实。

运维与用户的各自清单

节点运营者的可执行项朴素且有效:保持默认连接策略不魔改、不手动固定一堆同机房邻居、确保从多个 DNS 种子与不同路径取得初始地址、用版本发布线的维护节点而不是长期不改的裸服;有条件的话配一个第三方提醒器或独立区块订阅源,把『外部世界』做成第二条腿。普通用户端的判断更间接但真实:轻钱包连多个对端交叉验证区块头是协议内建的防日食设计(BIP157 系的过滤器同步同理),单对端连全节点钱包才是茧房受害者名单上的常客;大额收款多等确认深度、跨链场景交叉使用多个公共 RPC/区块浏览器,本质是在做同构的防御。把日食攻击放回正确的位置很重要:它是针对信息通道的战术攻击,不威胁网络整体共识——但共识的果实,从来都是先分给具体节点再分给人的。

快速问答

日食攻击需要多少算力?零。它是 P2P 层的 Sybil 攻击,预算全花在租 IP 与维持连接上,不碰出块。

只连一个公共 RPC 服务器有日食风险吗?有类似形态:那个服务端 withhold 数据,你就没有第二只眼睛——这正是交叉验证存在的全部理由。

发现自家节点被围的征兆?出站连接网段集中度过高、区块高度长期落后于公开浏览器、邻居节点 User Agent 异常单一——三条都该触发告警。

风险提示:本文仅作网络安全机制科普与防御指引,不构成任何投资建议。