ENR 与 TopDisc 是什么?不可信入口能递给你的只有一张签名名片 图 1
ENR 与 TopDisc 是什么?不可信入口能递给你的只有一张签名名片 · 图 1

跑一个公链节点时,引导节点这个词经常被人一带而过:从哪找到第一批邻居?以太坊的节点发现协议 v5(discv5)给出的答案有两个关键词——不可信入口和签名名片。你可以从一个完全不认识的节点进网,它不需要值得信任,因为它递给你的不是命令,而是一份自己签过名的记录。本文按以太坊 devp2p 规范仓库 discv5 文档(规范版本 v5.1)的记载,把名片本身和它上面新长出的业务广播扩展 TopDisc 讲清楚。

先讲定义:ENR 是一份自签的声明

节点记录(ENR,Ethereum Node Record)是一份签名文档:内容是一组键值字段——网络地址、端口、公钥等身份与可达性信息——由节点自己的私钥签名,并带一个序列号。节点改了自己的公网地址或端口,就签一份序列号更大的新记录,旧记录自然作废。规范强调,发现系统存储和转发的正是这种签名记录,而不是任意键值;任何字段没被签名覆盖,接收方就有理由不认。这份名片意味着:引导节点可以撒谎,但谎话无法传播——它替不了别的节点签名,也无法伪造更高序列号来覆盖别人的自我声明。

不可信入口做哪两件事

ENR 与 TopDisc 是什么的抽象机制示意

discv5 的设计松灵感来自 Kademlia 分布式哈希表:节点 ID 空间上的距离决定谁该认识谁,每个节点维护按距离分桶的路由表。规范把整个系统的基础职能概括为两条:其一,对在线节点集合做采样——沿着 DHT 行走,就能枚举网络的参与者;其二,权威地解析节点记录——只要知道某个节点 ID,就能在网络里问到它序列号最新的那份名片。入口节点的信任边界由此划定:它只会告诉你它认识谁、名片长什么样,你能否和对方真正连通、对方随后行为是否诚实,属于握手和上层协议要各自负责的事。与依赖中心化汇合服务器的方案相比,规范明确写道本协议对每个参与者只放一小份信任,抗审查性更好。

TopDisc:在名片网络上挂业务招牌

规范 v5.1 引入的扩展 TopDisc 解决另一个问题:我要找的不是随便谁,而是支持某个特性、参与某个覆盖层的节点。做法是让节点在名片网络上做主题声明——为一个或多个主题签名投放广告,其他节点沿着既有的发现网络检索这些广告。设计上它几乎是搭便车的:主题声明复用普通节点发现已有的节点表、ENR 机制、包格式和会话加密机器,不要求各业务另建一套发现网络;一个节点是否支持 TopDisc,本身就在它的 ENR 里用字段声明,不支持的节点照常参与普通发现。规范同时提醒,主题广告是有保鲜期的声明,声明过期与在线状态一样会影响可发现性,检索方应把广告当作线索而不是事实。

边界与自查

给节点运维者的三段话:第一,种子节点列表只是入口,不是信任锚,进网后每个对等方的身份都由其签名记录与握手证明说话;第二,看到陌生对等方不要慌,发现层能出现谁,取决于名片和桶位,不代表对方在同步层有特权;第三,公网拓扑变化(换 IP、改端口、NAT 行为改变)后如果不同步更新并重签自己的 ENR,症状通常表现为被发现不进来——别人手里你的名片过期了。具体字段编码、主题声明的签名结构与更新规则,以 devp2p 仓库当版本文档为准,规范也自注仍在演进、可能不兼容地变动。本文是协议机制说明,不构成任何投资或选型建议。