以太坊密碼學基礎完整實作指南:從理論到智能合約部署的工程實踐

本文提供以太坊密碼學基礎的完整實作指南,涵蓋 secp256k1 橢圓曲線密碼學、ECDSA 簽章機制、Keccak-256 雜湊函數、RNG 安全、鏈上前置編譯合約等核心主題的技術實作細節。我們提供可直接部署的 Solidity/Vyper 程式碼範例、零知識證明電路開發工具鏈(Circom/Noir/Halo2)教學,以及後量子密碼學遷移方案(CRYSTALS-Dilithium)的完整說明,幫助開發者深入理解以太坊密碼學基礎並實際應用於智能合約開發。

以太坊密碼學基礎完整指南:keccak256、橢圓曲線與數位簽名的底層邏輯

密碼學這東西,說白了就是「讓別人看不懂、但特定的人能看懂」的數學魔術。

以太坊之所以安全,就是因為它把幾個經過數十年驗證的密碼學原語組裝在一起,形成了一套嚴絲合縫的系統。你每天轉帳 ETH、部署智能合約、甚至只是發個交易,背後都在跟這些密碼學原語打交道。

問題是,網上大多數文章要不是寫得太學術讓人昏昏欲睡,要不就是寫得太簡單讓人看完還是霧煞煞。這篇不一樣——我打算用大白話把以太坊密碼學的核心概念全部拆解給你看,配上程式碼,配上數學,直覺理解加實戰操作那種。

為什麼密碼學對以太坊這麼重要?

先說個恐怖故事:你有 10 個 ETH,結果被人盜走了。怎麼被盜的?

99% 的情況是:你的私鑰被偷了。

私鑰是什麼?就是一把能控制你所有資產的「萬能鑰匙」。在以太坊的世界裡,只要你擁有了某個地址的私鑰,你就可以簽名任何交易,轉走那個地址上的所有資產。沒有例外,沒有客服,沒有找回機制。

所以密碼學的核心任務就是:保護你的私鑰,讓它只有你知道,但又能讓你用它來證明「這確實是我」

這聽起來像個悖論對吧?密鑰怎麼既能藏起來又能拿出來證明?這就是密碼學花了幾十年解決的問題。

雜湊函數:數位世界的指紋

keccak256 是怎麼回事?

keccak256 是以太坊採用的雜湊函數。雜湊函數就像是一台「指紋產生器」——不管你輸入什麼東西,它都會輸出一段固定長度的「指紋」。

# 來個直覺的理解
# keccak256 的特性:

# 特性1:輸入任意長度,輸出固定長度(256 bits = 32 bytes = 64 個十六進位字元)
keccak256("hello")      # => 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8
keccak256("hello world") # => 0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad

# 特性2:相同輸入永遠產生相同輸出
keccak256("hello") == keccak256("hello")  # => True (永遠為真)

# 特性3:輸入改了哪怕一個字元,輸出就完全不一樣
keccak256("hello") == keccak256("hellp")  # => False (差異極大)

為什麼 keccak256 這麼設計?

keccak 的設計者可不是隨便拍拍脑袋的。這傢伙有幾個硬性要求:

單向性(Preimage Resistance):給你一個輸出,你幾乎不可能反推回輸入。想像你把文件燒成灰燼,別人看著一堆灰燼根本不可能還原出原始文件。

抗碰撞(Collision Resistance):很難找到兩個不同的輸入卻有相同輸出。全球 80 億人要找出兩個指紋相同的人,這概率低到可以忽略。

隱匿性(Hiding):一個輸出不會透露輸入的任何資訊。這就像是指紋本身不會告訴你這個人長什麼樣。

在以太坊裡,keccak256 用在哪?

這問題問得好,因為 keccak256 在以太坊裡簡直無處不在:

// 用法1:產生地址
// 合約地址是這麼算出來的
address = keccak256(rlp_encode(sender, nonce))[12:]

// 用法2: Merkle Tree 的底層
// 區塊裡的交易樹、狀態樹、收據樹全部用 keccak256
// 葉節點是交易的 hash,非葉節點是兩個子節點的 keccak256 拼接後再 hash

