每十分之一秒一次点名:Solana 控制面的推送、拉取与修剪 图 1
每十分之一秒一次点名:Solana 控制面的推送、拉取与修剪 · 图 1

在 Solana 的节点世界里,数据的流动被分成两条路:交易和区块数据走数据面,身份、心跳、投票这类集群元信息走控制面。Gossip 服务就是这条控制面的大门。它比以太坊语境里的”节点发现”承担更重的职责——谁还在集群里、谁的账本跑到多高、哪个验证者对哪个块投了票,全靠它同步给全网。Agave 验证者官方文档把这台机器的日常压缩成三种消息:推送、拉取、修剪,三种消息各司其职,拼出一套无需中心目录的集群账本。

先记账:签名加时间戳的数据对象

Gossip 同步的最小单位不是消息而是记录:节点之间持续交换的是任意内容、但必须经过签名并带版本(以时间戳作版本比较)的数据对象,例如节点的联系方式、账本高度和投票。节点收到同一来源的两条记录时,只保留时间戳更新的那条,旧值被清出。签名保证来源不可冒充,时间戳保证新旧可裁决,这两条规矩让一张分布式哈希表在没有任何权威节点的情况下也能收敛。官方文档强调记录内容是任意的,只要接收方能凭版本字段做出一致裁决即可,这也是同一套通道既能传联系方式又能传投票的原因。

推与拉的节拍:十分之一秒一次的点名

机制示意配图

有了账本还得有传播节奏。文档给出的节拍很密:每个节点每十分之一秒就会发出一条推送消息,或一条拉取消息,或两者都发。推送走”扇出”路线:节点从已知活跃节点里随机挑出一小撮推送对等点,把新记录同时递给它们,并保留这组选择相当长的时间,同时每隔半个消息超时周期就轮换进一个新对等点保持新鲜度。接收方检查消息是否见过:见过就丢弃,甚至可以对低质押节点的转发回一条修剪消息;是新记录就更新自己的副本、转推给自己的推送对等点。过期的推送消息直接丢弃。拉取则相反:节点随机选一个对等点,附上一份布隆过滤器代表”我已经有哪些”,对方遍历自己的值(包括近期清出的值),把过滤器没圈住的、装得下的条目打包回给请求方。推保证快,拉保证漏网之鱼最终被补齐,两者互为兜底。

对第一次接触这个协议的读者,值得先记住一个尺度:十分之一秒的节拍意味着任何一条记录的传播延迟是以秒级累计的,而集群里节点数量以万计,单纯广播早就把带宽打爆。Gossip 的三件套本质上是在”传播完整性”和”带宽成本”之间做的分配——推送负责第一时间覆盖一小圈邻居,拉取负责让缺席的节点按自己的节奏补课,修剪负责把中间人角色交还给质押更重的路径。三者都跑在同一条 UDP 端口上,端口或端口段是约定好的,节点启动后把自己的 gossip 端点地址作为联络信息的一部分公告出去,其他节点靠它找到自己。

修剪消息:把直连让给更重的路径

修剪是三种消息里最容易被误解的一种。当某个节点发现自己以低质押身份直连一个早已通过高质押路径收到同样数据的节点时,高权重路径上的那个节点会发出修剪,意思是”这条直连多余了,撤掉吧”。推送对等点因此被约束在合理规模内,转发负载顺着质押权重流向大节点,重质押节点的投票也能更快回到出块者手里。文档同时讨论了日食攻击的担忧:拉取依赖随机选点、推送依赖活跃集选择,攻击者若能操纵这两处选择就可能把节点包围在恶意对等点里,协议用随机化与权重来压低操纵收益,但文档没有宣称它能完全消除这类风险。普通用户不会直接看到 Gossip 层的任何输出,它能解释的是一类运维现象:为什么某台节点”知道的邻居”和另一台不一样、为什么个别节点的投票传播会慢半拍。它管不到交易是否会被打包,那属于数据面与共识层的另一套规则。(风险提示:本文仅为协议机制说明,不构成任何投资或质押收益建议。)