跳至主要內容
協議 進階

工作量證明

Proof of Work

又稱:PoW

工作量證明(Proof of Work,簡稱 PoW)是比特幣的核心共識機制,要求參與者消耗真實的計算資源(電力和硬體)來證明其對網路的貢獻。這個機制巧妙地解決了分散式系統中的「拜占庭將軍問題」,讓互不信任的節點能夠就區塊鏈的狀態達成共識。

工作量證明的本質

核心思想

關鍵洞見:

「容易驗證,難以產生」

類比:
- 數獨:填完很難,驗證很快
- 拼圖:拼好很慢,看結果立即知道對錯
- 挖礦:找 nonce 很難,驗證雜湊很簡單

比特幣的實現:
找到一個數字 x,使得 SHA256(SHA256(區塊頭 + x)) < 目標值
- 找到:需要大量嘗試
- 驗證:一次雜湊計算

數學表達

問題定義:

給定區塊頭 H(80 bytes)
找到 nonce n,使得:

SHA256(SHA256(H || n)) < T

其中:
H = 版本 || 前區塊雜湊 || Merkle根 || 時間戳 || 難度位 || n
T = 目標值(由難度決定)
|| = 連接操作

難度 D 與目標值 T 的關係:
T = T_max / D
T_max = 0x00000000FFFF0000...(難度 1 的目標)

為什麼這樣設計有效?

安全性來源:

1. 雜湊函數的不可預測性
   - 無法預測什麼輸入產生什麼輸出
   - 只能暴力嘗試

2. 計算的不可逆性
   - 無法從目標值反推 nonce
   - 沒有捷徑

3. 驗證的高效性
   - 任何人可以快速驗證
   - 去中心化驗證

4. 累積性
   - 工作量無法偽造
   - 歷史工作量保護歷史區塊

挖礦過程詳解

步驟一:準備區塊

礦工構建候選區塊:

1. 收集記憶池中的交易
2. 按手續費率排序
3. 構建 Coinbase 交易
   - 區塊獎勵 + 手續費
   - 礦工地址
   - 可包含任意數據(如礦池標識)

4. 計算 Merkle 根
5. 組裝區塊頭

步驟二:嘗試 Nonce

def mine_block(block_header, target):
    """
    簡化的挖礦演算法
    """
    nonce = 0
    max_nonce = 2**32  # 約 43 億

    while nonce < max_nonce:
        # 更新區塊頭中的 nonce
        header = block_header[:76] + nonce.to_bytes(4, 'little')

        # 計算雙重 SHA-256
        hash_result = sha256(sha256(header))

        # 檢查是否滿足目標
        if int.from_bytes(hash_result, 'big') < target:
            return nonce, hash_result

        nonce += 1

    # Nonce 用盡,需要修改其他參數
    return None

步驟三:擴展 Nonce 空間

當 32 位 nonce 用盡(約 43 億次嘗試):

解決方案:

1. 修改時間戳
   - 增加 1 秒
   - 產生不同的區塊頭

2. 修改 Coinbase 的 extraNonce
   - 改變 Coinbase 交易
   - Merkle 根隨之改變
   - 重新開始嘗試 nonce

3. 修改交易順序
   - 不同的 Merkle 根
   - 較少使用

現代礦機:
- 主要使用 extraNonce
- 可擴展到 2^64 或更多嘗試空間

步驟四:廣播區塊

找到有效 nonce 後:

1. 組裝完整區塊
2. 廣播到網路
3. 其他節點驗證
4. 驗證通過後添加到鏈上
5. 礦工獲得區塊獎勵

時間競爭:
- 先廣播的區塊更可能被接受
- 網路延遲很關鍵
- 礦池通常使用專用中繼網路

難度調整

為什麼需要調整?

問題:
- 礦工數量變化
- 硬體效率提升
- 需要維持 10 分鐘平均出塊時間

沒有難度調整會怎樣?
- 算力增加 → 出塊加快 → 供應失控
- 算力減少 → 出塊變慢 → 網路停滯

難度調整確保:
- 無論算力多少,平均 10 分鐘出塊
- 比特幣發行按計劃進行
- 網路穩定運行

調整機制

調整週期:每 2016 個區塊(約 2 週)

計算公式:
新難度 = 舊難度 × (實際時間 / 目標時間)
新難度 = 舊難度 × (actual_time / 2016 × 10 分鐘)

限制條件:
- 最多增加 4 倍
- 最多減少到 1/4
- 防止極端波動

範例:
如果 2016 區塊用了 1 週(而非 2 週):
新難度 = 舊難度 × (10080 / 20160)
新難度 = 舊難度 × 0.5
難度減半(出塊會變慢到正常)

等等,這不對?用時更短說明算力增加,應該增加難度:
新難度 = 舊難度 × (20160 / 10080)
新難度 = 舊難度 × 2
難度翻倍

難度歷史

難度演進:

