兩種「完成」
用現金付錢給朋友,鈔票一離手交易就結束了——沒人能伸手到過去把它抹掉。用銀行轉帳付同一筆錢,錢看起來已經到帳,但接下來幾天裡,一筆詐欺申訴或一次追回就可能把它逆轉。區塊鏈面對的正是這個問題:一筆交易一旦進了區塊,到底是已定案,還是只是大概定案?答案就是最終性這個概念——而權益證明的鏈,比它之前那些鏈給出了更鋒利的答案。
比特幣與其他工作量證明的鏈,提供的永遠只是機率性最終性。一個區塊從不會絕對無法逆轉;相反地,它被後面的區塊埋得越深,攻擊者要重寫它就得重做越多的總工作量。每多一個確認(confirmation),被逆轉的機率大致以指數方式下降——這就是為什麼交易所往往要等六個確認,才把一筆比特幣入金記到你帳上。「六」是慣例,不是物理定律:只要算力夠大,攻擊者原則上能重組任意數量的區塊。
權益證明追求的是更強的東西:經濟最終性——經過短暫延遲後,一個區塊被宣告為最終,而要逆轉它得花一筆固定、龐大、而且算得出來的代價。不是「越來越不可能」,而是「要推翻這個,就得有人可被證明地銷毀全網質押資本的三分之一」。這份保證,是靠一個架在鏈之上的最終性裝置打造出來的。在以太坊上,這個裝置叫 Casper,而包含它的整套共識則叫 Gasper。
鏈的日曆:時槽、時期與檢查點
最終性需要一座時鐘,所以以太坊把時間切成一張嚴格的網格。最小單位是 12 秒的時槽(slot),每個時槽會選出一位驗證者來提議區塊。三十二個時槽組成一個時期(epoch),因此一個時期是 32 × 12 = 384 秒,也就是 6.4 分鐘。這套時槽與時期結構是整套共識的心跳:驗證者每個時期被編成委員會,而每位活躍的驗證者,每個時期恰好見證一次。
關鍵的訣竅是:Casper 不試圖把每一個區塊都定案——那要投的票太多了。它只對檢查點(checkpoint)投票,而檢查點的定義就是每個時期第一個時槽裡的那個區塊。把一個檢查點定案,就自動把它之前的每個區塊都定案了——所以每個時期只要把一個檢查點搞定,就足以把它後面整條鏈一起搞定。
SECONDS_PER_SLOT = 12 SLOTS_PER_EPOCH = 32 # one epoch = 12 * 32 = 384 seconds = 6.4 minutes slot = 1_000_000 # the chain's current slot number epoch = slot // SLOTS_PER_EPOCH # -> epoch 31250 # A block is a CHECKPOINT only if it sits in the first slot of an epoch: is_checkpoint = (slot % SLOTS_PER_EPOCH == 0) # Casper FFG only ever votes on checkpoints (block, epoch) pairs, # never on every block -- that is what keeps the voting cheap.
Casper FFG:先確證,再定案
Casper FFG(Friendly Finality Gadget,友善最終性裝置)是 Gasper 裡真正把區塊蓋上「最終」印章的那一塊。它靠的是一個兩段式棘輪——先確證、再定案——而它計算的單位是質押,從來不是人頭數。驗證者每做一次見證,都帶著一張形狀像箭頭的 FFG 投票:一個它據以出發的來源(source)檢查點,以及一個它投票要確認的目標(target)檢查點。當代表至少全部質押 ETH 三分之二的見證,對同一支 source→target 箭頭達成一致時,這個目標就獲得一條超級多數連結(supermajority link)。
- 投票。 在時期 N 期間,每位驗證者的見證會指名一個來源(最近一個已確證的檢查點)和一個目標(時期 N 的檢查點)。
- 確證。 當價值達總質押 ≥ 2/3 的見證共用同一條 source→target 連結時,目標就變成已確證(justified)。已確證代表「獲得強力支持」,但還不是無法逆轉。
- 定案。 當一個檢查點 B 已確證,而且緊接著的下一個檢查點 C 是經由直接連結 B→C 而確證時,B 就變成已最終定案(finalized)。連續兩個首尾相連的已確證檢查點,就把前面那一個鎖死。
- 連鎖。 把 B 定案,就把 B 及其之前的每個區塊都定案了。在健康狀況下這每個時期都會發生,所以最終性大約落後鏈頭兩個時期——約 12.8 分鐘。
# Tally FFG votes by STAKE behind them, not by validator count.
# A "supermajority link" needs >= 2/3 of ALL staked ETH.
def on_supermajority_link(source, target, stake_for_link, total_stake):
if stake_for_link >= (2 * total_stake) // 3:
target.justified = True # stage 1: justify the target
# stage 2: if the link is between CONSECUTIVE checkpoints
# and the source was already justified, finalize the source.
if source.justified and source.epoch + 1 == target.epoch:
source.finalized = True
# ...which finalizes every block at or before `source` too.具體來說:假設時期 99 的檢查點 A 已經確證。整個時期 100 裡,驗證者以來源 A、目標 B(時期 100 的檢查點)做見證;一旦 ≥ 2/3 的質押都這麼做了,B 就確證。整個時期 101 裡,他們以來源 B、目標 C 做見證;當這條連結跨過 2/3,C 就確證——而因為 B 早已確證、其直接子節點 C 如今也確證了,B 就此最終定案。從那一刻起,任何誠實節點都不會再去建一條把 B 排除在外的鏈。
LMD-GHOST:在兩次定案之間,選出鏈頭
最終性每隔幾個時期才落地,但區塊每 12 秒就生一個。在兩次定案之間,網路仍得對「現在的鏈頭是哪個區塊」——該延伸哪條分叉——達成一致。這份工作交給一個叫 LMD-GHOST 的分叉選擇規則:Latest-Message-Driven Greediest Heaviest-Observed SubTree(以最新訊息驅動、最貪婪、觀察到最重的子樹)。Gasper 正是這兩者的結合——Casper FFG 負責最終性、LMD-GHOST 負責活的鏈頭——這也是為什麼「Gasper」有時會被拆解成 GHOST + Casper。
LMD-GHOST 在每個分叉處運作起來像一場加權淘汰賽。取每位驗證者最新的那一張見證(以最新訊息驅動——只算最近一票,攻擊者就無法用舊票灌水),把它當成這位驗證者的質押投給某個特定區塊。在每個分岔點,往下走進累積質押權重最大的那棵子樹,一直走到葉節點為止。那片葉子就是鏈頭。關鍵在於,這場搜尋不是從創世開始的——它從最近一個已確證的檢查點出發,所以分叉選擇被圈在 Casper 已經半定案的範圍之內。
為什麼最終性值「全部質押的至少三分之一」
這裡是經濟最終性的核心,一個叫可問責安全性(accountable safety)的結果。假設有兩個互相衝突的檢查點——位在彼此不相容的分叉上——竟然雙雙都定案了。Casper 的罰沒規則禁止兩件事:驗證者絕不能對同一個目標時期投出兩張不同的票(雙重投票),也絕不能投出一張其 source-to-target 跨距包夾了它自己先前某一票的票(包夾投票)。可以用數學證明:要讓兩個衝突的檢查點雙雙定案,持有全部質押至少三分之一的驗證者,必定打破了這兩條規則之一。
而且這些被打破的規則是可歸責的:那兩張互相矛盾的簽章,是公開、永久的證據,明確指出究竟是哪些驗證者作弊,所以他們每一個都可以被罰沒。這就把「逆轉最終性」從一個機率,變成了一張帳單。在質押遠超過 3,000 萬 ETH 的情況下,三分之一就是超過 1,000 萬 ETH——數百億美元——是攻擊者得燒掉的、而不只是冒險押上的,而且協定一看到就能指認並銷毀它。這正是「一個已定案的以太坊區塊不可逆轉」的精確意義。
拿這個跟工作量證明的 51% 攻擊對比:在那裡,攻擊者租用或打造算力、重寫歷史,然後把硬體留著——成本是可回收的,而且鏈上沒有任何收據指名是誰幹的。權益證明的罰沒,讓這種攻擊變得自我入罪而且無法回收。這就是它提供的整筆交易:你放棄「日後逆轉一個已定案區塊」的選項,換來的是一份以「被銷毀的資本」、而非「逐漸消逝的機率」來定價的保證。
誠實面對極限:13 分鐘、漏損與弱主觀性
這份保證是真的,但不是免費的。最明顯的代價是延遲:定案要花大約兩個時期,所以一個區塊真正被鎖死前,大概會過去 12.8 分鐘。對一杯咖啡來說那是天長地久;對一筆 5,000 萬美元的清算來說那快得驚人。研究者正積極追求單時槽最終性——在一個 12 秒的時槽內、而非兩個時期內就定案——但那需要每個時槽都把整個驗證者集合的見證聚合起來,在以太坊的規模下很難,至今仍是個未解的工程問題。
其次,最終性可能卡住。如果超過三分之一的驗證者離線,就沒有任何連結能達到 2/3 超級多數,鏈就停止定案——不過 LMD-GHOST 仍持續產出區塊,所以鏈還活著。為了治好這個,不活躍漏損會慢慢放掉那些沒在見證之驗證者的質押,直到仍在線的集合重新爬升到(如今變小的)總額三分之二以上,最終性才恢復。這是個刻意的取捨:寧要活性也不要即時的安全性——與其永遠停擺,鏈寧可犧牲缺席的驗證者來自我恢復。
這不是假設。2023 年 5 月 11–12 日,以太坊主網有好幾個時期無法定案——第一次大約 25 分鐘——當時一波引用了舊資料的見證湧入,觸發了 Prysm 與 Teku 這兩個共識用戶端的資源耗盡漏洞。整段期間鏈都持續產出區塊,待節點修補、負載趨緩後便恢復定案。沒有資金損失;這起事件顯示最終性是一個嚴格更強的性質、強過活性,而且網路可以暫時失去它、卻仍向前推進。
最後,最終性也改變了新節點如何啟動。工作量證明的新來者,可以從創世開始客觀地信任最重的那條鏈。權益證明的新來者卻不行,因為舊的驗證者金鑰可以被拿來廉價地偽造一段替代歷史——這就是長程攻擊(long-range attack)。於是以太坊倚靠弱主觀性:一個從零同步(或離線好幾個月後)的節點,必須從可信來源拿到一個近期的已定案檢查點雜湊,並且只信任與之相容的鏈。這是個不大、但誠實的讓步——一枚現實的新鮮指紋——也是「拿客觀卻軟的最終性,去換主觀卻硬的最終性」所付的代價。