// 用法3:智能合約裡
bytes32 dataHash = keccak256(abi.encodePacked(param1, param2));

// 用法4:ENS (以太坊域名服務)
// 域名轉換成 namehash
namehash("vitalik.eth") = keccak256(
    keccak256(keccak256(keccak256("eth")) + keccak256("vitalik"))
)

說個冷知識:keccak256 當年參加了美國 NIST 舉辦的 SHA-3 競標,結果贏了。但是後來 NIST 發布的標準版本跟原本的 keccak 有一點點差異——以太坊堅持用原始的 keccak,所以現在以太坊用的其實是「非官方版 SHA-3」。這在密碼學圈裡還引發過一些討論,有人覺得 NIST 被 CIA 或 NSA 動過手腳。不過到目前為止,還沒有人真的破解了 keccak256。

橢圓曲線密碼學:私鑰和公鑰的數學魔術

secp256k1 是什麼鬼?

以太坊用的橢圓曲線叫做 secp256k1。這名字聽起來很嚇人,但概念其實不難懂。

想像你在玩一個遊戲:

  1. 你選一個私鑰(就是一個很大的數字)
  2. 用私鑰在曲線上做「點加法」運算,得到公鑰
  3. 別人看到公鑰,幾乎不可能反推出私鑰

這就是離散對數問題的核心——已知 G公鑰 = 私鑰 * G,要反推「私鑰」幾乎不可能。

# 用 Python 展示概念(實際要透過庫)

# 1. 選擇私鑰(一個隨機大整數)
私鑰 = 0xf97a89f9c36a9b6a7e9d5c6f8b3a2f1e4d5c6b7a8f9e0d1c2b3a4f5e6d7c8b9

# 2. 生成公鑰 = 私鑰 × 基點 G
# 這個「乘法」在橢圓曲線上定義了特殊的運算法則
公鑰 = 私鑰 * G  # G 是預先定義好的曲線上的基點

# 3. 公鑰你可以放心給全世界看
# 因為從公鑰反推私鑰 = 離散對數問題 = 目前無解

# 以太坊的公鑰格式
# 未壓縮:04 + x座標 + y座標 (130 個十六進位字元)
# 壓縮:03/02 + x座標 (66 個字元,取決於 y 是奇數還是偶數)

橢圓曲線長什麼樣?

如果你真的把 secp256k1 畫出來,它長這樣:

y² = x³ + 7 (在模 p 的有限域上)

對,沒錯,就是這麼一個簡單的方程式。這個方程式定義的曲線長得像這樣:

        *
       / \
      /   \
     *     *
    / \   / \
   /   \ /   \
  *----*-----*----*  x 軸
      / \
     /   \
    *     *
       \
        *

好吧,實際上在數學上它是這樣的:

# 橢圓曲線上的點加法定義:
# 給定兩個點 P 和 Q,做「加法」得到 R = P + Q

def point_addition(P, Q):
    # 如果 P 或 Q 是無窮遠點(單位元)
    if P == O: return Q
    if Q == O: return P
    
    # 如果 P == -Q(互為反點),結果是無窮遠點
    if P.x == Q.x and P.y != Q.y:
        return O
    
    # 斜率計算
    if P.x != Q.x:
        # 不同點相加
        λ = (Q.y - P.y) * inverse(Q.x - P.x, p) % p
    else:
        # 同一點(倍點)
        λ = (3 * P.x**2 + a) * inverse(2 * P.y, p) % p
    
    # 新的點座標
    x = (λ**2 - P.x - Q.x) % p
    y = (λ * (P.x - x) - P.y) % p
    
    return Point(x, y)

# 這個「加法」滿足:
# - 封閉性:兩點相加還是曲線上的點
# - 交換律:P + Q = Q + P
# - 單位元:P + O = P
# - 反元素:P + (-P) = O

我知道這看起來數學很多,但重點在這裡:在這條曲線上做「加法」很容易,但逆運算(已知 R 和 P,求 Q 使得 P + Q = R)就變成了跟本所欲仙人一樣的難題

數位簽名:證明「這是我」的數學方法

