區塊結構
了解比特幣區塊的內部結構,包括區塊頭、Merkle 樹和 Coinbase 交易。
區塊概覽
比特幣區塊是交易的容器,大約每 10 分鐘產生一個。 每個區塊包含兩個主要部分:區塊頭(Block Header)和交易列表(Transactions)。
┌─────────────────────────────────────┐ │ Block Header │ │ (固定 80 bytes) │ ├─────────────────────────────────────┤ │ Transaction Count │ │ (1-9 bytes, VarInt) │ ├─────────────────────────────────────┤ │ Transactions │ │ ┌─────────────────────────┐ │ │ │ Coinbase Transaction │ │ │ └─────────────────────────┘ │ │ ┌─────────────────────────┐ │ │ │ Transaction 1 │ │ │ └─────────────────────────┘ │ │ ┌─────────────────────────┐ │ │ │ Transaction 2 │ │ │ └─────────────────────────┘ │ │ ... │ └─────────────────────────────────────┘
區塊頭 (Block Header)
區塊頭固定為 80 bytes,包含 6 個欄位。這 80 bytes 經過雙重 SHA-256 雜湊後, 就是我們常說的「區塊雜湊」(Block Hash)。
| 欄位 | 大小 | 說明 |
|---|---|---|
| version | 4 bytes | 區塊版本號,用於軟分叉信號 |
| prev_block | 32 bytes | 前一區塊的雜湊值 |
| merkle_root | 32 bytes | 所有交易的 Merkle 樹根 |
| timestamp | 4 bytes | Unix 時間戳(秒) |
| bits | 4 bytes | 難度目標的壓縮表示 |
| nonce | 4 bytes | 礦工用於 PoW 的隨機數 |
版本號 (Version)
版本號不僅表示區塊格式版本,在 BIP-9 之後還用作軟分叉的信號機制。 礦工可以在版本號的特定位元表示對提案的支持。
難度目標 (Bits)
bits 欄位是難度目標的壓縮表示,採用「指數-係數」格式。 完整的 256 位目標值從這 4 bytes
計算得出:
# bits = 0x1903a30c 為例
指數 = 0x19 = 25
係數 = 0x03a30c
目標 = 係數 × 2^(8×(指數-3))
= 0x03a30c × 2^(8×22)
= 0x0000000000000003a30c00000000000000000000000000000000000000000000 Merkle 樹
Merkle 樹是一種二元雜湊樹,用於高效地彙總區塊中的所有交易。 只需 32 bytes 的 Merkle 根,就能代表數千筆交易。
Merkle Root
│
┌────────────┴────────────┐
│ │
Hash AB Hash CD
│ │
┌─────┴─────┐ ┌─────┴─────┐
│ │ │ │
Hash A Hash B Hash C Hash D
│ │ │ │
Tx A Tx B Tx C Tx D Merkle 證明 (SPV Proof)
Merkle 樹允許輕節點驗證交易是否包含在區塊中,而無需下載完整區塊。 只需提供交易雜湊和「兄弟節點」路徑,即可重建到 Merkle 根。
優點
- • 高效的交易存在證明
- • 證明大小 O(log n)
- • 適合輕錢包
限制
- • 無法證明交易不存在
- • 依賴節點誠實提供證明
- • 需要區塊頭鏈驗證
Coinbase 交易
每個區塊的第一筆交易稱為 Coinbase 交易,它有特殊的結構和用途:
- • 創造新幣:這是唯一能憑空創造比特幣的交易
- • 收取手續費:區塊中所有交易的手續費歸礦工
- • 無輸入:輸入欄位為特殊的「null」輸入
- • 100 區塊成熟期:需等待 100 個確認才能花費
區塊獎勵
區塊獎勵每 210,000 個區塊(約 4 年)減半:
| 時期 | 區塊範圍 | 獎勵 | 年份 |
|---|---|---|---|
| 第 1 期 | 0 - 209,999 | 50 BTC | 2009-2012 |
| 第 2 期 | 210,000 - 419,999 | 25 BTC | 2012-2016 |
| 第 3 期 | 420,000 - 629,999 | 12.5 BTC | 2016-2020 |
| 第 4 期 | 630,000 - 839,999 | 6.25 BTC | 2020-2024 |
| 第 5 期 | 840,000 - ... | 3.125 BTC | 2024-2028 |
Coinbase 任意數據
Coinbase 交易的輸入可以包含最多 100 bytes 的任意數據。著名例子:
# 創世區塊 (Block 0) 的 Coinbase 數據 "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks" # 這是中本聰留下的時間戳證明, # 引用了當天《泰晤士報》的頭條新聞
區塊大小限制
傳統限制 (1 MB)
2010 年,中本聰加入了 1 MB 區塊大小限制,以防止垃圾交易攻擊。
SegWit 後 (4 MWU)
SegWit 引入了「區塊重量」概念,取代簡單的字節限制:
區塊重量 = (非見證數據 × 4) + (見證數據 × 1) 最大重量 = 4,000,000 weight units (4 MWU) # 實際效果 # - 純傳統交易:最大 ~1 MB # - 純 SegWit 交易:最大 ~2.3 MB # - 混合交易:介於兩者之間
查看區塊信息
使用 Bitcoin Core RPC 查看區塊詳情:
# 獲取最新區塊雜湊 bitcoin-cli getbestblockhash # 獲取區塊詳情 bitcoin-cli getblock <blockhash> # 獲取區塊頭 bitcoin-cli getblockheader <blockhash> # 獲取特定高度的區塊 bitcoin-cli getblockhash <height> bitcoin-cli getblock $(bitcoin-cli getblockhash 0) # 創世區塊
相關文檔: 查看 區塊鏈 RPC 了解更多區塊查詢命令。