以太坊隱私技術的密碼學原創分析:ZK 電路設計的信任假設深度比較

本文原創分析不同零知識證明系統的信任假設差異,深入比較 Groth16、Plonk、Halo2、STARK 等主流 ZK 系統的信任模型。以太坊隱私方案如 Tornado Cash、Aztec Network、Privacy Pools 的信任假設如何影響安全性?為什麼 Halo2 被稱為「透明」的系統?完整的密碼學推導和量化評估框架,幫助理解信任與透明之間的平衡取捨。

以太坊隱私技術的密碼學原創分析:ZK 電路設計的信任假設深度比較

概述

最近在做 Privacy Pool 的研究時,我發現了一個讓我困擾的問題:同樣是基於零知識證明的隱私方案,為什麼 Aztec 的信任假設跟 Tornado Cash 不一樣?為什麼 Halo2 說自己是「透明」的,而 Groth16 需要一個「trusted setup」?

這些問題困擾了我很長時間,直到我決定自己動手把密碼學推導一遍。這篇文章,就是這個探索過程的記錄。我會用最白話的方式,解釋不同 ZK 系統的信任假設差異,並用實際的密碼學公式來支撐分析。

如果你對零知識證明有基礎了解,但對「trust assumptions」這個概念感到困惑,這篇文章就是為你寫的。


一、信任假設到底是什麼?

1.1 密碼學中的信任問題

在開始比較之前,我們得先搞清楚什麼是「信任假設」。

密碼學系統的安全性通常建立在某些「假設」之上。這些假設分為兩類:

密碼學假設的兩種形態:

1. 計算假設(Computational Assumptions)
   └── 某些數學問題在計算上是困難的
       例如:「大數分解是困難的」(RSA 假設)
            「離散對數是困難的」(DLP 假設)

2. 信任假設(Trust Assumptions)
   └── 系統的安全性依賴於某些參與者的誠實行為
       例如:「至少有一個 Trusted Setup 的參與者是誠實的」
            「電路設計者沒有在電路中植入後門」

為什麼信任假設是個問題?
因為如果信任假設被破壞,攻擊者可以:
- 生成假的零知識證明
- 偽造任意交易
- 盜取所有使用者的資產

1.2 ZK 系統中的信任假設地圖

讓我畫一張圖,幫你理解不同 ZK 系統的信任假設差異:

不同 Z碼知識證明系統的信任假設比較:

┌────────────────────────────────────────────────────────────────┐
│                     信任假設光譜                                │
├────────────────────────────────────────────────────────────────┤
│                                                                 │
│  透明系統(No Trusted Setup)                                    │
│  ├── 安全性完全基於密碼學假設                                    │
│  ├── 沒有任何人為生成的參數                                      │
│  └── 代表:STARK, Bulletproofs                                  │
│                                                                 │
│           ↓                                                     │
│                                                                 │
│  通用可信設定(Universal Trusted Setup)                        │
│  ├── 一次性設定,所有電路可共用                                  │
│  ├── 只需一個誠實參與者                                          │
│  └── 代表:Plonk, Marlin                                         │
│                                                                 │
│           ↓                                                     │
│                                                                 │
│  電路特定可信設定(Circuit-Specific Trusted Setup)             │
│  ├── 每個電路都需要獨立的設定儀式                                │
│  ├── 需要所有參與者都誠實(或至少一個)                          │
│  └── 代表:Groth16, GGM16                                       │
│                                                                 │
└────────────────────────────────────────────────────────────────┘

理解這個光譜的關鍵:
越靠左越安全(信任假設少),但驗證成本越高
越靠右效率越高,但信任假設越強

二、Groth16:電路特定可信設定的代表

2.1 Groth16 的數學原理

Groth16 是最早被廣泛採用的 zk-SNARK 構造之一,由 Jens Groth 在 2016 年提出。它以其極快的驗證速度和小的證明尺寸聞名,但代價是需要一個「有毒廢料」(Toxic Waste)。

"""
Groth16 信任假設的數學推導
"""

