协议演进 / BIP/比特币改进提案 / BIP-338

BIP-338 禁用交易中继消息

让节点在建连时用一条 disabletx 消息声明:这条连接在整个生命周期内不用于交易中继,从而正式支持只中继区块的低带宽连接。本 BIP 目前处于已关闭状态。

一、档案卡

档案卡
编号BIP-338
标题Disable transaction relay message
作者Suhas Daftuar <[email protected]>
指定日期2020-09-03
层级Peer Services(对等服务)
类型Specification(规范类)
状态Closed(已关闭)
阅读版https://bips.dev/338
官方原文https://github.com/bitcoin/bips/blob/master/bip-0338.mediawiki

二、放在哪一族

对等网络(P2P)协议族,管的是节点之间一条连接用来传什么、不传什么。

它要正式化的,是网络上自 2019 年起已经在用的“只中继区块”连接(block-relay-only connections):发起方把 version 消息里的交易中继字段设为 false——这个字段由 BIP-37 引入、BIP-60 也有定义——只让区块在这条连接上传播,不走交易,也不理会对方发来的 addr 地址消息。

相关文档:

BIP-35:mempool 消息,本 BIP 列入禁用清单

BIP-37:布隆过滤相关消息(filterload 等)与交易中继字段的来源

BIP-133:feefilter 消息,同样列入禁用清单

BIP-152:紧凑区块中继;其消息在 disabletx 连接上仍然允许

BIP-155:addrv2 消息,本 BIP 建议不在这类连接上发送

BIP-339:同作者、同属对等服务层的交易中继改造(改用 wtxid 公告)

三、它要解决什么

只中继区块的连接有两个好处,原文 Motivation 说得很清楚:

问题在于:连接的“低资源”性质目前只有发起方自己知道。version 消息里的交易中继字段不是连接终身设置——按 BIP-37 的语义,对方日后仍可能开启交易中继。于是接收连接的一方分不清:对面是“永远不中继交易”的轻连接,还是“暂时关着、随时会开”的普通节点;也不知道对方会忽略自己公告的地址——若早知道,就会把地址公告优先给别的对等节点。

后果是节点没法放心地对这类连接放宽入站连接数限制。BIP-338 要补的,就是一个终身有效的声明机制。部署后,节点可以区别对待低资源连接与全中继连接,有望提高全网可接纳的只中继区块连接数量。

四、规则本身

4.1 新消息 disabletx

4.2 什么时候发

4.3 发出或收到之后,禁发的消息

一方只要发送过或收到过 disabletx,双方就都不得再在这条连接上发送以下消息:

另建议(RECOMMENDED)不要在这类连接上发送 addr / getaddr 与 addrv2(BIP-155)。地址中继为何只是“建议关”而非“必须关”:原文 Compatibility 一节解释,这是为将来可能出现的、更精细的地址中继协商机制留余地;在没有这类扩展时,按现有软件的行为理解这条建议即可。

其他消息类型的行为本 BIP 不作规定。BIP-152 的全部消息(含 blocktxn、getblocktxn)在 disabletx 连接上仍然允许,只受 BIP-152 自身的协商规则约束。节点也可以选择不与发送 disabletx 的对等节点保持连接——例如它正在找能中继交易的对等节点时。

4.4 兼容性

未实现本 BIP 的节点照常兼容:实现方不会给发来 disabletx 的对等节点中继交易(前提是已实现 BIP-37 或 BIP-60),地址仍可能周期性中继,实现方不应仅因此断开这类对等节点。本提案与 BIP-37 兼容,但彼此独立。

五、谁必须动

普通持币人:无感。交易格式、地址、共识规则都不变。

全节点开发者:实现 disabletx 的发送条件、时序(verack 之前)与禁发清单;并据此实现区别对待的入站连接限制。

只中继区块连接的发起方:在交易中继字段为 false 的前提下,按规则发出 disabletx,把“我这条连接只传区块”从自知变成对方也知。

节点运营者:升级后可以更放心地接纳更多低带宽的区块中继连接;也可以按原文保留的权利,断开只发 disabletx、不能满足自己中继需求的对等节点。

共识层:完全不涉及。本 BIP 只改对等协议的消息约定。

六、现在算不算数,以及一个常见误读

状态为 Closed(已关闭)。要分清两件事:只中继区块这种连接方式本身,按原文记载自 2019 年起已有软件部署在网络上使用(原文引用 Bitcoin Core 自 0.19.0.1、2019 年 11 月起实现该功能);而 BIP-338 这份“用一条专用消息来正式标识它”的提案,仓库状态已是 Closed,不再作为现行规范推进。原文给出的实现链接是 Bitcoin Core 的 PR #20726。

常见误读:

“disabletx 是让一个节点彻底关掉交易中继。”

不对。它是逐条连接的声明,只约束发出声明的那一条连接在整个生命周期内的用途;同一个节点完全可以同时保持其他全功能、正常中继交易的连接。关掉的也不是“这个节点的中继功能”,而是“这条连接不被用于交易中继”这一件具体的事。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。