撰文:Tim Beiko
編輯:南風
以太坊向 PoS 的過渡——合併——即將到來:devnets (開發網路) 正在被建立起來,規範正在被敲定,向社羣拓展也已經正式開始。合併被設計為對以太坊終端使用者、智慧合約和 dapps 的影響最小化。儘管如此,還是有一些細微的變化值得強調。在我們深入研究這些變化之前,這裡有一些連結提供關於整體合併架構的概述:
以太坊路線圖的演變:
https://tim.mirror.xyz/CHQtTJb1NDxCK41JpULL-zAJe7YOtw-m4UDw6KDju6c
合併之後的客戶端架構:
https://tim.mirror.xyz/CHQtTJb1NDxCK41JpULL-zAJe7YOtw-m4UDw6KDju6c
本文的其餘部分將假設讀者熟悉上述內容。如果你想要更深入地瞭解合併的完整規範,可參閱:
執行層:
https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/merge.md
共識層:
https://github.com/ethereum/consensus-specs/tree/dev/specs/merge
引擎 API:
https://github.com/ethereum/execution-apis/tree/main/src/engine
01. 區塊結構
在合併之後,PoW 區塊將不再存在於以太坊網路上。相反,此前的 PoW 內容將成為信標鏈上建立的區塊的一部分。屆時你可以將信標鏈視為以太坊新的 PoS 共識層,取代之前的 PoW 共識層。信標鏈區塊將包含ExecutionPayloads, 這是當前 PoW 鏈的區塊在合併之後的等價物。下圖展示了這種關係:
對於終端使用者和應用開發者而言,這些ExecutionPayloads是與以太坊發生互動的地方。在這一層上面的交易將依舊被執行層客戶端 (Besu、Erigon、Geth、Nethermind 等) 處理。幸運的是,由於執行層的穩定性,合併只會引入最小的破壞性更改。
挖礦 & Ommer 區塊欄位
合併後,之前包含在 PoW 區塊頭中的幾個欄位將不再使用,因為它們與 PoS 無關。為了儘量減少對工具和基礎設施的破壞,這些欄位被設定為 0,或者它們的資料結構的等效值,而不是從資料結構中完全刪除。區塊欄位的全部變化可以在 EIP-3675 中找到:
https://eips.ethereum.org/EIPS/eip-3675#block-structure
由於 PoS 不像 PoW 那樣自然產生 ommers (又稱叔塊),因此每個區塊中的這些列表 (ommers) 將是空的,而該列表的雜湊 (ommerHash) 將成為一個空列表的 RLP 編碼雜湊。類似地,由於difficulty和nonce是 PoW 具有的特徵,它們將被設定為 0,同時賦予它們位元組大小值。
另一個與挖礦相關的欄位mixHash將不會被設定為 0,而是將包含信標鏈的 RANDAO 值。下文將更加詳細地對此進行闡述。
BLOCKHASH&DIFFICULTY操作碼變更
合併之後,BLOCKHASH操作碼將仍然可以使用,但鑑於它將不再透過 PoW 雜湊過程締造,因此此操作碼提供的偽隨機性將會弱得多。
與此相關,DIFFICULTY操作碼(0x44) 將被更新並重新命名為RANDOM。合併後,此操作碼將返回信標鏈提供的隨機信標的輸出 (output)。因此,與BLOCKHASH相比,這個操作碼將成為應用程式開發者們使用的一個更強大的 (儘管仍然存在偏差的) 隨機性來源。
RANDOM公開的值將儲存在ExecutionPayload中,其中儲存了與 PoW 計算相關的mixHash值值。該 payload 的mixHash欄位也將被重新命名為random。
下方是DIFFICULTY&RANDOM操作碼在合併前和合並後如何運作的圖解:
在合併之前,我們看到0x44操作碼會返回區塊頭的difficulty欄位。合併之後,此操作碼重新命名為RANDOM,並指向先前包含mixHash的區塊頭欄位,現在儲存來自信標鏈狀態的random值。
此變更在 EIP-4399中正式提出,也為鏈上應用提供了一個評估合併是否發生的方式。EIP-4399:
https://eips.ethereum.org/EIPS/eip-4399
下方摘取自 EIP-4399:
此外,此 EIP 提議的更改將允許智慧合約確定是否已經升級到 PoS。這可以透過分析DIFFICULTY 操作碼的返回值來確定。如果該返回值大於2**64,則表示交易正在 PoS 區塊中被執行。
02. 出塊時間
合併將影響以太坊上的平均出塊時間。目前,在 PoW 機制中,出塊時間平均每~13秒,實際出塊時間可能有相當大的變化。在 PoS 機制中,出塊時間被精確到 12 秒,除非由於某個驗證者離線或者因為沒有及時提交區塊而導致某個 slot 沒有出塊。但在實踐中,這種情況只發生在不到 1% 的 slots 中。
這意味著 PoS 網路上的平均出塊時間減少了約 1 秒。對於在計算中假定了某個特定的出塊時間的智慧合約,將需要考慮到這一點。
03. 安全頭部區塊& 被敲定區塊
在 PoW 機制中,總是存在區塊重組的可能性。應用程式通常會等待在新的頭部區塊 (head block) 之上挖出幾個區塊之後,才會將該這個區塊視為不太可能從權威鏈中被移除,也即視該區塊“被確認”(confirmed)。而在合併之後,我們有了“被敲定”(finalized) 和“安全的頭部區塊”(safe head block) 的概念。與 PoW 機制中“被確認”的區塊相比,PoS 中的這些區塊要更加可靠,但需要理解上的轉變才能正確地使用。
“被敲定”的區塊是指該區塊被超過 2/3 的 PoS 驗證者接受為規範 (權威) 的區塊。如果攻擊者想要建立一個與之相沖突的區塊,那麼攻擊者將必須銷燬 ETH 總質押量的 1/3。截至撰文時,這意味著超過價值 100 億美元 (或超過 250 萬枚) 的ETH。
安全頭部區塊 (safe head block) 是指在正常的網路條件下,我們期望被納入權威鏈中的區塊。假設網路延遲小於 4 秒,且大多數驗證者都是誠實的,同時沒有對分叉選擇規則的攻擊,那麼安全頭部區塊就永遠不會成為孤塊。下方連結是一個詳細介紹在各種情況下如何計算安全頭部區塊,此外我們將在之後發表的文章中對安全頭部區塊的假設和保證進行正式定義和分析:
https://docs.google.com/presentation/d/1MUVaFyd9ce3hPQ5L-UhqVSfxf1ajMYFbkActkp5xNKI/edit#slide=id.gf1d0105ca5_0_147
合併之後,執行層 API (例如 JSON RPC) 將在被要求提供latest(最新) 區塊時預設返回安全頭部區塊。在正常的網路條件下,安全頭部區塊和區塊鏈的頂端將是等同的 (安全頭部區塊會落後幾秒鐘)。與當前 PoW 的latest (最新) 區塊相比, PoS 中的安全頭部區塊將更不可能被重組。為了顯露出 PoS 鏈的實際頂端,將向 JSON RPC 新增一個unsafe標誌。
被敲定的區塊也將透過 JASON RPC 的一個全新的 finalized(被敲定) 標誌來顯露出來。這些可以作為 PoW 確認的一個強大的替代方式。下表對此進行了總結:
04. 後續行動
我們希望這篇文章能幫助應用程式開發者為期待已久的 PoS 過渡做好準備。在接下來的幾周內,一個長期存在的合併測試網將被更廣泛的社羣用於測試。還有一場即將到來的有關合並的社羣電話會議 (見下方連結),讓基礎設施、工具和應用程式的開發者們丟擲問題,並聽取關於合併的最新技術更新。我們不見不散👋🏻:
https://github.com/ethereum/pm/issues/419
感謝 Mikhail Kalinin 提供了本文“安全頭部區塊”部分的核心內容,感謝 Danny Ryan 和 Matt Garnett 審閱了本文的草稿。
***本文僅代表原作者觀點,不構成任何投資意見或建議。點選底部“閱讀原文”可檢視英文原文。