def groth16_trust_assumption_analysis():
    """
    分析 Groth16 的信任假設
    
    Groth16 需要一個 Trusted Setup,過程如下:
    
    1. 生成隨機數 τ (tau)
       - 這個 τ 必須被銷毀
       - 如果 τ 被洩露,攻擊者可以偽造任意證明
       
    2. 使用 τ 生成公共參數
       - (G1^n, G2^m) - 兩個循環群
       - α, β, γ, δ - 隨機標量
       
    3. 約束:
       τ^2 = 某個多項式(用於CRS)
    """
    
    print("\n=== Groth16 信任假設分析 ===\n")
    
    print("1. 系統初始化(Setup)")
    print("   ┌─────────────────────────────────────────────┐")
    print("   │ τ = random()                                │")
    print("   │                                             │")
    print("   │ 如果 τ 洩露:攻擊者可以偽造證明!             │")
    print("   │                                             │")
    print("   │ 這就是所謂的「Toxic Waste」問題              │")
    print("   └─────────────────────────────────────────────┘")
    
    print("\n2. CRS(Common Reference String)生成")
    print("   CRS = (G1^n, G2^m) 其中:")
    print("   - G1 = τ^1, τ^2, τ^3, ..., τ^n")
    print("   - G2 = τ^1, τ^2, τ^3, ..., τ^m")
    
    print("\n3. 信任要求")
    print("   ┌─────────────────────────────────────────────┐")
    print("   │ 要求:至少有一個 Setup 參與者誠實            │")
    print("   │                                             │")
    print("   │ 原因:如果所有參與者都作弊                    │")
    print("   │       他們可以私下保存 τ                     │")
    print("   │       之後偽造任意證明                        │")
    print("   └─────────────────────────────────────────────┘")
    
    print("\n4. 實際風險量化")
    print("   ")
    print("   假設 Setup 儀式有 N 個參與者:")
    print("   ")
    print("   單個誠實假設:安全性 = 1 - ε (ε 趨近於 0)")
    print("   ")
    print("   但如果:")
    print("   - 參與者串通")
    print("   - 某人的硬體被入侵")
    print("   - 隨機數生成器有後門")
    print("   ")
    print("   那麼 τ 就可能被洩露")
    print("   整個系統的安全性就歸零了")
    
    print("\n5. 實際採用者的風險")
    print("   ")
    print("   知名專案的 Setup 參與者數量:")
    print("   - Zcash Sprout: 6 人")
    print("   - Filecoin: 366 人")
    print("   - Hermez: 200+ 人")
    print("   ")
    print("   你信任其中任何一個人嗎?")

groth16_trust_assumption_analysis()

2.2 Groth16 的後果:如果信任被破壞

Groth16 信任被破壞的災難性後果:

1. 攻擊者可以做的事情:
   ┌─────────────────────────────────────────────────────────┐
   │ 攻擊能力 A:偽造任意知識證明                             │
   │                                                          │
   │ 具體來說:                                              │
   │ - 可以聲明任何 statement 是正確的                        │
   │ - 可以偽造轉帳交易(轉走你的 ETH)                       │
   │ - 可以偽造身份證明(冒充任何人)                        │
   │ - 可以偽造 DeFi 操作(清算別人的倉位)                   │
   └─────────────────────────────────────────────────────────┘

2. 攻擊的經濟收益(理論上):
   - 隱私協議中的所有資產
   - 假冒他人身份進行欺詐
   - 操縱預言機數據

3. 為什麼風險被低估了:
   - 大多數人不知道 Groth16 需要 trusted setup
   - 以為零知識證明 = 密碼學安全
   - 沒有考慮人為因素

三、Plonk 和 Halo2:透明化的嘗試

3.1 Plonk 的通用可信設定

Plonk(Permutations over Lagrange-bases for Oecumenical)是由 AZTEC 團隊(現在是 Aztec Network)提出的 zk-SNARK 構造。它的核心創新是使用了一個「通用且可更新的可信設定」。

"""
Plonk 信任假設的數學推導
"""

