两个以太坊节点建立连接,传统上先交换状态消息:报自己的协议版本、网络标识、累计难度、最佳区块哈希和创世哈希。最后这一项曾长期是唯一的链身份凭据——可创世哈希只能区分「同不同链」,区分不了「同一条链上的不同阶段」。测试网节点与主网节点创世不同,天然对不上;但两条都叫主网、其中一条在计划内分叉后各自前进的集群,光比对创世哈希完全看不出问题。EIP-2124 设计了一把量尺 forkid,EIP-2364 则负责把这把尺子挂到门把手上:从 eth/64 版本起,握手状态消息末尾追加 forkid,两句话决定合不合并。这份提案 2019 年 11 月提交,属于网络层标准,不需要硬分叉。
一把由两个字段组成的尺
forkid 本身只有十二字节:四字节的 fork hash 加八字节的 fork next。摘要不是凭空算的,而是从创世哈希和「已经历的全部分叉块高列表」用循环冗余校验类算法压出来的——只要两个节点对「我们共享哪条分叉史」达成一致,算出的摘要必然相同。fork next 则指向上面列表里下一个还没跨过的分叉块高。于是这对字段能同时回答两个问题:你站在哪条链上(摘要),以及你预期在哪个块改变规则(下一步块高)。对方宣布的下一步块高已到而自己的规则还没切换,握手当场判定不兼容;两边摘要对不上,同样立刻分手。

握手为什么值得多花十二字节
提案给出的账本很朴素:以太坊的握手流程允许双方一路聊到交换区块头、下载区块、执行验证之后,才通过坏块暴露「我们根本不在同一章历史上」。一次昂贵的误会要烧掉带宽、磁盘读取和 CPU,还白白占着一个出站对等位。把这层判断前移到十二字节,不兼容集群就能在连接建立的第一毫秒互相关门——尤其在一批链同时存在、测试网频繁硬分叉的年代,大量节点资源浪费在彼此误认上。文档把收益拆成两层:微观上每个节点把资源花在对的同伴身上;宏观上不兼容的集群被网络自动分成互不打扰的两片,各自保有更干净的同步质量。
版本共存是常态
协议版本号与分叉无关。eth/64 上线时并不强制淘汰 eth/63,两套版本并行服务直到新版本被充分采纳——这也是 devp2p 能力协商机制的存在意义:一台节点同时声明支持多个 eth 版本,与老同伴说老话,与新同伴说新话。所以「我连的节点用的是哪版 eth」反映的是软件的新旧,「forkid 对不对得上」反映的才是链与链、分叉与分叉的是非。顺带一个常混淆点:eth 握手里的创世哈希字段并没有因为 forkid 而删除——hash 已把创世揉进了算法输入,但显式比对创世仍然保留,两道锁互为冗余,提案在问答部分专门解释了这个重复的成本可以接受。
快速问答
问:我的节点连不上网,是 forkid 的问题吗? 答:如果你的软件漏掉了某次分叉的规则更新,日志里通常会留下不兼容断连的痕迹;这比在同步到分叉块才崩出来更早,排查时先看握手阶段的记录。
问:测试网重置为什么必须改创世? 答:同创世、只改分叉计划的话,新旧测试网的 hash 关系会变得难以管理,直接换创世是社区长期沿用的粗暴解法。
一次握手的时间账
把两种世界的对话过程并排放一遍。旧世界里,两台刚完成分叉的同类链节点相遇:交换状态、互认创世哈希相同、建立连接、交换区块头、开始下载区块体与收据、执行到分叉块之后的某一块,才发现对面执行的规则与自己不同——此时带宽可能已经花掉几百兆,出站对等位被占了半小时。新世界里,同样的两台节点在状态消息到达的瞬间比对 fork hash:一边是升级后的摘要、一边是升级前的摘要,握手返回不兼容、连接关闭,全程消耗不到一千字节。八字节的对价换一整段误会的豁免,这就是提案动机段里那句「越早判定对面无用,越少白白消耗」的真实账单。对普通用户,这个差异的可见形式是:节点在分叉窗口附近不再长时间挂在错误的链上追高——旧版本软件的新手最常见的困惑,被这十二个字节提前化解了。
风险提示:本文讲解节点通信协议,不涉及资产操作;组网故障请结合客户端日志与当期文档排查。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。