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

BIP-60 定长 “version” 消息(中继交易字段)

提议把 version 消息中的 relay 字段定为固定必备字段、协议版本升至 70002,解决 BIP-37 引入的可选字段给反序列化带来的麻烦。提案最终关闭,未成为现行规则。本 BIP 目前处于已关闭状态。

一、档案卡

档案卡
编号BIP-60
标题Fixed Length "version" Message (Relay-Transactions Field)
作者Amir Taaki <[email protected]>
指定日期2013-06-16
层级Peer Services(对等服务)
类型Specification(规范类)
状态Closed(已关闭)
阅读版https://bips.dev/60
官方原文https://github.com/bitcoin/bips/blob/master/bip-0060.mediawiki

二、放在哪一族

P2P 网络协议的消息格式族,直接因 BIP-37 而起:BIP-37 给 version 消息加了一个标志,表明是否要向该节点中继新交易消息,协议版本随之升到 70001。

BIP-60 处理的是这个改动的“后遗症”:relay 标志成了 version 消息流中的一个可选部分。它还引用了 BIP-14(User Agent),version 消息中的 user_agent 字段即出自该规范。

三、它要解决什么

原文的批评集中在“可选字段”破坏了比特币消息的两条性质:

一句话:问题不在 relay 标志本身,而在它以“有就读、没有就算”的可选形式存在。

四、规则本身

4.1 version 消息的完整字段表

原文给出的 version 负载字段依次为:

原文同时重申握手流程:节点建立出站连接后立即公布自己的 version,远程节点以自己的 version 回应;双方交换完 version 之前不能有进一步通信。version 包被接受后,应回送一个 “verack” 包。当时已分配的 services 值只有 1(NODE_NETWORK,表示可向该节点索取完整区块而非仅区块头)。

4.2 具体的代码层面改动

要义是:把 relay 从“可选尾巴”变成该协议版本下每个 version 消息都必备的定长收尾字段,恢复第二节所述的长度可校验与流式解析性质。

五、谁必须动

普通持币人:无直接变化,不涉及交易与地址。

钱包开发者:完整节点钱包无感;直接实现 P2P 握手的轻客户端实现者,才需要按版本处理 version 消息的字段构成。

全节点与矿工:若当年实施,节点需按 70002 的格式发送 version 并能正确解析。它最终关闭,因此没有成为必须执行的现行要求。

共识层:本 BIP 不修改共识规则,只涉及对等节点之间握手消息的格式。

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

状态为 Closed(已关闭)——不算数。它提出的“70002 + relay 必备字段”没有成为现行规则;本页保留它,是因为它把“为什么消息格式要定长”这条协议设计原则讲得最清楚。

常见误读:

“BIP-60 被关闭,说明 relay 字段本身是个错误设计、后来被移除了。”

不对。原文从头到尾没有反对 relay 标志的功能——它由 BIP-37 引入,表明节点是否接收中继交易。作者反对的是它的存在形式:作为可选字段破坏定长与可校验性。关闭的是这份“改成必备字段”的提案,不是 relay 字段本身。

七、延伸

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