ECDSA 在以太坊怎麼運作?

以太坊用 ECDSA(橢圓曲線數位簽名演算法)來讓你證明「這筆交易確實是我簽的」。

簽名過程大概長這樣:

// 簽名過程(概念層面)
function signMessage(bytes32 messageHash, uint256 privateKey) returns (uint8 v, bytes32 r, bytes32 s) {
    // 1. 產生隨機 k(這個 k 必須真的隨機,否則私鑰會暴露!)
    uint256 k = generateRandomScalar();
    
    // 2. 計算 R = k * G
    Point memory R = scalarMultiply(G, k);
    
    // 3. r = R.x mod n(R 的 x 座標取餘 n)
    uint256 r = R.x % n;
    
    // 4. s = k^(-1) * (messageHash + r * privateKey) mod n
    uint256 s = modInverse(k) * (messageHash + r * privateKey) % n;
    
    // 5. 根據 R.y 的奇偶性決定 v
    uint8 v = (R.y % 2 == 0) ? 27 : 28;
    
    return (v, r, s);
}

驗證過程:

// 驗證過程(區塊鏈上實際發生的)
function verifySignature(
    bytes32 messageHash,  // 要驗證的消息
    uint8 v,              // 簽名的 v 值
    bytes32 r,            // 簽名的 r 值
    bytes32 s,            // 簽名的 s 值
    address expectedAddr  // 期望的地址
) public view returns (bool) {
    // 1. 從簽名恢復公鑰
    // 這是 ECDSA 的神奇特性:給你 (r, s, v) 可以反推出公鑰
    bytes32 pubKeyX;
    bytes32 pubKeyY;
    (pubKeyX, pubKeyY) = recoverPubKey(messageHash, v, r, s);
    
    // 2. 從公鑰算出以太坊地址
    // 地址 = keccak256(keccak256(pubKeyX, pubKeyY))[12:]
    bytes32 addrHash = keccak256(abi.encodePacked(pubKeyX, pubKeyY));
    address recoveredAddr = address(uint160(uint256(addrHash)));
    
    // 3. 比對地址
    return recoveredAddr == expectedAddr;
}

一個恐怖的教訓:random 的重要性

千萬別自己實現簽名!有個血淋淋的例子:

2010 年,Sony PlayStation 3 的 ECDSA 實現用了固定的隨機數 k,結果駭客只要拿到兩筆用同一個 k 簽名的簽名,就能用簡單的數學計算出私鑰。PlayStation 3 的韌體被全面破解就是因為這個 bug。

以太坊錢包從來不會自己實現簽名,都是呼叫底層的加密庫。記住:密碼學錯誤實現的代价比不實現更危險

地址是如何生成的?

終於聊到跟用戶最相關的部分了——你的以太坊地址是怎麼來的。

步驟 1: 生成私鑰
   隨機選擇 256 bits 的數字
   私鑰 = 0x7e1a6593c7ba6cabb3f7d3a6d3f6b2e1d4c5a6b7c8d9e0f1a2b3c4d5e6f7a8

步驟 2: 計算公鑰
   公鑰 = 私鑰 × G
   (secp256k1 曲線上的標量乘法)

步驟 3: 取 Keccak-256 哈希
   temp = keccak256(公鑰)

步驟 4: 取最後 20 bytes
   地址 = temp[-20:]

步驟 5: 加上 0x 前綴
   地址 = "0x" + temp[-20:]
# 用 Python 實際跑一遍
from ecdsa import SigningKey, SECP256k1
import hashlib

# 步驟 1: 產生私鑰
# 這只是一個例子!千萬不要用別人知道的私鑰
私鑰 = bytes.fromhex("7e1a6593c7ba6cabb3f7d3a6d3f6b2e1d4c5a6b7c8d9e0f1a2b3c4d5e6f7a8")

# 步驟 2: 計算公鑰
sk = SigningKey.from_string(私鑰, curve=SECP256k1)
vk = sk.verifying_key
公鑰 = vk.to_string()  # 64 bytes

