Bitcoin Core BIP 实现全景图:从 doc/bips.md 到源码证据的协议功能演进全解读
本文以 Bitcoin Core 仓库中的官方 BIP 实现清单 doc/bips.md 为主体,完整梳理 Bitcoin Core 已实现的 45+ 项 BIP(Bitcoin Improvement Proposal):包括每一项的引入版本、生效块高度或协议版本号、对应的命令行开关与配置项,并结合 src/protocol.h、src/deploymentinfo.cpp、src/init.cpp、src/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() 将内建部署映射为 bip34、bip65、bip66、csv、segwit 五个名字,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.0 起 buried(PR #16060) |
| BIP 112 | CHECKSEQUENCEVERIFY(CSV) | v0.12.1 | 自 v0.19.0 起 buried(PR #16060) |
| BIP 113 | 中位时间锁时间(Median time past)锁时间计算 | v0.12.1 | 自 v0.19.0 起 buried(PR #16060) |
| BIP 141/143/144/145 | 隔离见证(Segregated Witness):共识层、v0 见证签名、总体方案与 GBT 更新 | v0.13.0 | 主网定义自 v0.13.1;自 v0.19.0 起 buried(PR #16060) |
| BIP 147 | NULLDUMMY 软分叉 | v0.13.1 | 自 v0.19.0 起 buried(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):
addrv2与sendaddrv2消息,支持 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 111:
NODE_BLOOM服务位自 v0.13.0 加入,并对所有对端版本强制执行(PR #6579、#6641)。 - BIP 159:
NODE_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.cpp 中CConnman的连接建立路径按“本地服务与对端服务同时具备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.cpp、src/key_io.cpp 与 src/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.cpp、src/musig.h 及描述符/签名模块 src/script/descriptor.cpp、src/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 386(
tr()描述符):自 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.cpp、src/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, regtest(src/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 中检索到,例如 -peerbloomfilters(src/init.cpp#L604)与 -v2transport(src/init.cpp#L603),配合各参数的默认值宏(DEFAULT_PEERBLOOMFILTERS、DEFAULT_V2_TRANSPORT 等)即可确认节点启动时的实际行为。从源码结构看,-peerbloomfilters 还与 src/net_permissions.h 中的对端权限模型联动(注释指明“即使 -peerbloomfilters 为 false 也可查询 bloom filter”的例外情形)。
九、如何继续阅读
- 想验证某 BIP 的实现细节:以 doc/bips.md 中记录的 PR 编号为线索,在
src/下定位对应模块——共识规则在src/consensus/与src/script/,P2P 消息在 src/protocol.h、src/net.cpp 与 src/net_processing.cpp,区块过滤器索引在 src/index/blockfilterindex.cpp。 - 想理解描述符与 MuSig2/Miniscript 语法:从 doc/descriptors.md 入手。
- 想理解 PSBT 字段与
fundpsbt/finalizepsbt工作流:阅读 doc/psbt.md。 - 想部署 testnet4/signet 节点:按 src/chainparamsbase.cpp 中的链名与端口定义,结合 contrib/signet/README.md 配置即可。
需要注意的前提:doc/bips.md 中的版本与块高度信息描述的是历史事实(某 BIP 在哪个版本/哪个块被实现或激活);而某个 BIP 功能在当前版本的默认开关状态(如 -peerbloomfilters、-v2transport、描述符钱包的 BIP 86 派生),应以 src/init.cpp 中的参数注册与默认值宏为准,必要时用 bitcoind -args 查看实际默认值。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00