JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

Tendermint 與 BFT:通往即時最終性的另一條路

以太坊讓你逐漸相信一個區塊不會被推翻;Tendermint 卻在區塊落地的那一刻就讓它定案。來認識經典的拜占庭容錯——三分之二法則、提議—預投票—預提交,以及它所做的交換:安全優先,所以鏈寧可停擺也不分叉。

通往最終性的兩條路

在上一篇你看著以太坊的 Gasper 一點一點把區塊推向最終性:等上兩個 epoch——大約十三分鐘——一個被定案的檢查點便在經濟上無法回頭。區塊從來不是一出生就被「蓋章」定案;它隨著證言不斷堆疊而愈來愈安全,就像在工作量證明下,一筆被埋得愈深的交易愈安全一樣。這是機率性、延遲的最終性,而以太坊是刻意這麼選的。

現在想像另一種承諾:區塊一被產出,就是最終定案——不必確認、不必等十三分鐘、永遠不會重組。這正是一條 Tendermint 鏈所提供的,而它的做法是回頭援引 1980 年代分散式運算的一項成果,而非中本聰的鏈競賽。這篇作為權益證明這一階收尾的指南,將對比這兩種哲學,並拆開經典拜占庭容錯的機械原理。

拜占庭將軍問題與三分之二法則

幾位將軍包圍一座城,各自紮營在不同的山頭。他們必須全部一起進攻、或全部一起撤退——三心二意、分裂的進攻必敗。他們只能派信使,有些信使很慢,更糟的是,有些將軍是叛徒,對一個鄰居說「進攻」、對另一個說「撤退」。忠誠的將軍們要如何在謊言之中達成相同的決定?這就是拜占庭將軍問題(Lamport、Shostak、Pease,1982),而這正是驗證者面對的處境:即使其中有人可能心懷惡意、離線或說謊,仍要對下一個區塊取得一致。

PBFT實用拜占庭容錯,Castro 與 Liskov,1999)為真實系統所形式化的經典答案,是一條計數規則:在 n = 3f + 1 個參與者中,只要你要求任何事都得有超過三分之二法定門檻同意,就能容忍最多 f 個拜占庭節點。不是一半——是三分之二。多出來的這道餘裕,正是用來同時撐過說謊者與一個緩慢、會丟訊息的網路。

為什麼是三分之二而不是簡單多數?因為任兩個超級多數必定重疊於某個誠實節點。取 100 位等權重的驗證者,於是 f = 33,法定門檻為 67(剛好超過三分之二)。任兩個各 67 票的法定群至少共享 67 + 67 − 100 = 34 位驗證者。若要在同一高度定案兩個互相衝突的區塊,兩者都得拿到 67 票——但重疊處的這 34 位等於對兩者都投了票,也就是模稜兩可作證(equivocate)。在至多 33 個叛徒之下,這 34 位的重疊必含至少一位誠實驗證者,而誠實驗證者絕不會對兩個衝突區塊都投票。因此除非有 34 位——超過三分之一——同時作弊,分叉才可能發生。整場賽局的關鍵就在這裡。

Tendermint 的三步驟:提議、預投票、預提交

Tendermint 把那條計數規則化為一套節奏。每個區塊高度由一個或多個回合(round)決定,而每個回合都依序走過三個步驟:提議 → 預投票 → 預提交。一個確定性、依質押權重的輪替演算法為每個回合挑出提議者,因此大家早就對輪到誰有共識——不需要挖礦樂透。

// Tendermint consensus (simplified) — run by every validator at height H
for round in 0, 1, 2, ...:
    proposer = proposer_for(H, round)      // deterministic, stake-weighted round-robin

    // ---- PROPOSE ----
    if self == proposer:
        block = lockedBlock if locked else build_block(mempool)
        broadcast Proposal(H, round, block)
    proposal = await_proposal(timeout_propose)

    // ---- PREVOTE ----
    if proposal is valid and (not locked or proposal == lockedBlock):
        broadcast Prevote(H, round, hash(proposal))
    else:
        broadcast Prevote(H, round, nil)
    prevotes = collect_prevotes(timeout_prevote)

    // ---- PRECOMMIT ----
    if prevotes has > 2/3 voting power for some block B:   // a "polka"
        locked = true; lockedBlock = B; lockedRound = round
        broadcast Precommit(H, round, B)
    else:
        broadcast Precommit(H, round, nil)
    precommits = collect_precommits(timeout_precommit)

    // ---- COMMIT / DECIDE ----
    if precommits has > 2/3 voting power for some block B:
        commit B at height H      // FINAL: irreversible, no reorg possible
        break                     // advance to height H+1
    // otherwise: no decision this round -> next round, new proposer
提議—預投票—預提交的迴圈。「某區塊獲 +2/3 預投票」稱為 polka;「+2/3 預提交」則讓該區塊永久定案。
  1. 提議:該回合的提議者廣播一個由 mempool 組成的候選區塊。
  2. 預投票:每位收到有效提議的驗證者,廣播一張投給該區塊雜湊的預投票;逾時或看到無效區塊者則投 nil(空白)。
  3. Polka:以 100 位等權重驗證者為例,當一位驗證者看到同一區塊獲得 ≥67 張預投票時,該區塊便取得 polka——在預投票步驟取得超級多數的認可。
  4. 預提交:一看到 polka,驗證者便鎖定該區塊並為它廣播一張預提交。
  5. 提交:當一位驗證者首次看到該區塊獲 ≥67 張預提交,便提交——區塊定案,鏈進到下一個高度。若該回合反而逾時(提議者不良、網路延遲),眾人便帶著新的提議者進入下一回合,重新嘗試。