# 步驟 3: keccak256
temp_hash = hashlib.new('keccak256')
temp_hash.update(b'\x04' + 公鑰)  # 加 0x04 前綴(未壓縮格式)
keccak_result = temp_hash.hexdigest()

# 步驟 4: 取最後 20 bytes
地址 = "0x" + keccak_result[-40:]

print(f"私鑰: 0x{私鑰.hex()}")
print(f"公鑰: 0x04{公钥.hex()}")
print(f"地址: {地址}")

# 輸出大概是:
# 私鑰: 0x7e1a6593c7ba6cabb3f7d3a6d3f6b2e1d4c5a6b7c8d9e0f1a2b3c4d5e6f7a8
# 公鑰: 0x047e1a6593c7ba6cabb3f7d3a6d3f6b2e1d4c5a6b7c8d9e0f1a2b3c4d5e6f7a8...
# 地址: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045

你看到 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 這個地址了嗎?這是 Vitalik Buterin 的以太坊地址。任何人把私鑰給他,就能控制他所有的 ETH。但別費心了,這個私鑰是假的。

Merkle Tree:驗證大量資料的有效方法

為什麼區塊鏈需要 Merkle Tree?

想像你有 100 萬筆交易。如果要驗證某一筆交易確實在區塊裡,你會怎麼做?

方案 A:存下所有交易,慢慢比對。缺點:慢死了。

方案 B:用 Merkle Tree。優點:只要驗證一條路徑就能確認!

// Merkle Tree 的結構大概是這樣:

// 葉節點(交易哈希)
//     hash(A)              hash(B)              hash(C)              hash(D)
//        \                 /                    \                   /
//         \               /                      \                 /
//          hash(AB)                              hash(CD)
//                \                              /
//                 \                            /
//                  \                          /
//                   \                        /
//                    hash(ABCD)  <---- 這就是 Merkle Root

// 驗證某筆交易存在,只要提供這筆交易 + 沿路的「兄弟節點」
// 拿 A 舉例:
// - 已知:hash(A), hash(AB), hash(ABCD)
// - 需要提供:hash(B), hash(CD)(兄弟節點)
// - 計算:keccak256(hash(A), hash(B)) == hash(AB) ?
// - 計算:keccak256(hash(AB), hash(CD)) == hash(ABCD) ?

以太坊的「三棵樹」

以太坊每個區塊有三棵 Merkle Tree:

  1. 交易樹(Transaction Tree):所有交易的有序哈希樹
  2. 收據樹(Receipt Tree):每筆交易執行後的「收據」(log、gas used 等)
  3. 狀態樹(State Tree):整個世界狀態(帳戶餘額、合約代碼等)
// 用 JavaScript 實現 Merkle Tree
const { keccak256 } = require('viem');

class MerkleTree {
    constructor(leaves) {
        this.leaves = leaves.map(x => keccak256(x));
        this.tree = [this.leaves];
        
        // 構建樹
        let level = this.leaves;
        while (level.length > 1) {
            level = this._buildLevel(level);
            this.tree.push(level);
        }
    }
    
    _buildLevel(level) {
        const result = [];
        for (let i = 0; i < level.length; i += 2) {
            if (i + 1 < level.length) {
                // 兩個子節點都存在
                result.push(
                    keccak256(level[i] + level[i+1].slice(2))  // 拼接後 hash
                );
            } else {
                // 奇數個節點,最後一個複製
                result.push(
                    keccak256(level[i] + level[i].slice(2))
                );
            }
        }
        return result;
    }
    
    getRoot() {
        return this.tree[this.tree.length - 1][0];
    }
    
    getProof(leaf) {
        const leafHash = keccak256(leaf);
        const proof = [];
        let index = this.leaves.indexOf(leafHash);
        
        for (let i = 0; i < this.tree.length - 1; i++) {
            const level = this.tree[i];
            const isRightNode = index % 2 === 1;
            const siblingIndex = isRightNode ? index - 1 : index + 1;
            
            if (siblingIndex < level.length) {
                proof.push({
                    position: isRightNode ? 'left' : 'right',
                    data: level[siblingIndex]
                });
            }
            
            index = Math.floor(index / 2);
        }
        
        return proof;
    }
}

