跳轉到

2016 - 區塊鏈密碼學#

案件摘要#

2008 年 Satoshi Nakamoto 發表比特幣白皮書,2009 年主網上線——第一個沒有中心機構的數位貨幣。它把六十年累積的密碼學拼成一個系統:SHA-256 雜湊(見 1985-密碼學雜湊函數.md)做工作量證明、ECDSA(見 2005-橢圓曲線密碼學.md)簽章驗證交易、Merkle 樹(見 1985-密碼學雜湊函數.md)壓縮區塊驗證、公開金鑰密碼(見 1977-RSA.md)做身分認證。區塊鏈是「不信任任何人」的密碼學工程——數位簽章保證不可偽造,工作量證明使偽造代價高昂。

前因 -- 為什麼會有這個案子#

2008 年金融危機:銀行體系被證明會崩潰(雷曼兄弟倒閉)——對「機構信任」的質疑達到頂峰。Satoshi 的問題:沒有可信的第三方(銀行、政府),能否實現數位現金?

雙重支出問題(double-spending):數位資訊易複製——10 元可以花兩次。需要「分散式共識」決定哪筆交易有效。

傳統解法:需要可信第三方(銀行)驗證交易。Bitcoin 的答案:區塊鏈——所有人維護同一本帳本,用工作量證明協調更新,用多數決決定有效鏈。

線索與推理 -- 數學式、程式、理論#

區塊鏈的密碼學元件#

一個比特幣區塊:

\[ \text{Block} = (\text{prev\_hash}, \text{merkle\_root}, \text{time}, \text{nonce}, \text{target}) \]

四層密碼學:

  1. SHA-256(雜湊):把區頭、交易序列化後雜湊——改一個位元即改 ID
  2. Merkle 樹(結構):交易葉節點 → 內部節點 → 根——SPV 驗證 \(O(\log n)\) (見 1985-密碼學雜湊函數.md)
  3. ECDSA(簽章):簽名 = 私鑰簽的交易雜湊——不可偽造
  4. 工作量證明 PoW(隨機性):找 nonce 使:
\[ \text{SHA256}(\text{block header} \| \text{nonce}) < \text{target} \]

——只能靠運算硬找(無捷径,像 Mersenne 質數或 Enigma 一樣)

工作量證明:隨機性與計算的對話#

為什麼雜湊能防止雙重支出:

  • 花掉同一筆錢寫兩個區塊 → 需要挖兩個有效區塊(PoW)
  • 攻擊者的算力 \(\alpha\) vs 網路總算力 \((1-\alpha)\) → 重組 \(z\) 個區塊的成功率:
\[ P = \sum_{k=0}^{\infty} \frac{\lambda^k e^{-\lambda}}{k!} \left(\frac{\alpha}{1-\alpha}\right)^{z-k} \]

(泊松過程; \(z\) 區塊後仍領先的機率,隨 \(z\) 指數衰減。)

推理:攻擊成本量化——雙花攻擊的成本 \(=\) 挖 \(z\) 個區塊的電費(2013 年需數百萬美元)。這是「經濟安全」而非「密碼學安全」——與 Kerckhoffs 原則(見 1883-Kerckhoffs原則.md)的結合:攻擊者的計算成本就是安全性。

ECDSA 的實戰教訓#

比特幣的簽章是 ECDSA over secp256k1(見 2005-橢圓曲線密碼學.md),但有致命設計問題:

**問題:簽章中的隨機數 \(k\) **(見 1985-ElGamal.md):

\[ s = k^{-1}(H(m) + xr) \bmod n \]
  • 若 \(k\) 重複且簽兩次( \(m_1, m_2\) ): \(k = \frac{H(m_1) - H(m_2)}{s_1 - s_2}\) ——私鑰直接洩漏
  • 2013 年比特幣錢包論壇:同一 \(k\) 兩次簽章 → 大量錢包被盜

對策: - RFC 6979(2013):決定性簽章( \(k\) 從 \(H(sk \| m)\) 導出)——永不重複 - EdDSA(Ed25519,見 2005-橢圓曲線密碼學.md):改進曲線公式,**不需要隨機 \(k\) **——2015 年起比特幣與以太坊逐步採用

偵探筆記:區塊鏈的教訓是「密碼學的實現細節決定安全」——算法本身(ECDSA)安全,但 \(k\) 的生成是實現問題,同一個 \(k\) 就鎖死一切。與 Enigma 的反射器(見 1918-Enigma機.md)、RSA 去掉雜湊(見 1977-RSA.md)同源:安全性 = 算法 + 實現 + 使用。

智慧合約的密碼學基礎#

