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

BIP-324 v2 P2P 加密传输协议

为比特币 P2P 网络定义 v2 加密传输协议:机会性加密、伪随机字节流,并能在交换应用消息之前协商传输版本升级。本 BIP 目前处于已部署状态。

一、档案卡

档案卡
编号BIP-324
标题Version 2 P2P Encrypted Transport Protocol
作者Dhruv Mehta <[email protected]>、Tim Ruffing <[email protected]>、Jonas Schnelli <[email protected]>、Pieter Wuille <[email protected]>
指定日期2019-03-08
层级Peer Services(对等服务)
类型Specification(规范类)
状态Deployed(已部署)
取代文档Replaces: BIP-151
阅读版https://bips.dev/324
官方原文https://github.com/bitcoin/bips/blob/master/bip-0324.mediawiki

二、放在哪一族

P2P 网络传输族。比特币节点之间长久以来以明文 v1 协议通信;为这条链路加加密的尝试中,较早的一份是 BIP-151(对等通信加密,状态已关闭),BIP-324 在档案上以 Replaces 取代它,给出了最终成形的 v2 方案。与它同族的还有处理“节点如何找到彼此”的文档,如 BIP-155(addrv2 消息)——本 BIP 的信号机制正是经由 addr 中继传播服务标志,与之衔接。

这一族改的都不是“传什么”,而是“怎么传”:消息语义(version、inv、tx、block 等)保持不变,变的是它们在网线上的样子。

三、它要解决什么

3.1 明文传输的三个毛病

原文动机承认一个前提:比特币是无许可网络,中继的数据本身是公开的,协议也没有密码学身份概念,节点之间长期以未加密、未认证的连接通信。但明文在攻击者面前有严重缺陷,原文列了三条:

3.2 解法:机会性加密+伪随机字节流

新协议(v2)的对策是大幅抬高上述攻击的成本,核心手段是未经认证的、机会性的传输加密,并让线上的字节流对被动窃听者呈现为伪随机(与均匀随机字节不可区分)。

原文逐项说明收益:加密(哪怕未认证、且仅在双方都支持 v2 时使用)迫使窃听者转为主动攻击——要么做持续的中间人攻击,要么把连接降级回 v1,要么自建节点等诚实节点连上来;主动攻击在规模上更耗资源,而对人工建立的刻意连接,即便只是运营者手动比对协议版本与会话 ID 这类基本检查,原则上也能让攻击者露馅。篡改本就是主动攻击,加密后攻击者还被迫维持完整的中间人状态,成本更高。伪随机字节流则排除基于模式匹配的识别,审查防火墙要拦截就得做完整的中间人攻击,或改用更显眼的白名单策略。

3.3 为什么加密却不做认证

原文用整节篇幅回答这一设计取舍:未经认证的加密也严格优于不加密,因此所有连接都应加密,哪怕未认证。至于认证,由于比特币的无许可性质,认证永远只能限于特定场景(例如同一运营者的节点之间),是否需要、需要何种形式的认证取决于具体对端;因此认证应当另行处理。本 BIP 要做的是打好技术地基:导出一个唯一标识加密通道的会话 ID,通道建立后,双方可用任何认证协议确认彼此持有相同的会话 ID(即“通道绑定”)。至于为何不用 TLS、Noise 等通用传输加密协议,原文列出的技术理由包括:它们不提供伪随机字节流、不原生支持 secp256k1、字节流不可塑形、且其流式接口与比特币所需的包式接口不匹配,改造它们会抵消现成方案的复用收益。

四、规则本身

4.1 目标清单

原文给出的目标属性包括:抵御被动攻击的机密性;主动攻击的可观察性(会话 ID 由 Diffie-Hellman 协商确定性导出,运营者可比对以发现中间人);伪随机字节流;字节流可塑形(以抵抗流量分析与审查);前向保密(攻破某一会话秘密不应解密过往会话流量,最后若干个包除外);可升级性(用传输版本机制为认证、后量子握手升级等留路);兼容性(v2 客户端允许入站的 v1 连接,以减小网络分区风险);低开销(计算与带宽成本不应显著增加)。

4.2 规范的三部分

4.3 传输层:三阶段

连接(通常是 TCP/IP)建立后依次经历三个阶段。双方分别称发起方(建立连接者)与响应方(接受连接者)。