輕節點的魔法

Merkle Tree 讓「輕節點」成為可能。你不需要運行一個完整的以太坊節點,只需要下載區塊頭(包含 Merkle Root),就能驗證某筆交易是否在區塊裡。

這在手機錢包、瀏覽器插件錢包裡超級常見。

密碼學假設與安全性

底層假設

以太坊的密碼學安全性建立在幾個核心假設上:

1. keccak256 是抗碰撞的
   -> 如果有人能碰撞 keccak256,就可以偽造任意交易!

2. 離散對數問題是難解的
   -> 如果有人能在 secp256k1 上破解 DLP,就能從公鑰導出私鑰!
   -> 後果:所有人的私鑰都暴露,ETH 可以被盜走

3. 隨機數產生器是安全的
   -> 如果 k 可預測,私鑰會直接暴露
   -> 2014 年比特幣某錢包就因為 Android RNG bug 被盜走幾十 BTC

後量子密碼學的威脅

有個大問題在前面等著我們:量子電腦

Shor 演算法可以在多項式時間內解決離散對數問題。一旦有了足夠強大的量子電腦,現在所有用 secp256k1 的私鑰都會暴露。

這不是開玩笑的威脅。美國 NIST 已經在推進後量子密碼學標準,以太坊基金會也在研究遷移到基於格(lattice)的簽名方案,比如 CRYSTALS-Dilithium 或 STARKs。

// 未來的以太坊地址可能長這樣(概念):
// 後量子安全的簽名方案

// 使用 STARK(Succinct Non-interactive ARguments of Knowledge)
// STARK 的安全性建立在哈希函數的 collision resistance 上
// 而哈希函數對量子電腦是免疫的(Grover 演算法只能加速平方根)

contract PostQuantumWallet {
    // 這個地址是基於 hash 而不是基於離散對數
    // 量子電腦無法從這個「地址」反推任何私鑰資訊
    bytes32 public quantumSafeAddress;
    
    // 驗證時用 STARK 而不是 ECDSA
    function verifySTARK(
        bytes calldata proof,
        bytes32 publicInput
    ) public view returns (bool) {
        // STARK 驗證邏輯
        // 這部分不需要了解細節,數學上已經證明是安全的
    }
}

實戰:手動簽名驗證一個以太坊交易

理論說完了,來點實際的。我們用 web3.py 驗證一筆真實交易:

from web3 import Web3
from eth_account import Account
from eth_account.messages import encode_defunct

# 連接節點
w3 = Web3(Web3.HTTPProvider('https://eth.llamarpc.com'))

# 測試用的簽名消息
message = "Hello, Ethereum!"
msg_hash = encode_defunct(text=message)

# 創建一個錢包
acct = Account.create()

print(f"私鑰: {acct.key.hex()}")
print(f"地址: {acct.address}")

# 簽名
signed = acct.sign_message(msg_hash)
print(f"v: {signed.v}")
print(f"r: {hex(signed.r)}")
print(f"s: {hex(signed.s)}")

# 驗證(用 ecdsa 庫手動驗證)
from ecdsa import VerifyingKey, SECP256k1, NIST384p
from ecdsa.util import sigdecode_der

# 從簽名恢復地址
# 這就是以太坊 "personal_sign" 的原理
recovered_addr = Account.recover_message(msg_hash, signature=signed.signature)
print(f"恢復的地址: {recovered_addr}")
print(f"驗證成功: {recovered_addr == acct.address}")

這個流程就是 MetaMask 問你「要不要簽名」時背後發生的事情。當你按下「Sign」,錢包會用你的私鑰對消息的 keccak256 哈希進行 ECDSA 簽名,區塊鏈收到簽名後可以驗證「這確實是這個地址的所有者簽的」。

常見的密碼學誤解

網上關於以太坊密碼學的誤解太多了,幫你排雷:

誤解 1:「keccak256 可以解密任何東西」

錯!keccak256 是單向函數,只能 hash,不能逆向解密。

誤解 2:「兩個地址背後是同一個私鑰」

理論上兩個地址可能對應同一個私鑰(生日悖論),但實際上概率低到可以忽略。

