跳转到内容

Bitcoin Core — 比特币参考实现

是什么

Bitcoin Core 是比特币官方维护的全节点软件,用 C++ 写——你机器跑起来后,会和全网几万台同类节点对话,自己下载并完整验证每一笔交易、每一个区块,不需要相信任何第三方。

日常类比:

  • 托管钱包(交易所、网页钱包)= 让别人帮你看银行账本——你只看到余额数字,账本真假别人说了算
  • Bitcoin Core = 自己搬一套银行账本副本回家——硬盘上躺着完整 600+ GB 区块链,每一笔来去自己核对

最小启动姿势就一句:

Terminal window
bitcoind -daemon
bitcoin-cli getblockchaininfo

第一句把节点跑起来在后台同步,第二句问”链状态怎么样”。两条命令之间是几天的全量下载和上千万笔签名校验——从 2009 年创世块到今天的每一笔比特币转账,都被你这台机器亲自验证过才算数。

为什么重要

不理解 Bitcoin Core 这套东西,下面的事都没法解释:

  • 为什么”区块链不可篡改”不是口号——Bitcoin Core 每个全节点独立验证所有规则,篡改一笔就等于让全网几万节点同时点头,成本不划算
  • 为什么比特币没 CEO、没公司,但 17 年没崩——协议规则就写死在 Bitcoin Core 源码里,谁想改谁发 BIP 提案,全节点不升级新规则就不生效
  • 为什么交易所跑路用户血本无归,而”自己跑节点 + 自己钱包”的人不会——前者是别人的账本副本,后者是自己的
  • 为什么”以太坊轻节点 / 移动端钱包”也得最终向某个全节点查询——只有全节点完整跑过共识规则,链上的每一字节都是它亲眼校验过的

核心要点

Bitcoin Core 干的事可以拆成 3 件

  1. UTXO 模型(“一摞面额不一的纸钞”):账户余额不存”100 BTC”这种数,只存一堆未花的硬币堆(Unspent Transaction Output)。花一笔就消掉若干堆、产出新堆,找零是新堆的一种。类比:钱包里有 50 + 20 + 10 三张钞票,买 60 块东西就拆 50+20,找回 10。无并发冲突天然适合分布式。

  2. PoW 共识(“算力投票决定谁能记账”):每 10 分钟全网矿工抢解一道哈希题(穷举 nonce 让 SHA-256 输出前若干位是 0),赢家把这一批交易打包成新块,全网节点验证后接到链尾。算力多 = 中奖概率高,造假区块 = 重做后续所有题,经济上不划算

  3. 软分叉 + 全节点验证(“规则只能变更严,且旧节点能继续跑”):协议升级(SegWit、Taproot)通过软分叉——新规则是旧规则的子集,旧节点看不懂但不会出错。Bitcoin Core 是活态规范:BIP 提案合并进主仓后,那一刻起规则正式生效。

三件事缺一个就不成立:UTXO 给了”账本结构”,PoW 给了”谁能写”,软分叉给了”规则怎么演化”。理解任意一条都得带着另外两条看。

实践案例

案例 1:本地 regtest 模式挖一笔出来

Terminal window
bitcoind -regtest -daemon
bitcoin-cli -regtest createwallet "demo"
addr=$(bitcoin-cli -regtest getnewaddress)
bitcoin-cli -regtest generatetoaddress 101 "$addr"
bitcoin-cli -regtest getbalance

regtest 是本地私链,难度调到 1,几毫秒能挖一个块。第三行生成新地址,第四行向自己挖 101 个块(成熟期是 100),第五行余额会显示约 50 BTC(创世奖励)。整个过程不联网、不烧电——但走的是和主网完全一样的代码路径。学共识机制最快的姿势。

案例 2:通过 RPC 看链状态

Terminal window
bitcoin-cli getblockchaininfo
bitcoin-cli getblock $(bitcoin-cli getbestblockhash) 2

getblockchaininfo 返回当前高度、难度、最近软分叉激活情况;getbestblockhash 拿链尾哈希,再喂给 getblock 第二参数 2 表示展开所有交易。配合 bitcoin-cli help 列出 100+ 个 RPC——gettxoutgetmempoolinfoestimatesmartfee 是最常用的三件套。

