节点喊话有节拍:涓流机制与库存公告的节奏账 图 1
节点喊话有节拍:涓流机制与库存公告的节奏账 · 图 1

比特币节点每秒都在互相”喊话”:我见到一笔新交易、我挖出一个新块。但节点并不会见一个喊一个——对普通邻居,喊话是攒一批、按固定节奏漏出去的,这套节奏机制在源码里叫 trickle(涓流)。本文拆解它的两个时钟、分桶配速的账,以及”为什么我的节点看起来慢半拍”。

两个时钟

源码常量给出答案:对入向连接,库存公告的平均间隔是 5 秒;对出向连接是 2 秒——出向更积极,因为那是你自己挑的连接,隐私顾虑更小。两个时钟都只对”普通邻居”生效:区块公告和带免禁权限(noban)的白名单对端可以绕过涓流直接发。此外还有一个独立的地址广播时钟(对等地址平均 30 秒广播一次),别与库存涓流混为一谈。

节点喊话有节拍:涓流机制与库存公告的节奏账 图 2
节点喊话有节拍:涓流机制与库存公告的节奏账 · 图 2

从固定间隔到令牌桶

早期版本按”每 N 秒把待发队列全倒出去”工作,队列长度直接决定单条消息大小——高峰期一条 inv 能塞进上百条条目。新版本换成了令牌桶配速:给每个对端配一只随时间补充的”喊话额度桶”,队列积压超过目标水位(源码里的积压容量常量 300)就先压着慢慢放,并把积压情况定期写进日志(带心跳字段)。效果是:突发流量下每条 inv 更短、节奏更稳,代价是单笔交易的”首次可见延迟”在极端拥堵时可能被拉长。

它如何影响观感

两个可观察现象由此而来。第一,把同一笔交易先后广播到两个节点,几乎不可能严格同一毫秒被第三方看到——涓流让”谁先见到”带有秒级随机噪声,这也是隐私文献建议别用广播时序做关联分析的原因。第二,钱包”发送后查询 RPC 却查不到”:交易此刻可能停在源节点的待发队列里等下一个时钟窗口,并不等于广播失败。

一条验证实验

想亲眼看到节拍,可以搭两台 regtest 节点(regtest 不显式下达挖矿命令就不出块,交易只能待在内存池里被广播):从其中一个节点连发几十笔小额交易,然后在第三方节点上挂日志统计 inv 到达时间——你会看到它们不是鱼贯而入,而是一批一批地跳出来,批与批的间隔落在几秒量级。再做一个对照:把交易数量减半重跑,单批 inv 的条目数随之变小,但节拍不变。这组实验同时演示了两件事——涓流的攒批行为,以及”条目多不等于到得快”。同类观察也适用于隐私分析:任何基于”谁先收到”做推断的链上指纹,都要先扣掉这几秒的机制噪声。

部署视角的三条建议

第一条,别把”多节点直连广播”当玄学:向两三个不同运营方、不同地域的公开节点各自提交同一笔已签名交易,等于绕过单点时钟窗口,覆盖面立竿见影;这也是不少钱包内置多服务器广播的原因。第二条,监控面板上给”节点可见延迟”留出至少五秒的容差再告警,否则涓流本身就能制造假故障。第三条,自建节点做隐私敏感操作时,理解入向连接看到的是你 5 秒一批的节奏,出向是 2 秒一批——你的交易最可能先被哪类邻居看到,答案就写在这两个常数里。

常见误区

首先要明确:涓流时钟不是命令行参数,普通用户的配置文件里没有它的位置,调它是开发者在测试里做的事。误区一:把”节点慢半拍”归因于带宽,多数场景瓶颈是时钟窗口而非带宽。误区二:拿 inv 到达顺序推断手续费优先级,那是矿工组块时的事。误区三:担心涓流暴露隐私——它提供的是秒级抖动这层弱保护,需要配合交易广播策略(比如钱包默认向全部对等广播的行为选择)一起评估,工具链如 dandelion 类提案就是在这条线上做文章,是否启用取决于实现。

快速问答

问:想加快”被全网看到”怎么办? 答:向多个不同 AS 的公开节点直连提交,比单点广播更快形成覆盖面。

问:出向 2 秒、入向 5 秒意味着我收到公告最多慢 5 秒? 答:量级如此,这是设计内的时延,不代表节点故障。

问:区块也走涓流吗? 答:区块公告绕过涓流,优先送达。

风险提示:本文仅为技术与机制科普,不构成任何投资建议,也不构成对任何软件、交易对或收益的承诺;涉及资产操作前请以当期官方文档为准,并自行承担操作风险。