想要真正看懂“比特币源码”而不是“百度百科”?本文用产品经理听得懂的语言,系统拆解比特币协议六层架构、读写代码时最常踩的坑,以及 2025 年仍在使用的实战范例。收藏这一篇就够!
目录
- 比特币技术概览
- 共识奠基:工作量证明 & Merkle 树
- 架构剖析:区块、交易与网络
- 拥有权与签名:P2PK、P2PKH、P2SH 全流程
- 链式结构:最长链规则与挖矿流程
- 常见问题 FAQ
- 延伸阅读 & 冷启动实战
1 比特币技术概览
关键词:比特币协议、区块链、去中心化
比特币并非简单的一条链,而是一套“ 去中心化价值转移协议 ”。它由三层积木搭成:
- 数据层:区块头、交易体、UTXO
- 激励层:Coinbase 交易、手续费、减半
- 共识层:PoW、难度调整、最长链原则
任何想用代码“再造”比特币的人,都必须先把它拆成最小可复用颗粒,再重新拼装。
2 共识奠基:工作量证明 & Merkle 树
2.1 工作量证明(Proof of Work)
工作量证明的核心是“ 难题易验证、解题耗算力 ”。比特币使用两次 SHA256 作为哈希函数:
- 目标值
T
:可由 nBits 解码得出 - 随机数
nonce
:4 字节,通常先扫一遍再改 coinbase 数据 - 成功率
P = T / 2²⁵⁶
,平均需计算1 / P
次
代码伪例片段:
uint256 hash = Hash(block_header);
while (hash > target) {
++nonce;
if (nonce == 0) IncrementCoinbase();
hash = Hash(block_header);
}
👉 5 分钟自建 PoW 迷你链体验挖矿快乐
2.2 Merkle 树
Merkle 树让 O(log n) 的轻节点验证成为可能:
- 叶子节点:每笔交易的 double-SHA256
- 中间节点:左右孩子拼接后再哈希
- 奇数节点:最后一个节点复制,确保双分支
实战场景:SPV 钱包只需下载 80 字节区块头 + 32 字节 Merkle 证明
,就能确信交易已被确认。
3 架构剖析:区块、交易与网络
3.1 区块结构(Block)
字段 | 类型 | 说明 |
---|---|---|
nVersion | int32_t | 区块版本,当前 2 |
HashPrevBlock | uint256 | 上一块头哈希 |
HashMerkleRoot | uint256 | 交易树的根哈希 |
nTime | uint32_t | Unix 时间戳 |
nBits | uint32_t | “紧凑格式”目标难度 T |
nNonce | uint32_t | 随机数 |
vtx[] | CTransaction[] | 交易列表 |
3.2 交易解析(Transaction)
类型细分:
- 常规交易:UTXO 转账
- Coinbase:系统补贴与矿工奖励
3.2.1 常规交易基础字段
vin[]
:输入 = 前一笔输出(TxID + index)+ 解锁脚本vout[]
:输出 = 金额(Satoshi,1 BTC = 1e8)+ 锁定脚本nLockTime
:绝对时间或区块高度后方能上链
3.2.2 Coinbase 交易
- 仅含 1 个输入,TxID =
0000…0000
,index =0xFFFFFFFF
- coinbase 数据段:必须包含区块高度(BIP34)+ 自定义数据(矿池名/祝福)
金额公式:
Reward = 区块补贴 + Σ(交易输入 - 交易输出)
比特币 2025 年区块补贴 = 3.125 BTC(第 5 次减半后)。
4 拥有权与签名:四大标准交易模式
关键词:脚本、P2PKH、P2SH、Multisig、Nulldata
4.1 Script 语言
- 基于栈、非图灵完备
- 挑战脚本 (
scriptPubkey
) 定义花钱条件 - 响应脚本 (
scriptSig
) 负责满足条件并提供签名
4.2 P2PKH(Pay-to-PubkeyHash)
最常用、普通钱包默认可见格式:
scriptPubkey: OP_DUP OP_HASH160 <pubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubkey>
执行堆栈动图:
步骤 | 栈状态示例 |
---|---|
Push sig | [sig] |
Push pubkey | [sig, pubkey] |
DUP | [sig, pubkey, pubkey] |
HASH160 | [sig, pubkey, pubkeyHash] |
EQUALVERIFY | [sig, pubkey] |
CHECKSIG | [true] |
地址生成流程:
公钥 → SHA256 → RIPEMD160 → 加版本+校验 → Base58 → 1xxxxx…
4.3 P2SH(Pay-to-ScriptHash)
把完整条件脚本二次哈希,缩减地址长度:
- 地址开头
3xxxx...
- 花费时,需要在
scriptSig
里提供赎回脚本 + 需满足的签名
示例:3-5 多签压缩后可存 1-of-12 配置,注意尺寸上限 1650 bytes(下版本将增到 1650)。
4.4 Multisig & Nulldata
- Multisig:
m {pubkey... } n OP_CHECKMULTISIG
- Nulldata:
OP_RETURN <40 bytes>
,用于存证、NFT metadata
👉 用 Nulldata 20 字节发一条永不消失的“链上微博”
5 链式结构:最长链规则与挖矿流程
5.1 区块链时间戳与重组
- 区块高度变化共识:工作量最大
- 若出现 2 块同期产生 → 接受先收到者
- 6 确认惯例:从统计概率上极难深度重组
5.2 挖矿三步曲
- 收集交易:过滤非标准、双花、过量 fee
- 验证 & 组织:构建 Merkle、确定 coinbase
找 nonce & coinbase 微调:
header = Version || Prev || MerkleRoot || Time || Bits || Nonce while true: if Hash(header) < Target: broadcast else: ++Nonce; if overflow: tweak coinbase extraNonce
难度每 2016 块动态调整,2025 年常态全网 Hashrate > 6e20 H/s。
6 常见问题 FAQ
Q1:测试网络用主网地址会丢币吗?
A:会。Testnet 地址以 m/n
开头,Mainnet1/3/bc1
,合约地址版本号不同,直接导致资产不可找回。
Q2:多重签名的 gas 费用怎么估算?
A:每笔签名为 71-73 字节(DER + SIGHASH),加上脚本本体即可用公式 TxFee = ceil(tx_size/1000) * FeeRate
,Testnet 当前 1 sat/vB。
Q3:为何我需要 nLockTime?
A:可构造「延迟支付」或「可撤销承诺交易」,常见于闪电网络 HTLC。
Q4:密钥丢了怎么办?
A:只有助记词加派生路径才能恢复。如果未备份且地址为 P2PKH,谁也救不了;P2SH 多签只剩一把备用钥匙仍有机会。
Q5:CPU 挖还能否回本?
A:全网难度已让单独的 CPU 无功而返,但可用来写 模拟脚本或在 Signet 体验流程。
7 延伸阅读 & 冷启动实战
- BIP32/39/44:掌握助记词派生,零基础也能自己写 HD 钱包
- SegWit / Taproot:2025 年新地址节省 42% 交易费
- 闪电网络 LND:基于 HTLC 的微支付通道,零确认秒到
最后用 10 行 Core 源码回顾灵魂:validation.cpp
的 ConnectBlock
,即整条链能否合法上账的最高法院位置。看懂后,再读任何链白皮书都不过是一份“兵书”。