这条连接只传块不传交易:BIP-338 disabletx 与区块中继专连 图 1
这条连接只传块不传交易:BIP-338 disabletx 与区块中继专连 · 图 1

比特币网络里有两类流量:新区块需要它以最高优先级涌向每个角落,交易和地址公告则细碎量大。多数连接两样都干,但自 2019 年起,Bitcoin Core 开始悄悄维护另外一类连接——只用来传块。BIP-338 就是给这种“只传块”的连接补一句协议层宣言:disabletx,一条空消息,意思很朴素,本条连接这辈子不做交易中继。Suhas Daftuar 起草,2020 年 9 月 3 日立项,最终 Closed。

先看没有这句话时的尴尬。version 握手消息里有一个交易中继标志位,BIP-37 引入,设为 false 表示“这条连接别推交易给我”。但标志位是连接建立瞬间的一次性表态,之后的生命周期里谁也无法改变,接收方也无从判断对方是“永远只传块”还是“暂时没开、待会儿会开”。更重要的是,这类连接还会忽略对方发来的地址消息,可这件事对方根本不知道,仍会把地址往这里投,白费双方的带宽与注意力。换句话说,网络已经跑着一种协议文本没有名字的关系。

disabletx 把关系钉死。规范条款逐条看:消息本体为空,类型串就是 disabletx;实现它的节点协议版本必须升到 70017 以上;只有当我在 version 里已经把交易中继字段设成 false,才允许对协议版本不低于 70017 的对端发送它,而且必须赶在 verack 之前;反过来,中继字段缺省或为 true 时严禁发送。一旦双方任一方向对端发过或收过 disabletx,这条连接上就禁止出现交易类 inv、交易 notfound、交易 getdata、默克尔块请求、布隆过滤器系列消息、feefilter、mempool 以及 tx 消息本身;地址类 addr 与 addrv2 则是建议不发。它明确不规定其他消息类型的去留,节点也可以决定不与发 disabletx 的对端保持连接——我这条公网位置宝贵,优先留给会传交易的人。

为什么要这么麻烦?提案的动机段给出两个层层递进的理由。第一,低带宽的额外块传播路径让网络分区攻击更难打——多一条只传块的边,等于给区块洪水多加一条渠道。第二,这类连接不接受也不转发地址,攻击者想拼出网络拓扑图就更难,拼不出图,制造分区的成本就更高。而让“我是低资源连接”显式化,节点就能更聪明地分配有限的入站配额:同样要拒人,优先把带宽留给全功能对端,同时保留住这些便宜又结实的块通道。这里能读到一条网络工程的常识:能表达的语义越精确,资源调度就越不浪费。

它的命运值得一提:状态是 Closed,因为底层行为早在 Core 里跑了很多年——版本消息的中继字段本来就够用,新消息带来的边际收益没能说服维护者加一条新协议;但它描述的连接形态和思路继续活在实现里。把“提案失败”与“功能失败”分开,是读 BIP 史最重要的一个透镜。

常见误区。第一,“收到 disabletx 说明对方被攻击或掉线”——不是,它只是连接性质声明。第二,“块中继连接能替代全节点间的正常中继”——交易发现与费率市场完全依赖普通连接,块连接只是传播冗余。第三,“disabletx 会永久关闭重开交易中继的可能”——按规范就是一条连接的终身契约,想要交易去用别的连接。

快速问答。问:普通用户需要配置什么?答:什么都不用;Core 默认自动维护这类出站连接。问:它和 BIP-339 那个仅中继压缩块的方案什么区别?答:那一份谈压缩块传输的兼容性,这一份谈连接身份,互不重叠。问:怎么观察?答:在节点的 peers 列表里,块中继连接通常被标注为 block-relay-only 类型。

一个观察入口补充在实践层面。Bitcoin Core 的 peers 信息里,块中继连接与全功能连接会在连接类型上区分开来,运维者可以数一数当前维持着几条这样的廉价边;若数量长期为零,往往是防火墙或出站策略掐掉了额外连接,值得回查配置。另有一个常被忽略的细节:这类连接在重启后会尝试重连此前记住的对端,让节点的块传播邻居在升级维护后不必完全洗牌——BIP-338 想要表达的“低资源长期关系”,在实现侧其实连记忆策略都配好了。读协议提案时把这类实现细节一起看,能避免把“规范没写”误读成“功能不存在”。

风险提示:本文讨论已关闭的协议草案与现网机制,不构成任何投资或运维建议。