def plonk_trust_assumption_analysis():
    """
    分析 Plonk 的信任假設
    
    Plonk 的改進:
    1. 設定是「通用」的(Universal)
       - 一組公共參數可以供任意電路使用
       - 不需要每個電路都重新做 Setup
       
    2. 設定是「可更新的」(Updatable)
       - 任何人都可以添加隨機性
       - 只要有一個誠實的更新者,系統就是安全的
    """
    
    print("\n=== Plonk 信任假設分析 ===\n")
    
    print("1. Plonk 的 Setup 結構")
    print("   ")
    print("   Plonk CRS 由三部分組成:")
    print("   - G1_setup: [G1^0, G1^1, G1^2, ..., G1^n]")
    print("   - G2_setup: [G2^0, G2^1, ..., G2^m]")
    print("   - G1_selector: 用於電路選擇器的承諾")
    print("   ")
    print("   這些參數可以用於任意 Plonk 電路")
    
    print("\n2. Plonk 的信任假設(改進版)")
    print("   ┌─────────────────────────────────────────────┐")
    print("   │                                              │")
    print("   │ 假設:至少有一個誠實的 Setup 更新者            │")
    print("   │                                              │")
    print("   │ 這個假設比 Groth16 強在哪裡?                 │")
    print("   │                                              │")
    print("   │ 1. 任何人都可以持續添加隨機性                  │")
    print("   │ 2. 「持續去汙染化」比「一次性乾淨」更實際      │")
    print("   │ 3. 物理假設(有人會定期更新)更可靠            │")
    print("   │                                              │")
    print("   └─────────────────────────────────────────────┘")
    
    print("\n3. Updatable CRS 的數學結構")
    print("   ")
    print("   如果原始 CRS 參數是:")
    print("   CRS_0 = (τ^0, τ^1, τ^2, ..., τ^n)")
    print("   ")
    print("   任何人可以添加隨機數 r:")
    print("   CRS_1 = (r*τ^0, r*τ^1, r*τ^2, ..., r*τ^n)")
    print("   ")
    print("   最終 CRS = CRS_0 * CRS_1 * CRS_2 * ...")
    print("   ")
    print("   攻擊者需要知道所有 r 的乘積")
    print("   但只要有一個誠實的更新者,這就無法實現")

plonk_trust_assumption_analysis()

3.2 Halo2:完全透明的想法

Halo2 是 ECC(Electric Coin Company)開發的 zk-SNARK 系統,它的設計目標是:完全不需要 trusted setup。

"""
Halo2 信任假設的數學推導
"""

def halo2_trust_assumption_analysis():
    """
    分析 Halo2 的信任假設
    
    Halo2 的核心創新:使用「內積論點」(Inner Product Argument)
    這個結構天然不需要 trusted setup
    """
    
    print("\n=== Halo2 信任假設分析 ===\n")
    
    print("1. Halo2 為什麼不需要 Trusted Setup?")
    print("   ")
    print("   傳統 zk-SNARK 的問題:")
    print("   - 需要一個「有毒的 τ」來生成 CRS")
    print("   - τ 的洩露 = 系統崩潰")
    print("   ")
    print("   Halo2 的解決方案:")
    print("   - 使用多項式承諾(Polynomial Commitment)")
    print("   - 承諾可以在證明過程中「逐步」被打開")
    print("   - 不需要預先生成 τ^power")
    
    print("\n2. Halo2 的核心:KZG 承諾 + Recursion")
    print("   ")
    print("   KZG 承諾的信任假設:")
    print("   ┌─────────────────────────────────────────────┐")
    print("   │                                              │")
    print("   │ 假設:離散對數假設(DLOG)                    │")
    print("   │                                              │")
    print("   │ 這是一個「標準」的密碼學假設                  │")
    print("   │ 不需要任何特殊的神秘值                        │")
    print("   │                                              │")
    print("   └─────────────────────────────────────────────┘")
    
    print("\n3. Recursion 的魔力")
    print("   ")
    print("   Halo2 使用「遞歸證明」(Recursive Proof)來:")
    print("   1. 將大型計算拆分為多個小區塊")
    print("   2. 將每個小區塊的證明「壓縮」成一個點")
    print("   3. 用這個點作為下一個證明的輸入")
    print("   ")
    print("   最終結果:")
    print("   - 只需要驗證最後一個證明")
    print("   - 節省大量驗證成本")
    print("   - 完全透明(沒有 trusted setup)")