案例 3:构造一笔 2-of-3 多签交易

Terminal window
bitcoin-cli -regtest createmultisig 2 \
'["pubkey1","pubkey2","pubkey3"]'
# 输出 redeemScript 和 P2SH 地址
bitcoin-cli -regtest sendtoaddress "$multisig_addr" 1.0
# 然后用 PSBT 流程让任意 2 把私钥签名后广播

多签把”花这笔需要 N 把钥匙里凑齐 M 把”写进锁定脚本里。企业冷钱包、跨国托管、家庭遗产钱包都靠它——doc/multisig-tutorial.md 有完整 PSBT(部分签名比特币交易)流程,规模化场景的标准工艺。

踩过的坑

  1. 首次同步要 600+ GB 硬盘 + 几天时间——主网区块链已经很大,机械硬盘做不到,必须 SSD;可用 prune=2000 配置只保留最近 2 GB 块(牺牲历史查询能力换空间)。

  2. RPC 默认只绑 127.0.0.1——远程访问要改 bitcoin.confrpcbind + rpcallowip 并设强密码 rpcauth,否则放公网等于把私钥暴露给全互联网(曾有用户因此被洗掉钱包)。

  3. 手续费估错卡内存池——发交易时 estimatesmartfee 6 估”6 个块内确认”的费率,但拥堵期间可能瞬间翻 10 倍,低费率交易永远不上链也不退——要么 RBF(Replace-By-Fee)抬价,要么 CPFP(子交易带母)救出。

  4. master 分支不保证稳定——README 明写”master is regularly built and tested but not guaranteed completely stable”,生产环境必须用 release 分支或 tag(如 v31.0),不要 git pull 主干就上。

适用 vs 不适用场景

适用

  • 想真正去信任化持有比特币——自己跑节点 + 自己钱包私钥,不依赖任何交易所
  • 区块链 / 共识机制学习——本地 regtest 半小时能跑通完整生命周期,比看 PPT 直观 10 倍
  • 给上层应用(区块浏览器、Lightning Network、闪电节点)提供后端 RPC——所有正经基建底下都是它
  • 写比特币相关 BIP 提案——Bitcoin Core 是参考实现,提案不在这跑通就没意义

不适用

  • 移动端 / 浏览器钱包——600 GB 同步不可能,用 SPV 钱包或托管服务
  • 想做”快速 / 便宜”的链上转账——比特币定位是高安全结算层,日常小额用 Lightning Network 或别的链
  • 智能合约 / DeFi——比特币脚本是受限的非图灵完备语言,要复杂合约去看以太坊
  • 隐私敏感场景——链上交易完全公开,地址聚类分析能挖出身份;要隐私用 Monero / Zcash

历史小故事(可跳过)

  • 2008-10-31bitcoin 白皮书发表,作者 Satoshi Nakamoto(化名)。9 页 PDF,提出 PoW + UTXO + 最长链规则。
  • 2009-01-03:v0.1 发布,Satoshi 自己挖出创世块,里面嵌了一句 “Chancellor on brink of second bailout for banks”——影射当年金融危机。
  • 2010-12:Satoshi 把代码交给 Gavin Andresen 后消失,从此项目由社区接手。
  • 2014:项目正式更名 Bitcoin Core(之前叫 Bitcoin-Qt),与协议本身解耦——“协议是比特币,软件是 Bitcoin Core”。
  • 2017-08:SegWit 软分叉激活——把见证数据移出交易主体,扩容 + 修签名延展性 bug,lamport-1978 风格的协议演化典型案例。
  • 2021-11:Taproot 软分叉,引入 Schnorr 签名 + 默克尔抽象语法树,多签和复杂脚本看起来和单签一模一样(隐私 + 节省空间)。
  • 当前(2026-05)~89k stars / 39k forks / 49k commits / v31.0,C++ 65% / Python 19% / C 12%;维护组织 Bitcoin Core 开发者,无中心公司。