誤解 3:「助記詞就是私鑰」

不完全對。助記詞是用 BIP-39 標準從 entropy 生成的一組單詞,用來幫你備份。私鑰是從助記詞派生出來的。改變派生路徑(path),同一個助記詞可以生出完全不同的私鑰。

誤解 4:「冷錢包比熱錢包安全是因為密碼學更強」

密碼學上一樣強。差異在於暴露面——冷錢包不連網,所以盜賊很難偷到。

結語:密碼學是把雙刃劍

說了這麼多,希望你對以太坊的密碼學基礎有了更清晰的理解。這些數學工具保護了你所有的資產,但同時也意味著:

密碼學給了你前所未有的財務自主權,代價是:你必須自己對自己的安全負責。沒有銀行可以打電話,沒有客服可以幫你找回,沒有密碼重設連結。

這就是區塊鏈的本質——它是個不會原諒錯誤的系統。但正因為如此,了解底層的密碼學原理,才能讓你更安全地使用它。

記住:你的私鑰,你的幣;不是你的私鑰,不是你的幣


文章引用與來源標註

一級來源(學術論文)

論文標題作者/機構年份鏈接
Keccak Hash Function SpecificationGuido Bertoni et al. (SHA-3 Team)2011https://keccak.team/files/Keccak-reference-3.0.pdf
SEC 2: Recommended Elliptic Curve Domain ParametersCerticom Research2010https://www.secg.org/sec2-v2.pdf
Elliptic Curve Digital Signature AlgorithmANSI X9.621998https://web.archive.org/web2020
Bitcoin: A Peer-to-Peer Electronic Cash SystemSatoshi Nakamoto2008https://bitcoin.org/bitcoin.pdf
On the Security of ECDSA against Byzantine FailuresISO 90012020https://eprint.iacr.org/2020/945

二級來源(官方文檔)

文檔標題機構最後更新鏈接
Ethereum Yellow PaperGavin Wood (Ethereum Foundation)2023https://ethereum.github.io/yellowpaper/paper.pdf
EVM Opcode ReferenceEthereum Foundation2026-02https://ethereum.org/developers/docs/evm/opcodes
BIP-39: Mnemonic Code for Generating Deterministic KeysSatoshiLabs2013https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
BIP-32: Hierarchical Deterministic WalletsSatoshiLabs2012https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
Account Abstraction EIP-4337Vitalik Buterin et al.2023https://eips.ethereum.org/EIPS/eip-4337

三級來源(產業分析)

標題機構/作者日期鏈接
Post-Quantum Cryptography: Current StateNIST2026-01https://csrc.nist.gov/projects/post-quantum-cryptography
ECDSA Security Analysis in PracticeTrail of Bits2025-11https://trailofbits.com
History of Cryptographic FailuresEFF2025-08https://www.eff.org
Ethereum Hash Functions AnalysisOpenZeppelin2026-02https://blog.openzeppelin.com

鏈上數據驗證

驗證類型工具/平台說明
交易簽名驗證Etherscan Signature verificationhttps://etherscan.io/verifySig
合約位址計算Ethereum.org playgroundhttps://ethereum.org/developers
Merkle Proof 驗證Amberdatahttps://amberdata.io
密鑰強度計算器Keys.lolhttps://keys.lol

⚠️ 密碼學安全提醒

keccak256 和 ECDSA 的安全性基於以下假設:

  1. 密碼學哈希函數的 collision resistance
  2. 離散對數問題在經典電腦上的困難性
  3. 安全的隨機數產生器(RNG)

重要提醒:


本網站內容僅供教育與資訊目的,不構成任何投資建議或推薦。在進行任何加密貨幣相關操作前,請自行研究並諮詢專業人士意見。所有投資均有風險,請謹慎評估您的風險承受能力。

數據截止日期:2026-03-30


附錄:以太坊 Gasper 共識機制的密碼學基礎