halo2_trust_assumption_analysis()

四、STARK:最透明但最大的證明

4.1 STARK 的密碼學基礎

STARK(Scalable Transparent ARgument of Knowledge)是最近鄰 Hash 函數(如 Keccak)和代數編碼理論的結合。它的核心特點是:完全透明,但證明尺寸很大。

"""
STARK 信任假設的數學推導
"""

def stark_trust_assumption_analysis():
    """
    分析 STARK 的信任假設
    
    STARK 的安全性僅基於:
    1. 碰撞阻力 Hash 函數
    2. 低程度測試(Low Degree Testing)
    3. Merkle 承諾的偽隨機性
    """
    
    print("\n=== STARK 信任假設分析 ===\n")
    
    print("1. STARK 的信任假設(理論上最少)")
    print("   ")
    print("   ┌─────────────────────────────────────────────┐")
    print("   │                                              │")
    print("   │ STARK 只需要信任:                           │")
    print("   │                                              │")
    print("   │ 1. Hash 函數是安全的                        │")
    print("   │ 2. 隨機Oracle模型(ROM)是有效的            │")
    print("   │ 3. フェルマーの小定理(算術理解)           │")
    print("   │                                              │")
    print("   │ 不需要:                                    │")
    print("   │ ✗ Trusted Setup                             │")
    print("   │ ✗ 特殊代數假設                              │")
    print("   │ ✗ 任何秘密值                                │")
    print("   │                                              │")
    print("   └─────────────────────────────────────────────┘")
    
    print("\n2. 實際的成本")
    print("   ")
    print("   STARK 的缺點:")
    print("   - 證明尺寸:100-500 KB(Groth16 只需 ~200 bytes)")
    print("   - 驗證時間:長(Groth16 驗證只需 ~3ms)")
    print("   - 產生時間:長(需要大量 FFT)")
    
    print("\n3. 安全性 vs 效率的取捨")
    print("   ")
    print("   選擇哪個系統,取決於你的優先級:")
    print("   ")
    print("   優先透明性 → STARK")
    print("   優先效率 → Groth16 / Plonk")
    print("   兩者兼顧 → Halo2")

stark_trust_assumption_analysis()

五、不同 ZK 系統的信任假設量化比較

5.1 量化框架

讓我建立一個量化框架來比較不同 ZK 系統的信任假設強度:

"""
ZK 系統信任假設量化比較
"""

def quantify_trust_assumptions():
    """
    量化不同 ZK 系統的信任假設
    """
    
    print("\n" + "=" * 60)
    print("不同 ZK 系統信任假設量化比較")
    print("=" * 60 + "\n")
    
    # 信任假設評估維度
    dimensions = [
        "信賴神秘值 τ 的安全",
        "依賴隨機硬體/軟體",
        "依賴人為誠實性",
        "電路特定 vs 通用性",
        "可更新性",
        "後量子安全性"
    ]
    
    # 評分標準:1-5 分,分數越高信任假設越弱(越需要信任)
    # 1 = 完美,5 = 非常弱的信任假設
    
    zk_systems = {
        "Groth16": [5, 3, 5, 5, 1, 3],
        "Plonk": [3, 2, 4, 2, 5, 3],
        "Halo2": [2, 2, 2, 2, 3, 2],
        "STARK": [1, 1, 1, 1, 1, 5],
        "Bulletproofs": [1, 2, 1, 3, 1, 3]
    }
    
    print(f"{'系統':<15} {'神秘值':<8} {'硬體':<8} {'人為':<8} {'通用性':<8} {'可更新':<8} {'後量子':<8} {'總分':<8}")
    print("-" * 75)
    
    results = {}
    for system, scores in zk_systems.items():
        total = sum(scores)
        results[system] = {
            'scores': dict(zip(dimensions, scores)),
            'total': total
        }
        print(f"{system:<15} {scores[0]:<8} {scores[1]:<8} {scores[2]:<8} {scores[3]:<8} {scores[4]:<8} {scores[5]:<8} {total:<8}")
    
    print("\n" + "=" * 60)
    print("信任假設強度排名(分數越低越好)")
    print("=" * 60)
    
    sorted_results = sorted(results.items(), key=lambda x: x[1]['total'])
    
    for rank, (system, data) in enumerate(sorted_results, 1):
        print(f"{rank}. {system}: {data['total']} 分")

