首页
/ Bitcoin Core BIP 实现全景图:从 doc/bips.md 到源码证据的协议功能演进全解读

Bitcoin Core BIP 实现全景图:从 doc/bips.md 到源码证据的协议功能演进全解读

2026-09-06 11:40:49作者:董灵辛Dennis

本文以 Bitcoin Core 仓库中的官方 BIP 实现清单 doc/bips.md 为主体,完整梳理 Bitcoin Core 已实现的 45+ 项 BIP(Bitcoin Improvement Proposal):包括每一项的引入版本、生效块高度或协议版本号、对应的命令行开关与配置项,并结合 src/protocol.hsrc/deploymentinfo.cppsrc/init.cppsrc/chainparamsbase.cpp 等源码位置给出可验证的实现证据。读完后,你可以快速定位某个网络协议特性、共识软分叉或钱包功能“从哪个版本开始可用、由哪个源码模块承载、如何配置或禁用”,为阅读协议代码、编写节点配置和验证链行为提供一份权威地图。

一、doc/bips.md:Bitcoin Core 的官方 BIP 实现台账

doc/bips.md 是 Bitcoin Core 仓库中对 BIP 支持情况的权威记录,开篇即声明其定位:

BIPs that are implemented by Bitcoin Core.

它的价值不在于介绍每个 BIP 的技术细节,而在于给出三条关键信息:哪个版本引入何时在网络/链上真正生效(例如主网激活的块高度、协议版本号或日历日期)、实现对应的 PR 编号。这些信息是判断一个节点版本能否参与某类网络行为、验证一笔交易或一个区块是否符合当前规则的基线依据。

从文档内容看,这些 BIP 大致可以归为四类,本文后续各节即按此脉络展开:

类别 覆盖的 BIP 典型代表
共识与软分叉 BIP 9/34/65/66/68/90/112/113/141/143/144/145/147/323/340/341/342/431/433 SegWit、Taproot、CSV
P2P 网络协议 BIP 14/21/22/23/30/31/35/37/61/130/133/152/155/157/158/159/324/339/434 紧凑区块、addrv2、BIP324 v2 传输
地址格式与钱包/HD 派生 BIP 11/13/16/32/42/43/44/49/84/86/173/350/327/328/379/380–387/390 Bech32m、BIP86 派生、MuSig2、Miniscript
测试网络与工具 BIP 94/325/174/371/373/176 Testnet4、Signet、PSBT RPC

二、共识与软分叉:版本位、埋葬机制与 BIP 323

2.1 BIP 9 与 BIP 90:软分叉激活框架