仓库里 src/ 是节点代码,test/functional/ 是 Python 端到端测试,doc/ 是 30 多份 markdown(build / 多签 / fuzzing / 隐私网络等),contrib/ 是周边脚本。读代码从 src/init.cpp 入口看 bitcoind 启动流程是最直接的。

学到什么

  1. “参考实现”是一种特殊责任——没有 IETF 文档、没有 ISO 标准,源码合并那一刻 = 协议生效那一刻。Bitcoin Core 的提交记录就是比特币协议的活态历史。

  2. 去中心化的代价是协调成本——README 直言 “testing and code review is the bottleneck”——PR 比能审的多,所有人凭信誉互相盘问。慢是 feature 不是 bug

  3. 软分叉 > 硬分叉——能不分裂就不分裂,旧节点继续跑是协议演化的金标准。和 Web 标准(HTML 向后兼容 30 年)思路一致。

  4. 共识机制 = 经济激励 + 密码学,缺一不可——只有密码学做不到防篡改(paxos / raft 都需要预设可信节点集),只有激励做不到不可逆(中心化系统能 rollback)。

  5. C++ + Python 测试是区块链项目的现实选型——核心节点必须 C++(性能 + 内存控制),但回归测试用 Python(test/functional/test_runner.py 几千个 case 跑通才能合并 PR)。

延伸阅读

关联

  • bitcoin —— 白皮书定义协议,Bitcoin Core 是协议的可执行参考实现
  • paxos —— 经典分布式共识,假设节点身份固定;PoW 把”谁能投票”开放成算力市场
  • raft —— 强一致 + 已知节点集;Bitcoin Core 选了”最终一致 + 开放节点集”的另一极
  • lamport-1978 —— 分布式时序基础;区块高度是比特币的”逻辑时钟”
  • shannon-1948 —— PoW 哈希难题靠的就是密码学哈希的高熵输出,shannon-1948 的信息论是底层
  • sqlite —— Bitcoin Core 默认存钱包用 SQLite(v22 后),存区块索引用 LevelDB——嵌入式数据库选型对照
  • langchain —— 不直接相关,但 LLM agent 想读链上数据时,Bitcoin Core RPC 是最权威的”工具”端点

反向链接

  • argent-x —— Argent X — 让账户本身就是一个合约的 Starknet 钱包
  • atzei-eth-attacks-2017 —— 以太坊智能合约攻击综述 — 12 类漏洞的首次系统分类
  • besu —— Hyperledger Besu — 用 Java 写的以太坊客户端
  • bitcoin —— Bitcoin 白皮书
  • erigon —— Erigon — 存储优化型以太坊客户端
  • filecoin —— Filecoin / Lotus — IPFS 之上的去中心化存储市场
  • foundry —— Foundry — Paradigm 出品的 Rust 合约工具链
  • go-ethereum —— Go-Ethereum (Geth) — 以太坊主流 Go 客户端
  • ipfs —— IPFS / Kubo — 按内容哈希定位的去中心化文件系统
  • lamport-1978 —— Lamport 1978 — 分布式系统里没有”绝对的同时”
  • metamask —— MetaMask — 装在浏览器里的以太坊钱包
  • monero —— Monero — 默认隐私的 PoW 加密货币
  • nethermind —— Nethermind — .NET 写的高性能以太坊客户端
  • paxos —— Paxos — 分布式共识算法
  • prysm —— prysm — 用 Go 写的 Ethereum 共识层客户端
  • rabby-wallet —— Rabby Wallet — 签名前先告诉你”会变成什么样”的 EVM 钱包
  • raft —— Raft — 易理解的共识算法
  • safe-contracts —— Safe — 多签智能账户合约
  • shannon-1948 —— Shannon 1948 — 信息论的诞生
  • sia —— Sia / Renterd — 主机持续打卡才能拿钱的去中心化云存储
  • sqlite —— SQLite — 嵌入式 SQL 数据库
  • teku —— Teku — 用 Java 写的以太坊共识层客户端
  • walletconnect —— WalletConnect — dApp 与钱包之间的加密对讲机
  • wormhole —— Wormhole — 多链之间替你跑腿的”邮政系统”