quantify_trust_assumptions()

5.2 以太坊隱私方案採用情況

以太坊主要隱私方案的信任假設採用情況:

方案                 ZK 系統     信任假設等級    說明
──────────────────────────────────────────────────────────────────
Tornado Cash (classic)  Groth16    高          需要 trusted setup
Aztec Network          Plonk/Halo2  中          可更新 trusted setup
Privacy Pools          Halo2        低          理論上不需要 trusted setup
Railgun                Zk-SNARKs    中          取決於具體實現
Zcash (ZEC)            Sprout/Groth16 高       多代演進
──────────────────────────────────────────────────────────────────

選擇建議:
- 如果你對信任假設零容忍 → 選擇 STARK 或 Privacy Pools
- 如果你願意接受受監管的信任 → 選擇 Plonk/Halo2
- 如果你需要極致效率 → 選擇 Groth16,但信任成本要心中有數

六、實際案例:Privacy Pools 的創新

6.1 Privacy Pools 是怎麼處理信任假設的

Privacy Pools 是 Vitalik Buterin 在 2023 年提出的一個創新方案。它結合了「可審計的隱私」和「最小信任假設」的優點。

Privacy Pools 的核心思想:

1. 傳統方案(如 Tornado Cash)的問題:
   - 完全隱私 → 無法區分犯罪資金
   - 監管壓力大 → 可能被禁止
   
2. Privacy Pools 的解決方案:
   ┌─────────────────────────────────────────────────────────┐
   │                                                          │
   │  用戶可以選擇性地「揭露」自己的交易                      │
   │                                                          │
   │  例如:                                                  │
   │  - 「我的這筆提款來自我之前的某筆存款」                  │
   │  - 「我是從這個白名單地址存款的」                        │
   │                                                          │
   │  這樣:                                                 │
   │  - 保有隱私(不揭露具體是哪筆)                          │
   │  - 但證明了資金來源的清白                                │
   │                                                          │
   └─────────────────────────────────────────────────────────┘

6.2 Privacy Pools 的密碼學實現

"""
Privacy Pools 信任假設分析
"""

def privacy_pools_analysis():
    """
    分析 Privacy Pools 的信任假設
    """
    
    print("\n=== Privacy Pools 信任假設分析 ===\n")
    
    print("1. Privacy Pools 使用的 ZK 系統")
    print("   ")
    print("   Privacy Pools 主要使用 Halo2 實現")
    print("   為什麼選擇 Halo2?")
    print("   ")
    print("   ✓ 不需要 trusted setup(或只需最小信任)")
    print("   ✓ 證明速度快")
    print("   ✓ 可递归(適用於鏈上驗證)")
    print("   ✓ 開發工具成熟(Aztec 的 Noir 語言)")
    
    print("\n2. Privacy Pools 的信任模型")
    print("   ")
    print("   ┌─────────────────────────────────────────────┐")
    print("   │                                              │")
    print("   │ 最小信任假設:                               │")
    print("   │                                              │")
    print("   │ 1. 電路實現是正確的(開源審計)              │")
    print("   │ 2. 用戶能控制自己的私鑰                      │")
    print("   │ 3. Hash 函數是安全的                        │")
    print("   │                                              │")
    print("   │ 不需要信任的:                               │")
    print("   │ ✗ 任何人為生成的神秘參數                     │")
    print("   │ ✗ 第三方託管機構                            │")
    print("   │ ✗ 監管機構的配合                           │")
    print("   │                                              │")
    print("   └─────────────────────────────────────────────┘")
    
    print("\n3. 關聯集合(Association Sets)的概念")
    print("   ")
    print("   Privacy Pools 的核心是「關聯集合」:")
    print("   ")
    print("   假設有 100 筆存款")
    print("   ")
    print("   關聯集合 A = {所有 100 筆存款}")
    print("   關聯集合 B = {來自白名單的 50 筆存款}")
    print("   ")
    print("   用戶提款時,可以選擇:")
    print("   ")
    print("   選項 1:「我的資金在集合 A 中」")
    print("         → 完全隱私(不知道是 100 筆中的哪筆)")
    print("   ")
    print("   選項 2:「我的資金在集合 B 中」")
    print("         → 部分隱私 + 資金來源清白")
    print("         → 可供監管識別「這是合法的存款」")
    
    print("\n4. Privacy Pools 的安全性保證")
    print("   ")
    print("   形式化安全性分析:")
    print("   ")
    print("   定理(簡化版):")
    print("   如果攻擊者無法:")
    print("   1. 破解 ZK 證明的 Soundness")
    print("   2. 偽造關聯集合的 membership")
    print("   ")
    print("   那麼攻擊者無法:")
    print("   1. 識別特定用戶的交易")
    print("   2. 偽造合法的資金來源證明")
    print("   3. 破壞系統的隱私性")

