原文:Herodotus: Proving Ethereum's State Using Storage Proofs on Starknet

翻譯及校對:「Starknet 中文社群」

概要

  • StarkWare 與Herodotus 合作開發了一種追溯以太坊自創始至今所有區塊的證明方法。
  • 透過使用加密證明和區塊哈希值來實現。
  • 實現了EIP-2935 的目標— 以一種鏈原生的方式存取超過256 個區塊的歷史區塊哈希值,並為DeFi 等新用例解鎖新可能性。
  • Herodotus 和StarkWare 將這項技術帶入以太坊作為公共產品。

引言

在以太坊上以可證明的方式存取歷史狀態非常重要。但到目前為止,我們能夠無需信任地存取的歷史記錄只限於過去一小時。

但Starknet 是一個充滿活力、不斷創新、突破可能性邊界的生態系統。如今,由於Herodotus 和StarkWare,我們能夠以鏈原生且可證明的方式,追溯並獲取自創世區塊以來的所有以太坊區塊哈希值。

讓我們詳細了解Herodotus 和StarkWare 是如何實現這一目標的,以及這一切意味著什麼。我們將從儲存證明的背景知識開始講起。

什麼是儲存證明?

儲存證明允許我們在無需任何信任第三方的情況下,證明某個狀態在過去的某個時間點確實存在。透過儲存證明,信任就內建在數學之中的。儲存證明還可用於跨鏈存取這些狀態。

在最近一篇關於儲存證明的文章中,我們介紹了引領儲存證明研究和創新的團隊—Herodotus。目前,Herodotus 團隊實現了一種新技術,能夠自創始區塊以來無需信任地證明以太坊狀態,從而大幅提升儲存證明效能。

讓我們探討Herodotus 如何實現這一點,以及其重要性。

在鏈上證明以太坊創始區塊

首先,我們需要理解以太坊區塊頭和區塊哈希值的工作原理。

什麼是區塊頭和區塊哈希值?

區塊頭是區塊的一部分,概括了該區塊中包含的所有信息,包括父區塊的哈希值、區塊時間戳記、狀態根等。

Herodotus:如何利用Starknet儲存證明來證明以太坊狀態?

以太坊區塊頭和狀態默克爾樹(內容來源)

區塊頭包含許多資訊。在本文中,我們將重點放在狀態根。讓我們來看看原因。

透過上圖可以看到,區塊頭下方是以太坊帳戶狀態。每個以太坊帳戶都有一個關聯的儲存空間,用於儲存該帳戶的變數(本質上是智慧合約的狀態)。帳戶儲存的加密承諾通過雜湊處理後,連同帳戶餘額、隨機數和代碼雜湊一起,儲存為儲存根。這些合起來,基本上構成了該帳戶狀態的概要。

一棵包含所有以太坊帳戶狀態的默克爾帕特里夏樹(Merkle Patricia Trie)被構建起來,其哈希值作為狀態根儲存在區塊頭(在上圖中標記為stateRoot)。這個狀態根包含了證明任意特定時間點整個以太坊網路狀態所需的所有資訊。

最後,由於以太坊(及EVM鏈)上的每個區塊都包含這個狀態根,且每個區塊還有一個被稱為區塊哈希值的關聯字串(這是對包含狀態根在內的區塊頭內的所有內容進行哈希處理的結果),區塊哈希值就是整個以太坊狀態在特定時間點的加密承諾。

EVM上的歷史區塊哈希值

鑑於區塊哈希值中保存了大量的關鍵信息,我們經常需要訪問它們的歷史記錄。

在Solidity中,如果我們想要檢索兩個區塊前開採的區塊雜湊值(回溯計數從包含交易的區塊開始),可以使用以下語法:

Herodotus:如何利用Starknet儲存證明來證明以太坊狀態?

方法非常簡單。但有一個問題—這種區塊哈希方法只能檢索最近的256個區塊的雜湊。以以太坊平均12秒一個區塊來計算,相當於鏈上51.2分鐘的歷史記錄。

對於希望使用歷史區塊哈希作為熵(隨機性)來源的人來說,256個區塊的限制通常是足夠的。然而,就以太坊八年的歷史來說,如果你想使用區塊哈希值來獲取其在特定區塊的歷史狀態,51分鐘的歷史記錄遠遠不夠。

這個鏈上256個區塊雜湊值檢索限制主要是為了提高狀態儲存效率和減少潛在的狀態成長問題。

Herodotus使獲取完整的區塊雜湊值歷史記錄成為可能

Herodotus是如何解決這個限制,並讓我們實現:

  • 存取以太坊區塊哈希值的完整歷史記錄
  • 證明自創始區塊以來的所有以太坊狀態
  • 並且全部以無需信任的方式完成

關鍵在於加密證明的力量。

讓我們深入探討一下Herodotus歷史區塊雜湊值累加器的程序步驟:

第一步:註冊一個最近的區塊哈希值

在以太坊主網上,一個最近的區塊哈希值會在名為SharpFactsAggregator的智能合約中註冊。可以使用區塊雜湊操作碼(操作碼值0x40)來檢索這個區塊雜湊值,並將其作為一個簡單的字串變數保存在上述智慧合約中。也可以登記對應的區塊編號,以便日後存取。