以太坊引入智慧合約(smart contracts,2013–2015)——程式碼在鏈上執行。密碼學需求:

  • 零知識證明(zk-SNARK):驗證計算正確而不洩漏資料(見 1989-零知識證明.md)
  • zk-rollup:L2 擴容(zk-SNARK 證明多筆交易有效)
  • 同態加密:隱私智能合約(較慢)

2017 年 zk-SNARK 的 Killer App:Zcash(2016)——隱私加密貨幣:交易金額、地址、身份全部在鏈上加密,靠 zk-SNARK 保證「不洩漏內容但證明有效性」。

程式碼:區塊鏈元件的驗證#

import hashlib

def sha256(data):
    return hashlib.sha256(data).hexdigest()

# 區塊頭的雜湊(區塊 ID)
def block_hash(prev_hash, merkle_root, nonce):
    header = f"{prev_hash}{merkle_root}{nonce}"
    return sha256(header.encode())

# Merkle 樹(SPV:驗證交易在區塊中)
def merkle_root(tx_hashes):
    """葉節點 = 交易雜湊,兩兩配對直到根"""
    if not tx_hashes: return ""
    level = tx_hashes
    while len(level) > 1:
        level = [sha256((level[i] + level[i+1]).encode())
                 for i in range(0, len(level), 2)]
    return level[0]

# 工作量證明:找 nonce 使雜湊 < target
def mine(prev_hash, merkle_root, target="00" * 32):
    nonce = 0
    while True:
        h = block_hash(prev_hash, merkle_root, nonce)
        if h < target:
            return nonce, h
        nonce += 1

import random
random.seed(42)
txs = [sha256(f"tx{i}".encode()) for i in range(4)]
root = merkle_root(txs)
print(f"Merkle 根 = {root[:16]}...(SPV 驗證交易只需根 + 路徑)")

# 挖礦(難度設為容易找到)
nonce, h = mine("0" * 64, root, target="ff" * 32)
print(f"找到 nonce={nonce},區塊雜湊 = {h[:16]}...(工作量證明 ✓)")

# ECDSA 簽章(概念:k 重複會洩漏私鑰——RFC 6979 解決)
print("ECDSA:k 重複 → 私鑰洩漏(比特幣 2013 錢包被盜事件)")
print("對策:RFC 6979 決定性簽章 / EdDSA(Ed25519)")

現況(2020s)#

  • DeFi:去中心化金融(智能合約 + 穩定幣 + DEX)
  • zk 證明系統:zk-SNARK、zk-STARK、zk-rollup——L2 擴容的主流方案
  • 錢包安全:硬體錢包(Ledger/Trezor)——私鑰從不離開裝置
  • 智能合約漏洞:2016 DAO 事件($6000 萬被盜)、重入攻擊——「密碼學安全 ≠ 程式碼安全」——智能合約的驗證(形式化方法,見 ../軟體工程/README.md)成為新學科

偵探筆記:區塊鏈的推理是「用公開、可驗證的密碼學取代信任」——每個組件的選擇都是為了「不信任任何人」:雜湊防篡改、簽章防偽造、工作量證明防雙花。同時它的陰暗面(智能合約漏洞、51% 攻擊、匿名性與隱私)也是「信任的邊界在哪裡」的教訓。

結案 -- 後果與影響#

  • 密碼學的大眾化:比特幣讓 ECDSA、Merkle 樹、雜湊成為公眾詞彙——密碼學從後台走到前台。
  • 智能合約:以太坊 2015 上線——程式化金融(DeFi、NFT),但也帶來新的安全挑戰。
  • zk 證明的工業化:zk-rollup(L2 擴容)、zkEVM——2018 年後的主流擴容方案。
  • 後量子隱憂:比特幣社群的後量子遷移討論(2020s)——ECDSA 在量子下失效(見 1994-Shor演算法.md)、簽章暴露公鑰的隱私問題(見 2017-後量子密碼學.md)。
  • 密碼學的融合:區塊鏈把雜湊、簽章、PoW、共識融合為一個系統——密碼學從「工具」變成「協議設計」。

關鍵人物與文獻#

  • Satoshi Nakamoto(2008–):Bitcoin 白皮書 (2008);身分不明(2010 年隱退)
  • Vitalik Buterin:Ethereum (2013–2015)、智能合約
  • Zcash:zk-SNARK 隱私幣 (2016)
  • RFC 6979:決定性 ECDSA (2013)—— \(k\) 重複的補救
  • NIST:NISTIR 8219——區塊鏈技術概覽(2020)
  • 交叉參照:1985-密碼學雜湊函數.md、2005-橢圓曲線密碼學.md、1989-零知識證明.md、2017-後量子密碼學.md