privacy_pools_analysis()

七、實務建議:如何評估隱私方案的信任假設

7.1 評估清單

選擇 ZK 隱私方案時的信任假設評估清單:

□ 1. ZK 系統本身的信任假設
   ├─ 需要 trusted setup 嗎?
   ├─ 如果需要,是電路特定的還是通用的?
   └─ 設置儀式有多少人參與?

□ 2. 實現層面的信任假設
   ├─ 電路代碼是開源的嗎?
   ├─ 有過專業審計嗎?
   ├─ 審計機構的公信力如何?
   └─ 是否有已知的漏洞?

□ 3. 運營層面的信任假設
   ├─ 誰運營這個系統?
   ├─ 是否有可能凍結你的資產?
   ├─ 是否服從當地法律?
   └─ 歷史上有過什麼問題?

□ 4. 經濟激勵層面的信任假設
   ├─ 系統的經濟模型是什麼?
   ├─ 是否有財庫資金支撐?
   ├─ 代幣持有者有什麼權力?
   └─ 是否可能對用戶徵稅?

7.2 不同用戶的推薦

根據你的風險偏好,推薦的隱私方案:

極度保守(最高信任假設敏感度):
→ 選擇:原生支援 STARK 的方案
→ 例如:ZK Mail、Dark Forest(遊戲場景)
→ 理由:完全不需要信任任何人為參數

謹慎(希望兼顧效率):
→ 選擇:Halo2 或可更新 Plonk 方案
→ 例如:Aztec Network、Privacy Pools
→ 理由:信任假設最小化,且有實際產品

實用主義(願意接受合理信任):
→ 選擇:知名項目的 Groth16 方案
→ 例如:主流 DeFi 隱私整合
→ 理由:Groth16 經過大量審計,風險相對可控

不在乎(願意犧牲安全換取便利):
→ 選擇:中心化交易所的隱私功能
→ 理由:完全信任交易所,但操作最方便

八、結語:信任與透明之間的平衡

寫完這篇文章,我對 ZK 系統的信任假設有了更深的理解。

核心的洞見是:沒有絕對「無信任」的系統。即使是聲稱完全透明的 STARK,也需要信任:

關鍵在於理解你在信任什麼,以及這個信任是否合理。

Groth16 需要信任「至少有一個 Setup 參與者是誠實的」。這個假設在有大規模社群參與的情況下,其實是相當合理的。

Plonk 和 Halo2 將這個假設進一步降低,特別是 Halo2 的內積論點,幾乎達到了「理論上最透明」的程度。

STARK 則是另一個極端——完全透明,但代價是巨大的證明尺寸。

選擇哪個系統,取決於你的優先級:

未來,我預期會看到更多的創新:

ZK 領域正在快速演進,今天的信任假設地圖,可能明天就會被改寫。保持學習,保持懷疑,這才是密碼學的正確姿勢。


免責聲明:本篇文章是密碼學教育性質的分析,不構成任何安全審計或投資建議。實際部署 ZK 系統前,請聘請專業的安全團隊進行全面審計。

參考資料

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!