從礦工到驗證者
在上一篇你已經看過權益證明為什麼取代了工作量證明:與其燒電力來抬高攻擊成本,網路改為要求參與者鎖定一筆「作弊就會被銷毀」的資本。這一篇我們把鏡頭拉近到負責鎖定的那個角色——驗證者——並走完它的一生:押金、排隊、日常職責,以及它領的薪水。
想像兩者的對比。工作量證明的礦工是一整間嗡嗡作響的 ASIC 機房,把百萬瓦電力轉成雜湊。相較之下,驗證者幾乎平淡無奇:把 32 ETH 鎖成質押,再加一台不關機的小電腦,跑著兩支程式,大多時候只是簽出一句短短的訊息:「這個區塊在我看來是有效的。」沒有噪音、沒有熱——安全性來自被冒著風險的金錢,而不是燒掉的能量。
為什麼偏偏是 32 ETH,而不是 1 或 1000?這筆押金是一個 抗女巫(Sybil) 的旋鈕。如果身分可以免費取得,攻擊者就能憑空生出上百萬個假驗證者、在投票中壓過所有人。把每個驗證者定價在 32 ETH,讓假身分代價高昂,同時又讓門檻夠低,使活躍集合非常龐大——到 2025 年,這條鏈已有超過一百萬個驗證者守護著逾三千萬枚 ETH——這正是讓投票權分散、讓鏈保持去中心化的關鍵。
押金與生命週期
成為驗證者的第一步在執行層:你把 32 ETH 送進存款合約(deposit contract),並附上三樣東西——一把 BLS 簽章公鑰(驗證者在鏈上的身分)、一組提款憑證(withdrawal credentials)(指定這筆錢日後可以回到哪個位址),以及一段證明你掌控該金鑰的簽章。信標鏈會盯著存款合約,一旦看到你的存款,就會替你的驗證者排上啟用的隊伍。
{
"pubkey": "0x933ad9...8f7329267a8811c397529dac52ae1342ba58c95",
"withdrawal_credentials": "0x010000000000000000000000 3cd4a...e91",
"amount": 32000000000, // 32 ETH expressed in gwei
"signature": "0xa1f3...c0", // BLS signature over the above
"deposit_data_root": "0x9b4f...2a"
}從這裡開始,驗證者會走過一組固定的狀態。它不能直接跳到活躍(active)——進場與離場都受流轉上限(churn limit)限制,因此每個週期(epoch)只允許有限數量的驗證者加入或退出。這種刻意的緩慢,讓活躍集合的變動速度不會快過協定安全假設所能容忍的程度。
deposited # 32 ETH seen by the deposit contract
-> pending # waiting in the activation queue (rate-limited by churn)
-> active # attesting every epoch, occasionally proposing
-> slashed # caught cheating -> forcibly exited (next guide)
-> exiting # voluntary exit requested, draining the exit queue
-> withdrawable # stake unlocked and swept to the withdrawal address時槽、週期,與兩項職責
信標鏈上的時間被切成 12 秒的時槽(slot),每 32 個時槽組成一個 週期(epoch)(約 6.4 分鐘)。在這個時鐘上會發生兩件事。每個時槽恰好有一個區塊提案者。而每個週期裡,每一個活躍驗證者都會被分進一個委員會,並欠網路一筆 出證(attestation)——對它當下所相信的鏈樣貌投下一票。
出證不是含糊地按個讚;它是一張精確的三段式選票:source(來源)檢查點(它同意的上一個已認證點)、target(目標)檢查點(它投票要去認證的週期邊界),以及 head(鏈頭)區塊(它當下所看見的鏈尖)。這三票正是後面幾篇所談的最終性機制賴以運作的養分。你替自己的出證簽名並廣播出去;接著由專責的聚合者(aggregator)把成千上萬張一模一樣的選票合併成單一的 BLS 聚合簽章,鏈才不會被訊息淹沒。
- 在週期一開始,你的驗證者用戶端會得知自己被分到哪個委員會、要在哪個時槽出證。
- 輪到那個時槽時,它會檢視鏈,並(依分叉選擇規則)決定當前的鏈頭區塊。
- 它組出選票:來源檢查點、目標檢查點、鏈頭區塊。
- 它用驗證者金鑰替選票簽名,並廣播給對等節點。
- 聚合者把許多相符的選票打包成一筆出證,由稍後的區塊提案者納入鏈上。
提案抽籤
每個時槽由誰來提案?靠抽籤。協定維護著一個共享、難以預測的種子,叫做 RANDAO:每個區塊提案者都會混入一份新的隨機貢獻,因此長期下來沒有任何一方能控制結果。每個時槽都用這個種子,從活躍集合裡挑出一位提案者,並以有效餘額(effective balance)加權——質押愈大,按比例中籤愈頻繁。
# How the protocol picks the proposer for a slot (rejection sampling).
def compute_proposer_index(validators, active_indices, seed):
i = 0
total = len(active_indices)
while True:
candidate = active_indices[compute_shuffled_index(i % total, total, seed)]
random_byte = hash(seed + to_bytes(i // 32))[i % 32] # 0..255
eff = validators[candidate].effective_balance
# accept with probability proportional to effective balance
if eff * 255 >= MAX_EFFECTIVE_BALANCE * random_byte:
return candidate # this validator proposes the slot
i += 1 # rejected, try the next candidate請注意,驅動提案機率與出證權重的是有效餘額,而不是原始餘額。有效餘額設有上限(傳統上是 32 ETH),並以 1 ETH 為級距、帶有遲滯地量化,因此只會以整齊的級距變動。一個實際後果:在最初的設計下,把你的餘額推過 32 ETH 的那些獎勵並不會複利——你的權重會被釘在 32,直到你把多出來的部分提走為止。
獎勵從何而來——以及為何質押的人愈多、獎勵愈薄
驗證者的收入來自兩條獨立的水流。共識層獎勵是協定為你履行職責——準時出證、被選中時提案、擔任同步委員會成員——而新發行的 ETH。執行層獎勵則是優先小費,以及在你所提案的區塊內所擷取的任何 MEV;許多驗證者透過 MEV-Boost 把造塊外包出去,以求最大化這部分收入。前一條水流穩定而微薄;後一條則是時有時無,只在你難得提案的那些時槽才降臨。
每個週期的共識獎勵都建立在一個叫做基礎獎勵(base reward)的量上,而它的公式藏著整個驗證者經濟學裡最重要的事實:基礎獎勵與全網質押總量的平方根成反比。
# Ethereum consensus spec, all values in gwei
EFFECTIVE_BALANCE_INCREMENT = 1_000_000_000 # 1 ETH
BASE_REWARD_FACTOR = 64
def base_reward_per_increment(total_active_balance):
return EFFECTIVE_BALANCE_INCREMENT * BASE_REWARD_FACTOR \
// integer_sqrt(total_active_balance)
def base_reward(effective_balance, total_active_balance):
increments = effective_balance // EFFECTIVE_BALANCE_INCREMENT # 32 for a full validator
return increments * base_reward_per_increment(total_active_balance)
# Because of the integer_sqrt, base_reward ~ 1 / sqrt(total stake):
# quadruple the ETH staked and the per-validator reward halves.代入真實數字。當約有 3200 萬枚 ETH 質押時,`integer_sqrt(total)` 使每 1 ETH 級距的基礎獎勵 ≈ 358 gwei,於是一個完整的 32 ETH 驗證者每個週期約賺 11,400 gwei。乘以一年約 82,000 個週期,便是約 0.94 ETH/年,大約 2.9% 的年化報酬——這還沒算小費與 MEV。現在把質押量翻四倍到 1.28 億枚 ETH:平方根翻倍、基礎獎勵減半,報酬便降到大約 1.5%。質押的人愈多,整體安全性愈高,但每個人分到的那一塊愈薄——這是設計使然。
這份基礎獎勵會依權重分攤到各項職責上。在每 64 份裡:target(目標)票拿 26 份(它是推動最終性的那一票,因此給得最多)、source(來源)票 14 份、head(鏈頭)票 14 份、同步委員會職責 2 份,而把你的出證納入區塊的那位提案者拿 8 份。準時是一切——遲到的票,或指錯目標的票,只能拿到打折的獎勵,甚至什麼都拿不到。
提領出場,以及參與的四種方式
鎖進去的錢必須能取出來。自 Capella/Shanghai 升級(2023 年 4 月)起,持有 0x01(執行層)提款憑證的驗證者可獲得自動部分提款——超過 32 ETH 的部分每隔幾天就會被掃進它的提款位址——並可透過提交自願退場、排空退場隊伍,在狀態變為可提領後讓剩餘餘額被掃出,完成全額提款。當初節流進場的同一道流轉上限,也節流著退場,這正是阻止惡意絕對多數「攻擊後在一個區塊內逃逸」的關鍵。
並不是每個人都自己架機器。質押大致有四種方式,在掌控權與便利性之間權衡:
- 獨立質押(solo staking)——自己跑節點、自己保管金鑰。完整的獎勵、完整的掌控,也要為在線率負全責;這是最有助於去中心化的選擇。
- 質押即服務/質押池——你出 32 ETH(或其中一部分),由服務商代為運行節點並收取費用,讓你省去硬體與維運的負擔。
- 流動性質押(liquid staking)——你把任意金額存入某個協定(例如 Lido),換得一張代幣(如 stETH)代表你的質押部位,它在賺取收益的同時還能拿到 DeFi 別處使用。
- 中心化交易所——完全託管:交易所保管金鑰與 ETH,並付給你收益。最省事,但你得信任一個第三方。
不論走哪條路,底層軟體的形狀都一樣:一個 共識用戶端(信標節點,負責跟隨權益證明並告訴你該做哪些職責),搭配一個 驗證者用戶端(保管簽章金鑰,產出出證與區塊)。唯一絕不能省略的紀律,是讓罰沒保護(slashing-protection)保持開啟,這樣當機、重啟或失敗轉移搞砸時,都不會讓你的金鑰簽出兩則互相矛盾的訊息——而那,正是會觸發我們下一篇所要談的懲罰的那種冒犯。