基礎概念 入門
區塊鏈
Blockchain
又稱:鏈
區塊鏈是一種革命性的分散式資料結構,由一連串按時間順序連接的區塊組成。每個區塊包含一批交易記錄和前一個區塊的雜湊值,形成一個不可篡改、完全透明、無需信任的鏈式結構。比特幣區塊鏈是這項技術的首個成功實現,自 2009 年運行至今從未中斷。
區塊鏈的本質
什麼是區塊鏈?
最簡單的理解:
區塊鏈 = 一本分散式帳本
- 記錄所有交易
- 按時間順序排列
- 所有人都有副本
- 無法篡改歷史
技術定義:
區塊鏈 = 雜湊連接的區塊序列
- 每個區塊包含前區塊的雜湊
- 修改任何區塊會破壞整條鏈
- 透過共識機制添加新區塊
為什麼叫「區塊」+「鏈」?
區塊(Block):
- 一批交易的容器
- 包含元數據(時間、難度等)
- 約每 10 分鐘產生一個
鏈(Chain):
- 區塊透過雜湊連接
- 形成時間順序
- 不可斷裂或分叉(長期)
視覺化:
[區塊 0] → [區塊 1] → [區塊 2] → ... → [區塊 N]
↑ ↑ ↑
創世區塊 包含區塊 0 包含區塊 1
的雜湊 的雜湊
核心特性
不可篡改性
為什麼無法篡改?
雜湊連接機制:
區塊 N 的雜湊 = SHA256(區塊頭 N)
區塊 N+1 的區塊頭包含區塊 N 的雜湊
如果修改區塊 N:
1. 區塊 N 的雜湊改變
2. 區塊 N+1 的區塊頭失效
3. 區塊 N+1 的雜湊改變
4. ... 所有後續區塊都失效
加上工作量證明:
- 每個區塊需要大量計算
- 重建整條鏈需要超過全網 50% 算力
- 經濟上不可行
去中心化
傳統系統 vs 區塊鏈:
傳統系統:
[中央伺服器]
/ | \
用戶A 用戶B 用戶C
- 單點故障
- 依賴信任
- 可被審查
區塊鏈:
[節點A] ←→ [節點B]
↕ ↕
[節點C] ←→ [節點D]
- 無單點故障
- 無需信任
- 抗審查
透明性
所有交易公開可查:
區塊鏈瀏覽器:
- blockstream.info
- mempool.space
- blockchain.info
可以查詢:
- 任何地址的交易歷史
- 任何交易的詳細資訊
- 任何區塊的內容
- 整條鏈的狀態
隱私考量:
- 地址不直接關聯身份
- 但交易模式可能洩露資訊
- 需要額外隱私措施
無需許可
任何人都可以:
✓ 運行節點
✓ 驗證交易
✓ 發送交易
✓ 挖掘區塊
不需要:
✗ 註冊帳號
✗ 提供身份證明
✗ 獲得批准
✗ 支付訂閱費
這就是「無需許可」的含義
區塊鏈結構
區塊連接
每個區塊包含前區塊的雜湊:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 區塊 100 │ │ 區塊 101 │ │ 區塊 102 │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ prev_hash: │◄────│ prev_hash: │◄────│ prev_hash: │
│ 00000abc... │ │ 00000def... │ │ 00000123... │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ 交易列表 │ │ 交易列表 │ │ 交易列表 │
└─────────────┘ └─────────────┘ └─────────────┘
箭頭方向:
- 每個區塊指向前一個區塊
- 從最新區塊可以追溯到創世區塊
鏈的分叉
暫時分叉(正常現象):
兩個礦工同時找到區塊:
[區塊 N]
/ \
[區塊 N+1a] [區塊 N+1b]
解決方式:
- 網路選擇更長的鏈
- 較短的分支被拋棄
- 通常 1-2 個區塊後解決
永久分叉(協議分歧):
- 硬分叉:不兼容的協議更改
- 例:Bitcoin Cash(2017)
- 產生兩條獨立的鏈
最長鏈規則
Nakamoto Consensus:
規則:累積工作量最多的鏈是有效鏈
為什麼是「工作量」而非「長度」?
- 難度不同的區塊工作量不同
- 累積難度更準確
- 防止低難度攻擊
實際應用:
- 節點總是選擇累積難度最高的鏈
- 收到更長的鏈時,切換到新鏈
- 舊鏈的區塊成為孤塊
區塊鏈狀態
UTXO 集
區塊鏈的「當前狀態」:
UTXO Set = 所有未花費的交易輸出
特點:
- 不斷變化(每個區塊更新)
- 約 1 億個 UTXO(2024)
- 大小約 4-5 GB
為什麼重要?
- 驗證交易只需查 UTXO 集
- 不需要掃描整條鏈
- 大幅提高效率
區塊高度
區塊高度 = 區塊在鏈中的位置
創世區塊:高度 0
第一個區塊:高度 1
...
當前(2024):高度 ~850,000+
用途:
- 唯一識別區塊位置
- 計算減半時間
- 時間鎖功能
區塊深度(確認數)
確認數 = 當前高度 - 交易所在區塊高度 + 1
範例:
當前高度:850,000
交易在區塊:849,995
確認數:850,000 - 849,995 + 1 = 6
安全性:
1 確認:可能被重組
3 確認:小額交易足夠
6 確認:傳統建議的安全值
100 確認:Coinbase 獎勵可用
比特幣區塊鏈統計
鏈的規模
比特幣區塊鏈統計(2024):
總區塊數:~850,000+
總大小:~550+ GB
總交易數:~9 億+
總地址數:~10 億+
增長速度:
每 10 分鐘:~1-2 MB
每天:~150-200 MB
每年:~50-70 GB
歷史里程碑
| 日期 | 事件 | 區塊高度 |
|---|---|---|
| 2009-01-03 | 創世區塊 | 0 |
| 2010-05-22 | 首次實物交易(披薩日) | ~57,043 |
| 2012-11-28 | 第一次減半 | 210,000 |
| 2016-07-09 | 第二次減半 | 420,000 |
| 2017-08-24 | SegWit 啟用 | 481,824 |
| 2020-05-11 | 第三次減半 | 630,000 |
| 2021-11-14 | Taproot 啟用 | 709,632 |
| 2024-04-20 | 第四次減半 | 840,000 |
區塊鏈運作機制
交易生命週期
1. 創建交易
用戶簽名並廣播交易
2. 進入記憶池
節點驗證並暫存待確認交易
3. 礦工打包
選擇交易放入新區塊
4. 工作量證明
找到有效的 nonce
5. 區塊廣播
新區塊傳播到全網
6. 節點驗證
所有節點驗證新區塊
7. 確認累積
後續區塊不斷增加確認數
共識過程
如何達成共識?
1. 所有節點遵循相同規則
2. 獨立驗證每個區塊
3. 選擇累積工作量最大的鏈
4. 拒絕無效區塊
共識規則包括:
- 區塊大小限制
- 區塊獎勵數量
- 簽名驗證
- 時間戳規則
- 難度調整算法
- ...等等
區塊傳播
新區塊如何傳播?
傳統方式(inv/getdata):
1. 礦工發送區塊雜湊(inv)
2. 節點請求區塊內容(getdata)
3. 礦工發送完整區塊
Compact Blocks(BIP-152):
1. 發送區塊頭 + 短 TXID
2. 節點從記憶池重建區塊
3. 只請求缺失的交易
傳播時間:
- 95% 節點:< 10 秒
- 全網:< 30 秒
區塊鏈安全
51% 攻擊
如果攻擊者控制超過 50% 算力:
可以做:
- 雙花自己的交易
- 阻止特定交易確認
- 重組最近的區塊
不能做:
- 偷取他人的幣
- 創造無中生有的幣
- 改變歷史交易(深度區塊)
- 改變共識規則
成本估算(2024):
- 硬體成本:數十億美元
- 電力成本:數千萬美元/天
- 攻擊後 BTC 價格崩跌
- 經濟上不理性
抗審查性
為什麼區塊鏈難以審查?
1. 去中心化節點
- 全球數萬個節點
- 無法全部關閉
2. 礦工競爭
- 多個礦池競爭
- 被一個拒絕的交易會被其他礦工打包
3. 匿名性
- 無需身份驗證
- 可使用 Tor 等匿名網路
4. 開源軟體
- 代碼公開
- 任何人可以運行節點
節點類型
全節點
全節點(Full Node):
功能:
- 儲存完整區塊鏈
- 獨立驗證所有交易
- 參與交易中繼
- 執行共識規則
要求:
- 儲存空間:~550+ GB
- 頻寬:~200 GB/月
- RAM:~2+ GB
- 運行 24/7 最佳
軟體:
- Bitcoin Core
- btcd
- libbitcoin
輕節點(SPV)
SPV = Simplified Payment Verification
功能:
- 只下載區塊頭
- 依賴全節點驗證交易
- 使用 Merkle 證明
優勢:
- 儲存需求低(~50 MB)
- 快速同步
- 適合手機錢包
缺點:
- 信任全節點
- 隱私較低(洩露地址)
- 無法獨立驗證規則
歸檔節點
歸檔節點(Archive Node):
功能:
- 儲存完整區塊鏈
- 保留所有歷史狀態
- 提供完整索引
用途:
- 區塊瀏覽器
- 分析服務
- 開發測試
要求:
- 儲存空間:> 1 TB
- 高性能硬碟
- 索引資料庫
區塊鏈與其他分散式系統
與傳統資料庫比較
| 特性 | 區塊鏈 | 傳統資料庫 |
|---|---|---|
| 控制 | 去中心化 | 中心化 |
| 修改 | 只能追加 | 可讀寫刪 |
| 信任 | 無需信任 | 信任管理員 |
| 效能 | 較低 | 較高 |
| 透明 | 公開 | 受限 |
公有鏈 vs 私有鏈
公有鏈(如比特幣):
- 任何人可參與
- 無需許可
- 真正去中心化
- 激勵機制(挖礦獎勵)
私有鏈/聯盟鏈:
- 受限參與者
- 需要許可
- 部分去中心化
- 通常無挖礦
比特幣是唯一真正的公有鏈實現
開發者資源
連接區塊鏈
// 使用 bitcoinjs-lib
const bitcoin = require('bitcoinjs-lib');
// 解析區塊
function parseBlock(blockHex) {
const block = bitcoin.Block.fromHex(blockHex);
return {
hash: block.getId(),
version: block.version,
prevHash: block.prevHash.reverse().toString('hex'),
merkleRoot: block.merkleRoot.reverse().toString('hex'),
timestamp: block.timestamp,
bits: block.bits,
nonce: block.nonce,
transactions: block.transactions.length,
};
}
Bitcoin Core RPC
# 區塊鏈資訊
bitcoin-cli getblockchaininfo
# 獲取區塊數量
bitcoin-cli getblockcount
# 獲取難度
bitcoin-cli getdifficulty
# 獲取鏈狀態
bitcoin-cli getchaintips
# 驗證區塊鏈
bitcoin-cli verifychain
# 獲取記憶池資訊
bitcoin-cli getmempoolinfo
區塊鏈同步
# 快速同步(假設區塊有效)
bitcoind -assumevalid=<blockhash>
# 修剪模式(只保留最近區塊)
bitcoind -prune=550
# 僅下載區塊頭
bitcoin-cli getblockheader <blockhash>
# 重建索引
bitcoin-cli reindex
常見問題
區塊鏈可以被刪除嗎?
理論上不可能:
1. 分散存儲
- 全球數萬節點
- 每個節點有完整副本
- 無法同時刪除所有副本
2. 持續運行
- 新區塊不斷產生
- 網路持續活躍
- 只要有一個節點就能恢復
3. 經濟激勵
- 礦工有動力維護網路
- 用戶有動力運行節點
區塊鏈會不會太大?
當前狀況(2024):
區塊鏈大小:~550 GB
年增長:~50-70 GB
解決方案:
1. 修剪模式
- 只保留 UTXO 集
- 刪除已花費的交易
- 約需 5-10 GB
2. 假設有效
- 跳過舊區塊的簽名驗證
- 加快同步速度
- 信任特定檢查點
3. 技術進步
- 儲存成本下降
- 頻寬增加
- 壓縮技術改進
所有節點都要儲存完整鏈嗎?
不一定:
全節點:
- 儲存完整鏈
- 獨立驗證一切
- 最高安全性
修剪節點:
- 儲存區塊頭 + UTXO
- 可驗證新交易
- 無法提供歷史資料
SPV 節點:
- 只儲存區塊頭
- 依賴全節點
- 最低儲存需求
建議:
- 有能力就運行全節點
- 支持網路去中心化
區塊鏈速度為什麼這麼慢?
設計權衡:
去中心化 ←→ 效能
比特幣選擇:
- 優先去中心化和安全
- 犧牲部分效能
- ~7 TPS on-chain
為什麼不能更快?
1. 區塊需要傳播到全網
2. 所有節點都要驗證
3. 更快 = 更多分叉 = 更不安全
解決方案:
Layer 2(如閃電網路)
- 鏈下交易
- 即時確認
- 數百萬 TPS 潛力