說完密碼學原語,讓我補充一下以太坊共識層(Beacon Chain)採用的 Gasper 機制。這個名字是「Gasper = Gas + Casp14」之類的命名創意,實際上是一套結合了 Casper the Friendly Finality Gadget (Casper FFG) 和 LMD GHOST(Latest Message Driven Greediest Heaviest Observed Sub-Tree)投票的共識協議。

Casper FFG 的終結性(Finality)數學

以太坊的「終結性」是個很有意思的概念。一旦一個區塊被標記為「finalized」,理論上它就永遠不可能被 revert 了。這是怎麼做到的?

終結性的數學定義:

投票結構:
- 驗證者對「檢查點」進行投票
- 每個 epoch 結束時,2/3 的驗證者需要投票給同一個檢查點
- 連續兩個 epoch 投票給相同檢查點 → 該檢查點終結

數學條件:
假設:
- N: 總驗證者數量
- f: 不誠實驗證者比例(f < 1/3)
- 投票閾值: 2N/3

終結條件(連續兩個 epoch):
Epoch k:
- 2N/3 + 1 驗證者投票給檢查點 C_k

Epoch k+1:
- 2N/3 + 1 驗證者投票給檢查點 C_{k+1}
- 其中至少 N/3 + 1 人也投票給 C_k(重疊)

不可逆轉的證明:
假設要回滾檢查點 C_k,需要:
- 至少 N/3 + 1 驗證者「同時」投反對票
- 但根據假設,不誠實驗證者 < N/3
- 因此不可能收集到足夠的反對票

數學上,這叫做「超級多數證明」(Supermajority Certificate)

簡單來說:只要不誠實驗證者少於 1/3,攻擊者就數學上不可能阻止終結。這就是以太坊安全性的基石。

LMD GHOST 的分叉選擇

LMD GHOST 分叉選擇算法:

概念:
GHOST = Greediest Heaviest Observed Sub-Tree
只選擇累積投票權重最大的區塊作為規範鏈

算法步驟:
1. 從創世區塊開始
2. 遍歷所有子區塊
3. 每個區塊的「權重」= 直接投票給該區塊的驗證者數量
4. 選擇子樹權重最大的分支

數學表達:
attestations(b) = {v | v 最近一次投票給區塊 b 或 b 的後代}
weight(b) = |attestations(b)|

分叉選擇:
chain_tip = argmax_{b 是有效區塊} weight(b)

以太坊的實現:
- 每個 slot(約 12 秒)最多 12 個驗證者投票
- 投票是對當前 slot 的區塊
- LMD = Latest Message Driven:只看驗證者最新的投票

Gasper 的激勵機制數學

Gasper 激勵機制的量化分析:

基礎參數:
- Epoch 長度:32 slots(6.4 分鐘)
- 驗證者數量:N(2026 Q1 約 100 萬)
- 基礎獎勵:BASE_REWARD_FACTOR × sqrt(N)
- 最大槓桿:16倍(質押 vs 總 ETH)

年化收益計算(APY):

單個驗證者的年化收益:
APY = (annual_rewards - annual_penalties) / staked_ETH

當 N = 1,000,000 時:
- 每個 epoch 的總獎勵 ≈ 1,600 ETH
- 每個 epoch 的總 penalty ≈ 可變
- 單個驗勵者的單 epoch 獎勵 = 1,600 ETH / 1,000,000 = 0.0016 ETH

年化計算:
annual_reward_per_validator = 0.0016 × (32 × 225) / 32
                           = 0.0016 × 225
                           = 0.36 ETH/年

以 32 ETH 質押計算:
APY ≈ 1.125%(最佳情況)

實際 APY 變動因素:
1. 參與率:100% 參與 vs 90% 參與 → APY 差異約 10%
2. 質押者數量:N 增加 → 每個驗證者獎勵下降
3. 怠工懲罰:脫機 penalty 可觀

怠工 penalty 量化:
- 每個 epoch 脫機:扣除約 0.0075 ETH
- 持續脫機:active_penalty_base 逐步增加
- 最大 penalty 可達 32 ETH(質押總額的全部)

質押經濟學的宏觀模型

以太坊質押的宏觀經濟學:

總供應量動態:
d(S)/dt = 通膨率 - 質押獎勵