2009:難度 1(最低)
2010:難度 ~1,000
2013:難度 ~10,000,000
2016:難度 ~200,000,000,000
2020:難度 ~20,000,000,000,000
2024:難度 ~80,000,000,000,000+

增長因素:
- ASIC 礦機發展
- 挖礦產業化
- 更多資本投入

工作量證明的安全性

51% 攻擊分析

攻擊條件:
控制超過 50% 的全網算力

攻擊能力:
1. 雙花攻擊
   - 發送交易 A 給商家
   - 私下挖掘包含衝突交易 B 的區塊
   - 等區塊 A 被確認後
   - 發布更長的包含 B 的鏈
   - 交易 A 被逆轉,商品已到手

2. 交易審查
   - 拒絕打包特定交易
   - 需要持續控制才有效

3. 空塊攻擊
   - 只挖空塊
   - 降低網路吞吐量

攻擊成本

51% 攻擊的經濟分析(2024):

全網算力:~500 EH/s
需要控制:~250 EH/s

硬體成本:
- 最新 ASIC:~200 TH/s
- 需要:125 萬台
- 每台成本:~$5,000
- 總硬體成本:~$60 億

電力成本:
- 每台功耗:~3.5 kW
- 總功耗:~4.4 GW
- 電費($0.05/kWh):~$500 萬/天

還有:
- 攻擊後 BTC 價格暴跌
- 硬體價值歸零
- 法律風險

結論:經濟上極不理性

確認數與安全性

確認數 vs 逆轉成本:

1 確認:
- 逆轉機率:理論上可能
- 攻擊成本:約 $20 萬
- 建議:小額交易

3 確認:
- 逆轉機率:非常低
- 攻擊成本:約 $60 萬
- 建議:一般交易

6 確認:
- 逆轉機率:接近零
- 攻擊成本:約 $120 萬
- 建議:大額交易

計算方式:
攻擊成本 ≈ 確認數 × 區塊獎勵價值 × 攻擊成功率調整

自私挖礦

自私挖礦(Selfish Mining)攻擊:

策略:
1. 找到區塊後不立即廣播
2. 繼續私下挖掘
3. 在特定時機發布
4. 讓誠實礦工浪費算力

效果:
- 攻擊者獲得超過其算力比例的收益
- 需要 > 33% 算力才有顯著優勢
- 需要 > 25% 算力加上良好網路連接

防禦:
- 隨機選擇同高度區塊
- 監控礦池行為
- 區塊傳播優化

能源與環境

能源消耗

比特幣網路能耗(2024 估計):

年耗電量:~150-200 TWh

對比:
- 相當於一個中型國家(如阿根廷)
- 小於全球黃金開採
- 小於傳統金融系統

能耗來源:
- ASIC 礦機運算
- 冷卻系統
- 基礎設施

能源辯護

支持者的觀點:

1. 安全是有成本的
   - 銀行金庫也消耗能源
   - 軍事防禦也消耗能源
   - 比特幣在保護數萬億美元

2. 可再生能源比例高
   - 估計 50-60% 使用可再生能源
   - 礦工追求最便宜的電力
   - 往往是過剩的可再生能源

3. 能源價格信號
   - 礦工利用廢棄能源
   - 平衡電網負載
   - 激勵能源基礎設施建設

4. 去中心化的必要代價
   - PoS 等替代方案有其他問題
   - 真正的去中心化需要真實成本

能源創新

礦工的能源策略:

1. 廢棄天然氣發電
   - 利用油田的伴生氣
   - 減少甲烷排放
   - 變廢為寶

2. 水電過剩
   - 雨季水電過剩
   - 礦工利用廉價電力
   - 補貼水電站

3. 核能
   - 穩定的基載電力
   - 低碳排放
   - 部分礦場與核電站合作

4. 供暖
   - 礦機熱量用於供暖
   - 提高能源效率
   - 北歐國家的創新

PoW vs PoS

機制比較

特性工作量證明 (PoW)權益證明 (PoS)
資源消耗電力、硬體鎖定代幣
進入門檻任何人可參與需要最低質押
去中心化較高較低(財富集中)
安全模型外部成本(能源)內部成本(質押)
攻擊成本持續消耗可回收
長程攻擊不可能理論上可能
無利害攻擊不存在需要額外機制

PoW 的獨特優勢

為什麼比特幣堅持 PoW?

1. 公平分發
   - 任何人可以挖礦
   - 不需要先持有代幣
   - 更公平的初始分配

2. 不可偽造的成本
   - 無法複製已做的工作
   - 真實的資源消耗
   - 物理世界的錨定

3. 無利害問題
   - PoS 驗證者沒有外部成本
   - 可以在多個分叉上簽名
   - PoW 只能投入一個分叉

4. 長程攻擊防護
   - PoS 舊私鑰可以重建歷史
   - PoW 歷史無法偽造

5. 簡單性
   - 機制簡單明確
   - 更少的攻擊向量
   - 經過 15+ 年驗證

PoS 的問題

PoS 的已知問題:

