协议演进 / 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
- 新增一条名为
disabletx的消息,内容为空,仅以消息类型标识; - 实现本 BIP 的节点,协议版本须为 70017 或更高。
4.2 什么时候发
- 若节点在给某对等节点的 version 消息中把交易中继字段设为 false,且对方协议版本 ≥ 70017,则可以(MAY)向对方发送 disabletx;
- 若要发,必须在发送 verack 之前发出;
- 交易中继字段未出现或为 true 时,绝不能(MUST NOT)发送 disabletx。
4.3 发出或收到之后,禁发的消息
一方只要发送过或收到过 disabletx,双方就都不得再在这条连接上发送以下消息:
- 交易的
inv、notfound、getdata消息; - merkleblock 的
getdata(BIP-37); filteradd/filterload/filterclear(BIP-37);feefilter(BIP-133)、mempool(BIP-35);tx消息本身。
另建议(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 是让一个节点彻底关掉交易中继。”
不对。它是逐条连接的声明,只约束发出声明的那一条连接在整个生命周期内的用途;同一个节点完全可以同时保持其他全功能、正常中继交易的连接。关掉的也不是“这个节点的中继功能”,而是“这条连接不被用于交易中继”这一件具体的事。
七、延伸
- 阅读版:https://bips.dev/338
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0338.mediawiki
- 相关:BIP-37 连接布隆过滤、BIP-152 紧凑区块中继、BIP-339 基于 WTXID 的交易中继
- 仓库总目录:https://github.com/bitcoin/bips