假設註冊的區塊號碼是18,000,000,透過Etherscan我們可以看到,這個區塊的雜湊值是0x95b1…4baf3。

第二步:證明最新區塊的哈希值

下一步是從一個存檔節點檢索區塊18,000,000的區塊頭信息,透過鏈下計算得出它的區塊哈希值,並與已註冊的區塊哈希值0x95b1…4baf3進行比較。這個計算過程同樣會透過一個證明器來創建這項計算的證明。

這個區塊的雜湊值加入到默克爾山脈範圍(Merkle Mountain Range)。這是默克爾樹的變體,向樹中添加新元素不需要大量計算。

第三步:證明X-1區塊的哈希值

一旦我們證明了從存檔節點檢索的區塊頭是有效的,我們接著獲取X-1區塊的區塊頭,計算其哈希值,並將其與X區塊的父哈希值進行比較(這個值可以在我們之前檢索到的X區塊的區塊頭中找到)。

如果哈希值匹配,我們就可以確定X-1區塊的區塊頭也是有效。由於整個計算可以建模為函數,因此可以同時建立該計算的STARK證明。由此產生了X-1區塊頭有效性的證明(見下圖)。

Herodotus:如何利用Starknet儲存證明來證明以太坊狀態?

第四步:遞歸證明前序區塊的雜湊值

對所有前序區塊的區塊哈希值進行類似的計算處理,直到追溯至以太坊主網的創世區塊。這些哈希值都會附加到MMR 樹中,從而創建一個最終的MMR 根。

Herodotus:如何利用Starknet儲存證明來證明以太坊狀態?

需要注意的是,這些計算都是在鏈下完成的,而Herodotus 同時產生了計算證明。

第五步:在鏈上發布證明及其後續使用

一旦產生了最終的MMR 根,這個根就可以連同數百萬區塊的計算證明一起發佈在鏈上(在一個證明聚合智能合約上)。由於產生的STARK 證明驗證成本極低,使得在鏈上驗證這些證明的成本變得合理。

我們就此實現了一種方法,可以追溯並存取以太坊自創世區塊起的所有狀態。

Herodotus 團隊將這些MMR 稱為「歷史區塊哈希累加器」,實現了Vitalik Buterin 與Tomasz Stanczak 於2020 年提出的EIP-2935 目標— 存取超過256 個區塊歷史資料的方法。這是一個三年多來一直懸而未決的問題!然而,Herodotus 和Starknet 在不更改任何協定層面的前提下實現了這一目標。

關於上述過程的一些關鍵點:

  • Herodotus 按每批約1350 個區塊處理,每批的證明都會發佈在鏈上。一旦完成了以太坊前1800 萬個區塊的整個處理流程,隨著新區塊不斷加入鏈歷史,區塊歷史的MMR 根可以定期更新。

Herodotus:如何利用Starknet儲存證明來證明以太坊狀態?

一旦在鏈上找到MMR根,就可以證明MMR中包含每個區塊哈希值(這是默克爾樹的基本屬性)。

在將證明發送到以太坊主網之前,Herodotus團隊的證明者使用StarkWare團隊創建的SHARP 系統。 SHARP系統的主要優勢在於它能夠降低成本並提高產生證明的效率。

上述工作流程正在複製到兩個獨立的MMR中,一個使用Keccak256雜湊函數,另一個則使用Poseidon。以太坊將使用Keccak256變體,而Starknet將使用Poseidon變體。

以太坊主網的MMR根透過原生的Starknet L1到L2訊息傳遞協定傳送到Starknet,以便在Starknet上使用。 Herodotus區塊雜湊值累加器也實現了在Starknet上存取以太坊歷史資料的功能。 Starknet L1到L2的訊息系統可用於以安全的方式將L1區塊雜湊值和經過驗證的MMR根轉送到Starknet。一旦發送到Starknet,就可以根據這些承諾來驗證以太坊歷史資料的儲存證明。

Herodotus區塊哈希值累加器帶來的新機會

Herodotus和StarkWare將區塊雜湊值累加器作為公共產品帶到以太坊。一旦最終的MMR根和計算證明發佈在以太坊主網上,任何開發者都可以利用它們來訪問自鏈創始以來任何時間點的可證明狀態。

由於以太坊的MMR根也將透過原生的跨鏈訊息協定傳送到Starknet,因此可以以簡單且無需信任的方式存取跨鏈狀態資訊。 DeFi協議可以透過利用特定時間點上某個帳戶的餘額資訊或帳戶的槓桿持倉訊息,從歷史狀態證明中獲益。使用更大歷史區塊雜湊值記錄來產生更穩健的隨機數成為可能。跨鏈投票也變得簡單,用戶在L2投票前,無需先將資產進行跨鏈轉移。除此之外,還會帶來更多其他的可能性。

結語

在區塊鏈的可擴展性、去中心化和可驗證性不斷發展的世界中,Starknet的團隊正在成為創新的燈塔。在Starknet上創建的專案正在成為擴展以太坊的關鍵元素。當我們深入這個新未來時,熟悉Starknet生態系統將為你未來的發展奠定基礎。