鎖定、可問責性,以及它為何安全

單一回合很容易;危險潛伏在跨回合之處。假設第 0 回合卡住了——少數驗證者看到了足夠的預提交而提交了區塊 A,但網路打了個嗝,使多數人沒看到,於是第 1 回合開始。倘若驗證者此時可以隨意改挺另一個區塊 B,兩個衝突區塊便可能各自隨時間湊滿 +2/3。鎖定正是防止這件事。當驗證者在第 0 回合對 A 投下預提交,它就鎖定於 A:在之後每一回合都只會為 A 投預投票,唯有真正目睹某個更高回合裡 B 取得 polka,才會把鎖切換到 B。由於 polka 本身就需要 +2/3,驗證者永遠不會被誘騙而放棄一個已被超級多數預提交的區塊。

這帶來可問責的安全性,正是 Casper FFG 追求的同一獎賞。回想重疊論證:要分叉兩個已定案的區塊,需要我們 100 位驗證者中的 ≥34 位對兩者都投預提交——也就是模稜兩可作證。模稜兩可不是含糊的指控;每張預提交都是一則由驗證者簽署的訊息,因此那兩個互相矛盾的簽章就是一份密碼學上的自白。它們會成為任何人都能提交的罰沒證據,作惡者失去質押並被逐出。所以攻擊者無法廉價或匿名地破壞安全:一次分叉至少要燒掉全部質押資本的三分之一,而且可被證明。

安全勝於活性:BFT 鏈會停擺,但不分叉

每一種共識設計都必須在兩個性質間取得平衡:安全性(絕不定案兩個衝突區塊)與活性(持續產出新區塊)。一個基礎性的結果指出,在不可靠的網路中你無法同時保證兩者——所以每個系統都得選擇出事時要犧牲哪一個。Tendermint 選擇安全。如果超過三分之一的投票權重離線或被網路分割隔開,就沒有區塊能達到 +2/3 的預提交門檻,於是鏈乾脆停下來。它寧可完全不產出區塊,也不冒著網路兩半各自定案不同歷史的風險。

以太坊做了相反的抉擇。它的分叉選擇規則 LMD-GHOST 在網路分割期間總會挑出一個鏈頭、讓鏈保持存活;Casper FFG 在其上疊加最終性,而若因無法取得超級多數而使最終性卡住,不活躍洩漏便慢慢抽乾離線驗證者的質押,直到在線的一群重回三分之二以上、能再次定案。以太坊持續前進,但可能有一段時間無法定案;Tendermint 鏈則凍結僵住,卻永不自相矛盾。兩者沒有誰「更好」——只是不同的交換。

即時最終性的代價:O(n²) 與較小的驗證者集合

即時最終性並非免費,而這筆帳是用去中心化支付的。要提交一個區塊,每位驗證者都必須聽到(超過三分之二的)其他每一位驗證者的預投票與預提交。這是全體對全體的通訊:在 n 位驗證者下,每個區塊大約有 n² 則投票訊息在網路上飛來飛去。在 180 位驗證者時約為 180 × 180 ≈ 32,000 則訊息一個步驟——還可以。在一百萬位驗證者時則是 10¹²——根本不可能。

這就是為什麼一條 Tendermint 鏈會把它的活躍集合限制在數百位驗證者——Cosmos Hub 約跑 180 位,並有一個由治理投票決定的硬上限——而以太坊的設計卻能讓約 100 萬位驗證者參與。以太坊買到這個規模,恰恰是靠放棄即時最終性:它把驗證者拆成委員會、每個 slot 只讓一部分作證,並把他們的 BLS 簽章聚合成一個,以接受約 13 分鐘的最終性延遲作為交換。這個對比正是可擴展性三難困境的乾淨範例:快速最終性、龐大驗證者集合、簡單設計——只能挑著要。

該走哪條路,以及它們的交會點

那麼,即時最終性何時值回它的去中心化代價?最重要的是當別的鏈需要快速信任你的區塊時。Cosmos 的 IBC 協定讓鏈彼此驗證對方的標頭來傳遞訊息,而唯有一個標頭一旦被看見便永不可逆,這才站得住腳——這正是單區塊 BFT 最終性所保證的。想要自己主權驗證者集合、可預測的約 1~6 秒出塊時間、且讓橋與交易所沒有重組風險的應用鏈,會自然而然選擇 Tendermint。而珍視最龐大、最無需許可的驗證者集合與最大抗審查性的鏈,則傾向以太坊式的機率性共識。

這兩條路正悄悄交會。以太坊今日的最終性,是由一個栓在機率性鏈上的最終性裝置提供;但其活躍的研究目標單一 slot 最終性,正是要在數秒內定案每一個 slot——把 Tendermint 一直以來所擁有的那種 BFT 即時最終性引進來,同時藉由激進的簽章聚合保有龐大的驗證者集合。前沿已不再是「機率性對上 BFT」,而是「在仍能於一個 slot 內定案的前提下,我們能保有多大的驗證者集合」。

至此,權益證明這一階收尾。你現在懂得了為何質押取代了電力、驗證者如何賺取獎勵又被罰沒、最終性在機率性的 Gasper 世界與即時 BFT 世界中各自意味著什麼,以及那個把「會停擺的鏈」與「會分叉的鏈」區分開來的深層安全對上活性交換。帶走一句話:最終性是一個關於「什麼永遠無法被撤銷」的承諾,而每一種共識設計,都是為這個承諾所付出的不同代價。