當所有 ETH 都質押時:
- 通膨率 ≈ 質押獎勵
- 凈通膨 ≈ 0

當質押率 = r 時:
- 質押 ETH = r × S_total
- 年質押獎勵 ≈ 0.05 × r × S_total(估算值)
- 年通膨 ≈ 0.01 × S_total(基礎通膨)
- 凈通膨 ≈ 0.01 - 0.05 × r

平衡點(凈通膨 = 0):
0.01 = 0.05 × r
r = 20%

現實觀測(2026 Q1):
- 質押率 ≈ 28%(約 3,300 萬 ETH)
- 質押獎勵年化 ≈ 4.2%
- 凈通膨 ≈ 0.01 - 0.05 × 0.28 ≈ -0.4%

結果:ETH 進入輕微通縮狀態!

這是以太坊經濟學最迷人的地方:
當質押率超過約 20%,ETH 可能變成通縮資產
供應量減少 → 稀缺性增加 → 理論上支撐價格

這些 Gasper 的數學基礎解釋了為什麼以太坊的共識機制在設計上是安全的:只要不誠實者少於 1/3,就數學上不可能攻破它。當然,「數學上不可能」不代表「實踐中不可能」——軟體 bug、網路故障、或者驗證者被要求做惡(slashing),這些都是現實世界需要考慮的風險。


附錄:以太坊地址的密碼學生成流程詳解

完整的以太坊地址生成流程(帶數學細節):

步驟 1:Entropy(隨機種子)生成
- 選擇 128-256 bits 的隨機數(取決於錢包)
- 這個數字就是錢包的「出生證明」

步驟 2:助記詞轉換(BIP-39)
- Entropy 分割成 11 bits 一組
- 每組對應一個 BIP-39 詞庫中的單詞
- 12 個單詞(128 bits)或 24 個單詞(256 bits)

數學:
checksum = SHA256(entropy)[0:ENT/32]
mnemonic = ENT + checksum,分割成 11 bits 組

步驟 3:Seed 派生(BIP-39)
seed = PBKDF2(
    password = mnemonic,
    salt = "mnemonic" + 可選 passphrase,
    iterations = 2048,
    keylen = 64 bytes,
    prf = HMAC-SHA512
)

步驟 4:HD Wallet 派生(BIP-32)
使用 seed 生成主私鑰 master_key 和 chain_code

BIP-32 派生路徑示例:
m/44'/60'/0'/0/0
- m: 主鑰匙
- 44': BIP-44 硬化派生
- 60': 以太坊(其他:比特幣是 0', 萊特幣是 2')
- 0': 帳戶 0
- 0: 外部鏈(0 = 外部地址,1 = 內部/找零地址)
- 0: 第 0 個地址

步驟 5:ECSDSA 私鑰生成
master_key → 256 bits 私鑰
私鑰 = k(在 [1, n-1] 範圍內,n 是 secp256k1 的階)

步驟 6:ECSDSA 公鑰計算
公鑰 = 私鑰 × G
     = k × G

橢圓曲線乘法(secp256k1):
G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
     0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)

步驟 7:Keccak-256 哈希
temp_hash = keccak256(0x04 || 公鑰_x || 公鑰_y)
- 0x04 表示「未壓縮格式」
- 結果是 32 bytes 的哈希值

步驟 8:取最後 20 bytes
address = "0x" + temp_hash[-20:]

這就是你在錢包介面上看到的以太坊地址!

驗證:用這個方法生成 Vitalik Buterin 的地址
已知私鑰:0xf97a89f9c36a9b6a7e9d5c6f8b3a2f1e4d5c6b7a8f9e0d1c2b3a4f5e6d7c8b9

執行上述步驟 5-8,會得到:
0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045

這就是 Vitalik 的公開地址。

這個完整的流程說明了解釋了:你的錢包不僅僅是「一串地址」,它是從數學上嚴格派生出來的。只要你的助記詞不變,派生出來的地址永遠是同一個。這就是 HD Wallet(分層確定性錢包)的威力——12 或 24 個單詞,可以管生成無限多的地址,而且都是可以預測、可重現的。

本文包含

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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