doc/bips.md 记录了两项奠定共识升级机制的 BIP:

  • BIP 9:允许多个软分叉并行部署,自 v0.12.1 实现(PR #7575)。
  • BIP 90:自 v0.14.0 起(PR #8391),BIP 34、65、66 的激活触发机制被简化为直接按块高度检查,不再需要版本位信令。

从当前源码看,这套“埋葬”(buried)部署机制集中在 src/deploymentinfo.cpp 中:DeploymentName() 将内建部署映射为 bip34bip65bip66csvsegwit 五个名字,GetBuriedDeployment() 支持按名称查找(见 src/deploymentinfo.cpp#L18-L50)。而 VersionBitsDeploymentInfo 数组在当前版本中仅保留 testdummy 一项——这表明主网的 BIP 9 软分叉流程在当前代码中已无活跃的部署项,历史上通过 BIP 9 激活的共识升级(如 SegWit、Taproot)均已转入“永远生效”状态。

2.2 各软分叉/规则类 BIP 的引入与生效时间线

以下为 doc/bips.md 中记录的全部共识相关 BIP 的时间线(“buried”指激活机制被“埋入”代码、不再依赖信令):

BIP 内容 引入版本 生效/关键节点
BIP 34 区块必须包含高度(coinbase input);v2 区块 v0.7.0 对 v2 区块自块 224413(2013-03-05)生效;v1 区块自块 227931(2013-03-25)起被禁止
BIP 30 禁止与未完全花费的旧交易同 txid 的新交易 v0.6.0 自 2012-03-15 生效
BIP 42 修复块 13440000 后补贴恢复的缺陷 v0.9.2 缺陷修复
BIP 65 CHECKLOCKTIMEVERIFY(CLTV)软分叉 v0.12.0 回移(backport)至 v0.11.2、v0.10.4;仅内存池的 CLTV 见 PR #6124
BIP 66 严格 DER 签名规则,v3 区块 v0.10.0
BIP 68 序列锁(Sequence locks) v0.12.1 v0.19.0buried(PR #16060)
BIP 112 CHECKSEQUENCEVERIFY(CSV) v0.12.1 v0.19.0buried(PR #16060)
BIP 113 中位时间锁时间(Median time past)锁时间计算 v0.12.1 v0.19.0buried(PR #16060)
BIP 141/143/144/145 隔离见证(Segregated Witness):共识层、v0 见证签名、总体方案与 GBT 更新 v0.13.0 主网定义自 v0.13.1;自 v0.19.0buried(PR #16060)
BIP 147 NULLDUMMY 软分叉 v0.13.1 v0.19.0buried(PR #16060)
BIP 340/341/342 Taproot:Schnorr 签名、Tapscript 叶等校验规则 v0.21.0 主网激活自 v0.21.1;自 v24.0 起永远激活(PR #23536)
BIP 323 软分叉信令中忽略 BIP 9 的 bits 5–28,未知软分叉告警同步处理 v32.0
BIP 431 nVersion=3 交易为标准交易,按 TRUC(Topologically Restricted Until Confirmation)处理 v28.0
BIP 433 支付至锚点(Pay to Anchor, P2A)输出的花费成为标准交易 v28.0

三、P2P 网络协议:消息类型、服务位与传输层

3.1 协议消息与版本演进

doc/bips.md 记录了 P2P 层一系列协议消息的引入及其伴随的协议版本提升:

  • BIP 14(v0.6.0):subversion 字符串作为 User Agent 使用。
  • BIP 31(v0.6.1):pong 消息,协议版本提升至 60001
  • BIP 35(v0.7.0):mempool 消息,协议版本提升至 60002;自 v0.13.0 起仅对 NODE_BLOOM(BIP 111)对端可用。
  • BIP 37(v0.8.0):交易中继的布隆过滤、区块的部分 Merkle 树(merkleblock),协议版本提升至 70001,用于支持低带宽 SPV 客户端。自 v0.19.0 起默认禁用,可用 -peerbloomfilters 选项重新启用。
  • BIP 61(v0.9.0):reject 消息,协议版本提升至 70002。自 v0.17.0 起可通过 -enablebip61 配置是否发送;v0.18.0 起被标记为弃用(默认禁用);v0.20.0 起支持被移除(PR #15437)。
  • BIP 155(v0.21.0):addrv2sendaddrv2 消息,支持 Tor V3 等网络的地址中继(PR #19954)。
  • BIP 339(v0.21.0):按 wtxid(见证交易 id)中继交易(PR #18044)。

这些消息类型在 src/protocol.h 中有对应定义与文档注释,例如 ADDRV2/SENDADDRV2 的注释直接引用 BIP155(见 src/protocol.h#L76-L87),MERKLEBLOCK 的注释标明其 “since protocol version 70001 as described by BIP37”(见 src/protocol.h#L97-L102)——源码注释与 doc/bips.md 的版本记录相互印证。

3.2 服务位(Service Bits):BIP 111 / 159

服务位是对端能力协商的核心:

  • BIP 111NODE_BLOOM 服务位自 v0.13.0 加入,并对所有对端版本强制执行(PR #6579、#6641)。
  • BIP 159NODE_NETWORK_LIMITED 服务位自 v0.16.0 开始通告(PR #11740),自 v0.17.0 开始 Bitcoin Core 会主动连接这类节点(PR #10387)。

3.3 区块与区块头传输优化

  • BIP 130(v0.12.0):直接区块头通告(direct headers announcement),对端版本 >=70012 时协商。
  • BIP 133(v0.13.0):feefilter 消息的收发,对端版本 >=70013
  • BIP 152(v0.13.0):紧凑区块传输(Compact Block Transfer)及关联优化(PR #8068)。
  • BIP 157/158(Compact Block Filters for Light Clients):自 v0.19.0 起可建立过滤器索引(PR #14121),自 v0.21.0 起向 P2P 对端提供(PR #16442)。索引实现的入口在 src/index/blockfilterindex.cpp,由配置项 -blockfilterindex=<type> 控制(见 src/init.cpp#L561 的参数注册)。

3.4 BIP 324:v2 传输协议

  • BIP 324:v2 传输协议及 NODE_P2P_V2 服务位自 v26.0 支持,但默认关闭(PR #28331);自 v27.0 起默认开启(PR #29347)。
  • 对应配置项为 -v2transport(默认值由 DEFAULT_V2_TRANSPORT 决定),参数定义见 src/init.cpp#L603。从源码结构看,src/net.cppCConnman 的连接建立路径按“本地服务与对端服务同时具备 NODE_P2P_V2”来决定使用 v2 传输(如 use_v2transport(GetLocalServices() & NODE_P2P_V2) 这类判断遍布入站与出站连接逻辑),即 v2 是逐连接协商的,而非全局开关。

3.5 BIP 434:对端特性协商

BIP 434(Peer Feature Negotiation)自 v32.0 起支持(PR #35221)。这是对 BIP 324 时代“服务位 + 版本号”协商方式的进一步抽象,使新特性不再必须挤占服务位空间。

四、挖矿与支付协议:BIP 22/23 与 BIP 70–72

  • BIP 22(v0.7.0):getblocktemplate(GBT)挖矿 RPC 协议(PR #936)。
  • BIP 23(v0.10.0rc1):GBT 扩展,包括 longpolling 与区块提案(block proposals)(PR #1816)。
  • BIP 70/71/72(Payment Protocol):支付协议支持自 v0.9.0 起随 GUI 可用(PR #5216);自 v0.18.0 起可在构建时选择禁用(PR #14451);自 v0.19.0 起默认构建禁用(PR #15584);v0.20.0 起被移除(PR #17165)。

五、地址格式、钱包与 HD 派生

5.1 地址与输出格式

  • BIP 13(v0.6.0):P2SH 地址格式。
  • BIP 21(v0.6.0):bitcoin: 支付 URI 格式。
  • BIP 173(v0.16.0):原生 SegWit 输出的 Bech32 地址(PR #11167);自 v0.20.0 起 Bech32 地址成为默认生成格式(PR #16884)。
  • BIP 350(v22.0):v1+ 原生见证输出使用 Bech32m 编码替代 Bech32(PR #20861)。
  • 上述编解码实现的落点包括 src/bech32.cppsrc/key_io.cppsrc/outputtype.cpp

5.2 HD 钱包派生路径:BIP 32 / 43 / 44 / 49 / 84 / 86

  • BIP 32(v0.13.0):分层确定性钱包(Hierarchical Deterministic Wallets,PR #8035)。
  • BIP 43/44/49/84:v0.21.0 引入的实验性描述符钱包(descriptor wallets)默认采用这些 BIP 提出的派生方式(PR #16528)。
  • BIP 86:自 v23.0 起,描述符钱包默认采用 BIP 86 派生(PR #22364),即 m/84'/0'/0' 路径下的 Bech32 单币钱包成为 createwallet 的缺省行为。
  • 描述符体系的完整语法另见 doc/descriptors.md

5.3 Miniscript 与 MuSig2 描述符

  • BIP 379(Miniscript):v24.0 部分实现(PR #24148),v26.0 完整实现(PR #27255)。
  • BIP 327/328(MuSig2 签名与派生):musig() 描述符支持的密钥聚合自 v30.0(PR #31244),签名能力自 v31.0(PR #29675)。
  • BIP 390(MuSig2 描述符):解析于 v30.0(PR #31244),签名于 v31.0(PR #29675)。
  • 核心实现位于 src/musig.cppsrc/musig.h 及描述符/签名模块 src/script/descriptor.cppsrc/script/sign.cpp,其底层依赖 src/secp256k1/src/modules/musig/ 内置的 secp256k1-zkp MuSig 模块。
  • BIP 380–385(Output Script Descriptors 与大部分 Script Expressions):自 v0.17.0 实现(PR #13697)。
  • BIP 386tr() 描述符):自 v22.0(PR #22051)。
  • BIP 387(Tapscript 多签描述符):自 v24.0(PR #24043)。

六、PSBT 与交易工具:BIP 11 / 16 / 174 / 371 / 373

  • BIP 11(v0.6.0):多签(multisig)输出成为标准输出。
  • BIP 16(v0.6.0):P2SH 求值规则,2012-04-01 生效(PR #748)。
  • BIP 174(PSBT,Partially Signed Bitcoin Transactions):操作 PSBT 的 RPC 自 v0.17.0 提供(PR #13557);格式细节可继续阅读 doc/psbt.md
  • BIP 371(PSBT 的 Taproot 字段):自 v24.0(PR #22558)。
  • BIP 373(PSBT 的 MuSig2 字段):自 v30.0(PR #31247)。
  • PSBT 的序列化与字段处理实现集中在 src/psbt.cppsrc/psbt.h
  • BIP 176:GUI(QT)中以 Bits 为单位显示金额,自 v0.16.0(PR #12035)。

七、测试网络:BIP 94 与 BIP 325

  • BIP 94(Testnet4)-testnet4 选项自 v28.0 支持(PR #29775)。当前源码中 -testnet 参数说明已标注 testnet3 弃用、建议迁移:

    -testnet:  Use the testnet3 chain. Equivalent to -chain=test. Support for
              testnet3 is deprecated and will be removed in an upcoming release.
              Consider moving to testnet4 now by using -testnet4.
    -testnet4: Use the testnet4 chain. Equivalent to -chain=testnet4.
    

    参数注册见 src/chainparamsbase.cpp#L20-L21,Testnet4 基础链参数(如 RPC 端口 48332)的构造见 src/chainparamsbase.cpp#L48。可用的链名清单定义为 main, test, testnet4, signet, regtestsrc/chainparamsbase.h#L55),且 -regtest-signet-testnet-testnet4-chain 至多启用其一(校验逻辑见 src/common/args.cpp#L938-L942)。Testnet4 的初始种子节点列表收录于 contrib/seeds/nodes_testnet4.txt

  • BIP 325(Signet):签名测试网自 v0.21.0 支持(PR #18267);配套的取币工具与说明见 contrib/signet/README.md

八、功能生命周期管理:启用、弃用与移除

doc/bips.md 中最具实践价值的部分,是对多个 BIP 功能全生命周期的追踪。以下汇总当前文档中记录到的“从可用到移除”轨迹,便于在部署节点时判断某项能力在当前版本是否可用:

BIP 功能 引入 弃用/默认禁用 移除 相关配置项
BIP 37 布隆过滤 SPV 支持 v0.8.0 v0.19.0 起默认禁用 —(保留) -peerbloomfilters
BIP 61 reject 消息 v0.9.0 v0.18.0 起弃用(默认禁发) v0.20.0 -enablebip61(v0.17.0–v0.19.x)
BIP 70–72 Payment Protocol v0.9.0(GUI) v0.19.0 起构建默认关闭 v0.20.0 构建期选项
BIP 324 v2 传输 v26.0(默认关) —(v27.0 起默认开) -v2transport
BIP 35 mempool 消息 v0.7.0 v0.13.0 起仅限 NODE_BLOOM 对端

这些开关的注册位置均可在 src/init.cpp 中检索到,例如 -peerbloomfilterssrc/init.cpp#L604)与 -v2transportsrc/init.cpp#L603),配合各参数的默认值宏(DEFAULT_PEERBLOOMFILTERSDEFAULT_V2_TRANSPORT 等)即可确认节点启动时的实际行为。从源码结构看,-peerbloomfilters 还与 src/net_permissions.h 中的对端权限模型联动(注释指明“即使 -peerbloomfilters 为 false 也可查询 bloom filter”的例外情形)。

九、如何继续阅读

需要注意的前提:doc/bips.md 中的版本与块高度信息描述的是历史事实(某 BIP 在哪个版本/哪个块被实现或激活);而某个 BIP 功能在当前版本的默认开关状态(如 -peerbloomfilters-v2transport、描述符钱包的 BIP 86 派生),应以 src/init.cpp 中的参数注册与默认值宏为准,必要时用 bitcoind -args 查看实际默认值。

登录后查看全文
热门项目推荐
相关项目推荐