密钥交换阶段:双方各自生成随机的临时 secp256k1 私钥,把对应的公钥以 ElligatorSwift 编码为 64 字节发出——原文注明,这种编码使曲线点与均匀随机比特流不可区分。公钥之后可附最多 4,095 字节的任意数据(称 garbage,垃圾数据),既为字节流塑形,也避免“恰好 64 字节”的可识别模式。响应方先判断来流:若开头与“网络魔术字节+version 消息头”组成的 16 字节相符,则按 v1 协议处理;否则按 v2 继续。双方用 X-only ECDH 由私钥与收到的公钥算出共享秘密,再以 HKDF-SHA256 确定性导出四个加密密钥(两个方向各两个:一个加密包长度、一个加密内容)、一个会话 ID,以及两个方向各一个 16 字节的 garbage 终止符;随后各自发出终止符,并在收到对方终止符时结束垃圾段。此后一切通信都是加密包:包带 ignore 位,置位者为诱饵包(decoy),接收方除验密外一律忽略——这是协议主要的塑形机制。每个方向的第一个加密包还会用 AEAD 的关联数据特性认证该方向已发送的垃圾数据,迫使主动攻击者维持完整协议状态。

版本协商阶段:响应方先发一个内容为空的版本包,表示支持本 BIP 的 v2 协议(其他内容保留给未来版本);发起方收到后忽略其内容,再回一个空内容版本包;响应方收到后同样忽略。未来版本如何在此协商新特性,原文留待有需要时再规定编码。

应用阶段:此后交换的包,其内容即按应用层格式解释的 P2P 消息。

原文还规定了包加密的具体构造:基于 ChaCha20-Poly1305 一类的 AEAD,并定义了带重密钥(rekeying)机制的 FSChaCha20Poly1305 与 FSChaCha20 包装,以实现前向保密。

4.4 应用层:更紧凑的消息结构

v2 中一条应用消息由 message_type 与 message_payload 组成:message_type 或为 1 字节的短 ID(1–255),或为 0x00 后跟 12 字节 ASCII 消息类型(与 v1 相同)。原文列出了现行短 ID 表(如 addr、block、tx、ping、addrv2 等各占一位),并说明使用 1 字节 ID 的消息每条比 v1 少 3 字节;同一消息类型若两种编码都定义,接收方必须两种都接受且行为不因编码而异。新增短 ID 应登记进原文维系的消息类型 ID 表以利协调。

4.5 信号:如何宣告支持 v2

支持 v2 的节点在 addr 中继中宣告服务标志 NODE_P2P_V2 = (1 « 11)。原文特别提醒:若发起 v2 连接后被立即断开,客户端应改用 v1 协议重试——因为服务标志经由不可信中介传播且会被多源“或”合并,恶意中介可能虚假宣告某节点支持 v2,用降级重试可以避免节点被这种虚假宣告“黑洞化”。

五、谁必须动

普通持币人:无直接操作。运行节点的用户会间接受益于连接隐私与抗篡改能力的提升;不运行节点者不涉及本 BIP。

全节点与矿工:这是主要的行动方。节点软件要实现 v2 传输:ElligatorSwift 握手、HKDF 密钥导出、加密包的收发与诱饵包处理、版本协商,并宣告 NODE_P2P_V2 服务标志;同时保持接受 v1 入站连接,并在 v2 连接被立即断开时回退 v1 重试。矿工节点同理——原文点名日蚀攻击对矿工的威胁,v2 抬高的正是这类攻击的成本。

钱包开发者:使用自有 P2P 连接的轻钱包(如直接连节点的实现)可按本 BIP 实现 v2 以获得同样的传输保护;经由中心化服务器通信的钱包不在本 BIP 范围内。

共识层:本 BIP 不修改共识规则。它改的是节点间的传输方式;区块与交易的有效性判定一如既往。

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

状态为 Deployed(已部署):这份 v2 传输规范已经定稿并进入实际部署的阶段,成为节点间通信的现行选项之一。它与 v1 长期并存——按原文的兼容性设计,v2 节点接受 v1 入站连接,连接双方都支持 v2 时才走加密通道。因此“已部署”不等于“全网已切换”,更不等于明文 v1 已经消失;具体的网络采用比例不属于原文陈述的范围,本页不臆测。

常见误读:

“BIP-324 给比特币交易上了密,链上数据从此保密了。”

不对。本 BIP 加密的是节点之间传输区块与交易时的链路:让窃听者难以从流量判断交易的来源、时间与连接归属。区块与交易本身仍然是全网公开、可验证的数据——原文开篇即承认中继数据本质公开,它要保护的是元数据与连接完整性,不是把账本变成密文。

七、延伸

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