在 2017 年的 Casper FFG 論文 ^casper,Vitalik 與 Virgil 寫下了以太坊押金制的核心概念。
當時台面有兩大類的押金制設計。
鏈式押金制想模擬比特幣算力制,讓驗證者按照押金比例出塊。但受限於無本行為,這類機制運作仰賴驗證者良心。
BFT 式押金制有很多數學能證明的良好性質,最令人羨慕的是他們能做出無法反悔的決策。但問題是機制假設驗證者的名單是固定的。驗證者沒辦法出入系統。
Casper FFG 論文提出了組合兩種優勢的設計:在區塊鏈上加一層 BFT 式敲定的檢查點。
無本行為是當時鏈式押金制很頭痛的問題。不過惡意投票都有程式判斷的方法,論文裡面描述兩種懲罰條件。人們可以蒐集惡意的簽章和訊息遞交檢舉,系統就有辦法自動懲罰。
在 BFT 的改良上, Casper 提出一套能讓驗證者進出系統的方式。我們等下會看到,這點並不容易。
論文發布的當時,是想在算力制的主鏈上,部署一個管理驗證者與押金的合約。驗證者會對合約提交投票,形成敲定檢查點。全節點再去認敲定的那個區塊,作為永不再反悔的鏈頭。
「大致看起來,共識決定鏈上的資料,但現在鏈上的資料又會決定共識」特務 K 可以感受到一種雞生蛋、蛋生雞的矛盾,和設計上的挑戰。
後來歷史的發展和論文的預期有點差別。因為需要的效能和複雜度高,以太坊的客戶端開發者認為重寫一個客戶端比直接在合約上開發比較容易,以至於有日後的信標鏈與大合併。
「我們來詳細討論一些性質」小雨說。
其實敲定是某種資料庫天經地義的事情。直到比特幣搞砸了它。
如果去銀行轉帳,人們會問:「轉帳過了嗎?」
過了就是過了。
但用過算力制區塊鏈的人會聽過一種奇怪的說法:「我們要等 10 個確認,等你的交易被打包的區塊上面再疊 10 個區塊。」
「這筆交易就會 99.999999999% 被確認了,幾乎不再被翻掉。」
當然這種設計是工作量證明看透敲定這件事情,把一刀兩斷的「過了/沒過」換成機率性的確認,讓點對點網路上交易的技術能夠實現。
但敲定也有應用上和安全上的需要,因此以太坊得把它帶回來。^finality
以太坊也是有重新定義了敲定:一種經濟上的敲定。完美無缺的系統不存在,但能設定它被破壞的條件,以及回復的機制。
BFT 的設定是讓驗證者投票決定敲定檢查點。形成決議需要 2/3 比例總押金的支持。
但驗證者有沒有辦法讓點對點網路同時形成兩個檢查點?可以。
有些節點說你的交易有過,有些說沒有。
但這代表有 66% 的票投了檢查點 A ,另外 66% 投給了 B 。總共的押金才 100% ,一定有代表 32% 押金的驗證者重複投票了。這是可程式判斷的攻擊行為。檢舉!進懲罰。
現在點對點網路中有兩個世界,兩個狀態,各自有不能回頭的歷史。有些節點在其中一個世界,另一些在另外一個。但在這兩個世界中,都能夠確定的是:代表 32% 押金的人都投了兩票。檢舉的訊息紛紛到位,兩個世界中攻擊者的押金全被沒收。
結局:兩個矛盾的檢查點被敲定,但 32% 攻擊者的押金遭系統沒收。
災難復原:需要人工(可能在官網或社群網站)和跑節點的人溝通,請大家轉到某一個檢查點。
特務 K 想起了上次討論,相當於 4.5 兆新台幣的總押金。 1/3 相當於 1.5 兆新台幣,他不知道他這位國家級攻擊者的組織有沒有這種預算。
工作量證明在客戶端的程式碼很簡潔,但現實世界其實做了很多事。
其中一件幾乎隱形的事情就是在計算工作量證明的時候,因為能找到滿足條件的雜湊值是很隨機的事。
這件事相當於很天然的對礦工抽籤。
但換成押金制的時候,就得重新思考怎麼從一堆抵押的人中按押金比例抽籤。
這件事情的難度在於驗證者會想要從抽籤機制取得優勢,獲得超越押金比例的出塊機會。
目前是用類似數支遊戲的 RANDAO 作為抽籤方式。比較完整的解決方式是基於密碼學的 可驗證延遲函數(Verifiable delay functions, VDF),已經研議一陣子了。 ^randomness