1. 富者愈富
   - 質押獎勵給持幣者
   - 強化財富集中
   - 類似傳統金融的問題

2. 無利害問題(Nothing at Stake)
   - 驗證者可以在所有分叉上簽名
   - 不像 PoW 只能選一個
   - 需要複雜的懲罰機制

3. 長程攻擊
   - 獲得舊驗證者私鑰
   - 可以重建整條鏈
   - 需要信任檢查點

4. 初始分配問題
   - 早期持有者永久優勢
   - 類似 ICO 的問題

5. 審查風險
   - 大質押者可被識別
   - 可能受到監管壓力
   - 去中心化程度較低

工作量證明的變體

其他 PoW 算法

算法使用者特點
SHA-256dBitcoin雙重 SHA-256
ScryptLitecoin記憶體密集
EthashEthereum (舊)ASIC 抗性
RandomXMoneroCPU 友好
EquihashZcash記憶體綁定
X11Dash11 種算法鏈

合併挖礦

合併挖礦(Merged Mining):

概念:
同時挖掘多個使用相同 PoW 算法的鏈

比特幣合併挖礦的幣:
- Namecoin
- RSK(側鏈)
- 其他 SHA-256 鏈

好處:
- 不增加額外能耗
- 小鏈獲得比特幣算力保護
- 礦工獲得額外收益

實現:
將小鏈的區塊頭放入 Coinbase 數據中

開發者資源

計算難度目標

def bits_to_target(bits):
    """
    將 nBits 格式轉換為 256 位目標值
    """
    exponent = bits >> 24
    mantissa = bits & 0xFFFFFF

    if exponent <= 3:
        target = mantissa >> (8 * (3 - exponent))
    else:
        target = mantissa << (8 * (exponent - 3))

    return target

def target_to_difficulty(target):
    """
    計算難度值
    """
    max_target = 0x00000000FFFF0000000000000000000000000000000000000000000000000000
    return max_target / target

# 範例
bits = 0x1d00ffff  # 難度 1
target = bits_to_target(bits)
difficulty = target_to_difficulty(target)
print(f"Difficulty: {difficulty}")  # 1.0

驗證工作量證明

const crypto = require('crypto');

function verifyProofOfWork(blockHeader, target) {
  // 計算雙重 SHA-256
  const hash1 = crypto.createHash('sha256').update(blockHeader).digest();
  const hash2 = crypto.createHash('sha256').update(hash1).digest();

  // 轉換為大整數比較
  const hashValue = BigInt('0x' + hash2.reverse().toString('hex'));
  const targetValue = BigInt('0x' + target);

  return hashValue < targetValue;
}

// 範例使用
const header = Buffer.from('...', 'hex'); // 80 bytes 區塊頭
const target = '00000000ffff0000...'; // 目標值
const isValid = verifyProofOfWork(header, target);

Bitcoin Core 相關命令

# 獲取當前難度
bitcoin-cli getdifficulty

# 獲取挖礦資訊
bitcoin-cli getmininginfo

# 獲取網路算力估算
bitcoin-cli getnetworkhashps

# 獲取區塊模板(礦池使用)
bitcoin-cli getblocktemplate '{"rules": ["segwit"]}'

# 提交新區塊
bitcoin-cli submitblock <hexdata>

常見問題

為什麼不能用更環保的方式?

PoW 的「浪費」是特性,不是缺陷:

1. 真實成本 = 真實安全
   - 攻擊需要真實投入
   - 不能憑空創造「工作量」

2. 去中心化保證
   - 任何人可以參與
   - 不需要許可
   - 不依賴信任

3. 公平競爭
   - 富人不能無限增加影響力
   - 受物理限制約束

4. 替代方案的問題
   - PoS:富者愈富
   - PoA:需要信任
   - DPoS:趨向中心化

量子電腦會破壞 PoW 嗎?

量子計算對 PoW 的影響:

Grover 算法:
- 將搜索複雜度從 O(n) 降到 O(√n)
- PoW 需要的嘗試次數變為平方根

影響評估:
- 當前:需要 10^20 次嘗試
- 量子:可能只需 10^10 次

但是:
1. 所有礦工都會升級到量子
2. 難度會相應調整
3. 競爭繼續,只是在更高水平
4. 實用量子電腦還很遠

結論:PoW 基礎不會被破壞

算力集中化是問題嗎?

算力集中的現狀:

礦池集中:
- 前 5 大礦池 > 70% 算力
- 單一礦池最高 ~30%

但這不等於中心化:

1. 礦池 ≠ 礦工
   - 礦工可以隨時切換礦池
   - 礦池不能挪用礦工算力

2. 經濟激勵
   - 惡意礦池會失去礦工
   - 攻擊會損害自身利益

3. 地理分佈
   - 礦工分佈全球
   - 無法被單一政府控制

改進方向:
- Stratum V2:礦工選擇交易
- 更多去中心化礦池
- 更好的 ASIC 分佈
已複製到剪貼簿