撰寫:LongHash Ventures
編譯:深潮TechFlow
如果你每小時都失去記憶,需要不停地問別人告訴你做過什麼事怎麼辦?這就是智能合約目前所處的狀態。在以太坊這樣的區塊鏈上,智慧合約無法直接存取超過256 個區塊以外的狀態。這個問題在多鏈生態系中更加嚴重,跨不同執行層檢索和驗證資料甚至更加困難。
2020 年,Vitalik Buterin 和Tomasz Stanczak 提出了一種跨時間存取資料的方法。雖然這項EIP 方案陷入了停滯,但它的需求在以Roll-up 為中心的多鏈世界中重新出現。如今,儲存證明已成為前沿領域,以賦予智能合約意識和記憶。
存取鏈上資料的方式
Dapp 可以透過多種方式存取資料和狀態。所有這些方法都需要應用程式對人類/實體、加密經濟安全性或程式碼進行一定程度的信任,並且都存在一定的權衡取捨:
信任人類/實體:
存檔節點:操作者可以自行運行存檔節點,或依賴Alchemy、Infura 等存檔節點服務供應商,存取從創世區塊開始的所有資料。它們提供與全節點相同的數據,還包括整個區塊鏈的所有歷史狀態數據。鏈下服務如Etherscan 和Dune Analytics 使用存檔節點存取鏈上資料。鏈下參與者可以證明這些數據的有效性,鏈上智能合約可以驗證數據是由可信任參與者/委員會簽署的。但是底層資料的完整性無法被驗證。這種方法需要Dapp 信任存檔節點服務提供者以正確的方式運作基礎設施,沒有任何惡意意圖。
信任加密經濟安全性:
- 索引器:索引協議組織區塊鏈上的所有數據,允許開發者建立和發布開放API,以便應用程式可以查詢。單一索引器是質押代幣以提供索引和查詢處理服務的節點操作者。但是,當提供的數據不正確時,可能會發生爭議,仲裁過程需要時間。此外,來自The Graph 等索引器的資料不能直接利用在智慧合約的業務邏輯中,而是用於基於web2 的資料分析背景。
- 預言機:預言機服務提供者使用從許多獨立節點操作者那裡匯總的資料。這裡的挑戰在於,從預言機獲得的數據可能不會被頻繁更新,範圍也有限。像Chainlink 這樣的預言機通常只維護特定狀態,例如價格訊息,對於應用程式特定狀態和歷史的資料則不可行。此外,這種方法也會在資料中引入一定程度的偏差,需要信任節點營運商。
信任代碼:
- 特殊變數和函數:像以太坊這樣的區塊鏈具有特殊變數和函數,主要用於提供關於區塊鏈的信息,或通用實用函數。智能合約只能存取最近256 個區塊的區塊哈希。出於可擴展性的原因,並非所有區塊的區塊哈希都是可用的。能夠存取歷史區塊哈希將非常有用,因為它可以允許針對它們進行證明的驗證。 EVM 執行環境中沒有可以存取舊區塊內容、先前交易內容或收據輸出的操作碼,所以節點可以安全地忘記這些內容,並且仍能處理新區塊。這種方法也僅限於單一區塊鏈。
鑑於這些解決方案的挑戰和局限性,顯然存在對鏈上儲存和提供區塊雜湊的明確需求。這就是儲存證明的用武之地。為了更好地理解儲存證明,我們快速看一下區塊鏈中的資料儲存。
區塊鏈中的資料存儲
區塊鏈是一個公共資料庫,在網路中的許多電腦之間更新和共享。數據和狀態以連續的區塊組存儲,每個區塊透過儲存前一個區塊頭的哈希來加密引用其父區塊。
以以太坊區塊為例。以太坊使用一種特殊的Merkle 樹,稱為「Merkle Patricia Tree」(MPT)。以太坊區塊頭包含四個不同的Merkle -Patricia 樹的根,即狀態樹、儲存樹、收據樹和交易樹。這四棵樹對包含所有以太坊資料的映射進行編碼。使用Merkle 樹是由於其在資料儲存中的高效性。透過遞歸哈希,最終只需要儲存根哈希,節省了大量空間。它們允許任何人透過證明遞歸哈希節點導致相同的根哈希,來證明樹中元素的存在。 Merkle 證明允許以太坊上的輕客戶端透過回答以下問題來獲得答案:
- 這個交易存在於某個特定區塊中嗎?
- 我的帳戶目前餘額是多少?
- 這個帳戶存在嗎?
與下載每個交易和每個區塊不同,「輕客戶端」只能下載區塊頭鏈,並使用Merkle 證明來驗證資訊。這使整個過程非常有效率。
請參閱Vitalik 和Maven11 的這篇部落格研究文章,以更好地理解與Merkle 樹相關的實現、優點和挑戰。
儲存證明
儲存證明允許我們使用加密證明來證明某件事被記錄在資料庫中且有效。如果我們能提供這樣的證明,那就是一個可驗證的聲明,證明某件事發生在區塊鏈上。
儲存證明可以實現什麼?
儲存證明允許兩個主要功能:
- 存取最後256 個區塊之外的歷史鏈上數據,一直回到創世塊
- 在一個區塊鏈上存取另一個區塊鏈的鏈上資料(歷史和當前),借助共識驗證或L2 橋接(針對L2)
儲存證明的工作原理是什麼?
簡單來說,儲存證明檢查特定區塊是否是區塊鏈的規範歷史的一部分,然後驗證所請求的特定資料是否是區塊的一部分。這可以透過以下方式實現:
- 鏈上處理:Dapp 可以取得初始可信任區塊,將區塊作為Calldata 傳遞以存取前一個區塊,一直遍歷回創世區塊。這需要大量的鏈上計算和大量的Calldata。由於需要海量的鏈上計算,這種方法完全不切實際。 Aragon 在2018 年嘗試使用鏈上方法,但由於高昂的鏈上成本而不可行。
- 使用零知識證明:方法類似於鏈上處理,不同之處在於使用零知識證明將複雜計算轉移到鏈下。
存取同一鏈的數據:可以使用零知識證明斷言任意歷史區塊頭是執行環境中可訪問的最近256 個區塊頭的祖先之一。另一種方法是索引源鏈的全部歷史並產生零知識證明以證明索引正確完成。該證明會隨源鏈的新區塊添加而定期更新。
- 存取跨鏈數據:提供者在目標鏈上收集源鏈的區塊頭,並使用零知識共識證明證明這些區塊頭的有效性。也可以使用現有的跨鏈訊息傳遞解決方案,如Axelar、Celer 或LayerZero 來查詢區塊頭。
- 在目標鏈上維護源鏈的區塊頭哈希緩存,或鏈下區塊哈希累加器的根哈希。這個快取定期更新,用於在鏈上高效證明給定的區塊存在且與可從狀態存取的最近的區塊哈希具有加密連結。這個過程稱為證明鏈的連續性。也可以使用專用區塊鏈來儲存所有源鏈的區塊頭。
- 根據Dapp 在目標鏈上的請求,從鏈下索引資料或鏈上快取(取決於請求的複雜性)存取歷史資料/區塊。快取的區塊頭哈希在鏈上維護,而實際資料可能儲存在鏈下。
- 透過Merkle 包含證明檢查指定區塊中是否存在數據,並為此產生零知識證明。該證明與正確索引的零知識證明或零知識共識證明相結合,並在鏈上提供以進行無需信任的驗證。
- 然後Dapp 可以在鏈上驗證該證明,並使用資料執行所需操作。除了驗證零知識證明,公共參數(如區塊號和區塊雜湊)也與在鏈上維護的區塊頭快取進行檢查。
採用此方法的項目有Herodotus、Lagrange、Axiom、HyperOracle、Brevis Network 和nil 基金會。儘管正為使應用程式跨多個區塊鏈具有狀態意識而做出重大努力,但IBC(鏈間通訊)作為一種互通性標準脫穎而出,支援應用程式使用如ICQ(跨鏈查詢)和ICA (跨鏈帳戶)。 ICQ 使Chain A 上的應用程式可以透過在簡單的IBC 資料包中包含查詢來查詢Chain B 的狀態,ICA 允許一個區塊鏈安全控制另一個區塊鏈上的帳戶。將它們組合在一起可以支援有趣的跨鏈用例。像Saga 這樣的RaaS 提供者會預設使用IBC 為所有應用鏈提供這些功能。
儲存證明可以透過多種方式進行最佳化,以在記憶體消耗、證明時間、驗證時間、運算效率和開發者體驗之間找到最佳平衡。整個過程可以大致分為3 個主要子過程:
- 資料存取;
- 數據處理;
- 資料存取和處理的零知識證明產生。
資料存取:在這個子過程中,服務提供者以原生方式在執行層存取來源鏈的區塊頭,或透過維護鏈上快取。對於跨鏈的資料訪問,需要在目標鏈上驗證源鏈共識。採用的方法和優化包括:
- 現有以太坊區塊鏈:可以使用以太坊區塊鏈的現有結構,利用零知識證明來證明相對於當前區塊頭的任意歷史儲存插槽的值。這可以視為一個大型包含證明。也就是說,給定最近的區塊頭X 在高度b,存在區塊頭Y 在高度bk 是X 的祖先。這基於以太坊共識的安全性,需要高效率的證明系統。這是Lagrange 採用的方法。
- 鏈上Merkle Mountain Ranges (MMR) 快取:Merkle Mountain Range 可以看作是Merkle 樹列表,當兩個樹達到相同大小時組合起來。 MMR 中的單一Merkle 樹透過將父節點新增至樹的先前根來組合。 MMR 與Merkle 樹類似,具有一些額外優點,例如有效地追加元素和高效的資料查詢,特別是從大型資料集讀取順序資料。透過Merkle 樹追加新頭需要在每個層級傳遞所有姐妹節點。為了有效地追加數據,Axiom 使用MMR 在鏈上維護區塊頭哈希的快取。 Herodotus 在鏈上儲存MMR 區塊哈希累加器的根哈希。這使他們能夠透過包含證明檢查所獲取的數據與這些區塊頭哈希。這種方法需要定期更新緩存,如果不去中心化會帶來活躍性問題。
- 為了優化效率和計算成本,Herodotus 維護兩種不同的MMR。根據特定的區塊鏈或層,累加器可以使用不同的雜湊函數進行客製化。對Starknet 進行證明時可能使用poseidon 哈希,但對EVM 鏈使用Keccack 哈希。
- 鏈下MMR 快取:Herodotus 維護鏈下快取之前所取得的查詢和結果,以便在再次要求資料時能更快取得。這需要比僅運行存檔節點更多的基礎架構。在鏈下基礎設施上的最佳化潛在地可以為終端用戶減少成本。
- 專用區塊鏈用於儲存:Brevis 依靠專用的零知識rollup(聚合層)來儲存其證明的所有鏈的所有區塊頭。如果沒有這個聚合層,每個鏈都需要儲存每個其他鏈的區塊頭,這將導致對於N 條區塊鏈有O(N2)「連接」。透過引入聚合層,每個區塊鏈只需要儲存rollup 的狀態根,將整體連線降低到O(N)。該層還用於聚合多個區塊頭/查詢結果證明,並在每個連接的區塊鏈上提交單一驗證證明。
- L1-L2 訊息傳遞:由於L2 支援透過L1 更新L2 合約的原生訊息傳遞,所以可以避免源鏈共識驗證。快取可以在以太坊上更新,L1-L2 訊息傳遞可以用於將鏈下編譯的區塊哈希或樹根發送到其他L2。 Herodotus 正在採用這種方法,但這對於alt L1 不可行。
數據處理:
除了存取數據,智能合約還應該能夠對數據進行任意計算。雖然有些用例可能不需要計算,但對許多其他用例來說,這是一個重要的增值服務。許多服務提供者支援以零知識證明的形式對資料進行計算,並在鏈上提供該證明以驗證其有效性。因為現有的跨鏈訊息傳遞解決方案如Axelar、LayerZero、Polyhedra Network 可能被用於資料訪問,因此資料處理可能會成為儲存證明服務提供者的差異化點。
例如,HyperOracle 允許開發者使用JavaScript 定義自訂的鏈下計算。 Brevis 設計了一個開放的零知識查詢引擎市場,接受來自Dapp 的資料查詢,並使用證明過的區塊頭進行處理。智能合約發送資料查詢,由市場上的證明者取得。證明者基於查詢輸入、相關的區塊頭(來自Brevis 聚合層)和結果產生證明。 Lagrange 引進了零知識大數據技術堆疊,用於證明分散式程式設計模型如SQL、MapReduce 和Spark/RDD。這些證明是模組化的,可以由來自現有跨鏈橋接和跨鏈訊息傳遞協議的任何區塊頭產生。 Lagrange 零知識大數據技術堆疊的第一個產品是零知識MapReduce,這是一個用於證明涉及大量多鏈資料計算結果的分散式運算引擎(基於著名的MapReduce 程式設計模型)。例如,單一零知識MapReduce 證明可以證明部署在4-5 條鏈上的DEX 在指定時間窗口內的流動性變化。對於相對簡單的查詢,計算也可以像Herodotus 目前所做的那樣直接在鏈上完成。
證明生成:
- 可更新證明:當需要對行動的區塊流計算和有效維護證明時,可以使用可更新證明。當新的區塊被創建時,為了維護合約變數(如代幣價格)的移動平均證明,可以有效更新現有證明,而不需要從頭重新計算新的證明。為了證明鏈上狀態的動態資料並行計算,Lagrange 在MPT 的一部分之上建立了一個批次向量承諾,稱為Recproof,即時更新它,並對其進行動態計算。透過在MPT 之上遞歸來建立Verkle 樹,Lagrange 能夠有效率地計算大量動態鏈上狀態資料。
- Verkle 樹:與Merkle 樹不同,Merkle 樹需要提供所有共享父節點的節點,Verkle 樹只需要根路徑。與Merkle 樹中的所有姐妹節點相比,這條路徑要小得多。以太坊也考慮在未來版本中使用Verkle 樹來最小化以太坊全節點需要持有的狀態量。 Brevis 利用Verkle 樹在聚合層儲存證明過的區塊頭和查詢結果。它大大減小了資料包含證明的大小,特別是當樹包含大量元素時,並支援高效包含證明批量資料。
- 記憶體池監控以加快證明產生:Herodotus 最近發布了turbo,允許開發者在智慧合約程式碼中添加幾行程式碼來指定資料查詢。 Herodotus 監控與turbo 合約互動的智能合約交易的記憶體池。當交易在記憶體池本身時,證明生成過程就開始了。一旦證明在鏈上生成和驗證,結果就被寫入鏈上turbo 交換合約。只有透過儲存證明進行身份驗證後,結果才能寫入turbo 交換合約。一旦發生這種情況,交易費用的一部分就與排序器或區塊生成者共享,激勵他們等待更長時間以收取費用。對於簡單的資料查詢,所請求的資料可能在用戶的交易被包含在區塊之前就已經在鏈上可用。
狀態/儲存證明的應用
狀態和儲存證明可以為應用程式層、中介軟體和基礎架構層的智慧合約解鎖許多新的用例。其中一些是:
應用層:
治理:
- 跨鏈投票:鏈上投票協議可以允許Chain B 上的用戶證明在Chain A 上擁有資產。用戶不需要橋接他們的資產才能在新的鏈上獲得投票權。例如:Herodotus 上的SnapshotX
- 治理代幣分發:應用程式可以向活躍用戶或早期採用者分發更多的治理代幣。例如:Lagrange 上的RetroPGF。
身分和聲譽:
- 所有權證明:使用者可以證明在鏈A 上擁有某個NFT、SBT 或資產,從而在鏈B 上執行某些操作。例如,遊戲應用鏈可以決定在其他具有現有流動性的鏈上像以太坊或任何L2 啟動其NFT 收藏。這將允許遊戲利用其他地方存在的流動性,而實際上不需要跨鏈NFT。
- 使用證明:用戶可以根據其在平台上的歷史使用情況(證明用戶在Uniswap 上交易了X 量)獲得折扣或高級功能。
- OG 證明:使用者可以證明他/她擁有一個活躍帳戶,該帳戶的天數超過X 天。
- 鏈上信用評分:一個跨鏈信用評分平台可以匯總單一使用者的多個帳戶的資料以產生信用評分。
上述所有證明都可以用於向用戶提供客製化體驗。 Dapp 可以提供折扣或特權來保留有經驗的交易員或用戶,並為新手用戶提供簡化的用戶體驗。
Defi:
- 跨鏈借貸:用戶可以在鏈A 上鎖定資產,而在鏈B 上獲得貸款,而不需要橋接代幣。
- 鏈上保險:可以透過存取歷史鏈上資料來確定故障,保險賠償可以完全在鏈上完成。
- 資產在池中的時間加權平均價格:應用可以計算並取得資產在指定時間內AMM 池中的平均價格。例如:Axiom 上的Uniswap TWAP 預言機。
- 選擇權定價:鏈上選擇權協議可以使用資產在去中心化交易所過去n 個區塊上的波動性來對選擇權進行定價。
最後兩個用例將需要在源鏈中添加新區塊時更新證明。
中介軟體:
- 意圖:儲存證明將允許用戶對意圖更具表現力和明確性。雖然求解器的工作是執行必要的步驟以滿足使用者的意圖,但使用者可以根據鏈上資料和參數更清楚地指定條件。求解器還可以證明找到最佳解決方案所利用的鏈上資料的有效性。
- 帳戶抽象:使用者可以利用儲存證明根據來自其他鏈的資料設定規則。例如:每個錢包都有一個nonce。我們可以證明一年前nonce 是一個特定的數字,目前nonce 與之相同。這可以用來證明這個錢包根本沒有被使用過,然後可以將錢包的存取權委託給另一個錢包。
- 鏈上自動化:智慧合約可以根據依賴鏈上資料的預定義條件自動執行某些操作。自動化程序需要定期調用智能合約以維持AMM 的最佳價格流動或透過避免不良債務來維持借貸協議的健康。 HyperOracle 支援自動化以及鏈上資料存取。
基礎設施
- 無需信任的鏈上預言機:去中心化的預言機網絡匯總來自預言機網絡內多個單獨預言機節點的回應。預言機網路可以消除這種冗餘,利用加密安全性實現鏈上資料。預言機網路可以將來自多個鏈(L1、L2 和alt L1)的資料匯集到單一鏈上,並簡單地使用儲存證明證明其他地方的存在。取得重大進展的DeFi 解決方案也可以使用客製化解決方案。例如,最大的流動性質押提供者Lido Finance 已經與Nil Foundation 合作,資助zkOracle 的開發。這些解決方案將實現對EVM 歷史數據的無需信任的數據訪問,並保護Lido Finance150 億美元的已抵押以太坊流動性。
- 跨鏈訊息傳遞協定:現有的跨鏈訊息傳遞解決方案可以透過與儲存證明服務提供者合作來增加其訊息的表達能力。這是Lagrange 在其模組化論文中建議的方法。
結論
意識讓科技公司能夠更好地為客戶服務。從使用者身分到購買行為再到社交關係,科技公司利用認知來解鎖精準定位、客戶細分和病毒行銷等功能。傳統的科技公司需要用戶的明確許可,在管理用戶資料時必須謹慎行事。但是,許可區塊鏈上的所有用戶資料都是公開的,不一定會洩露用戶身份。智能合約應該能夠利用公開可用的數據來更好地為用戶服務。更專業生態系統的發展和採用,將使跨時間和跨鏈的狀態意識成為越來越重要的議題。儲存證明可以使以太坊作為身分和資產所有權層出現,而不僅僅是一個結算層。用戶可以在以太坊上維護自己的身份和關鍵資產,這可以在多個區塊鏈中使用,而不需要始終橋接資產。我們對未來會解鎖的新可能性和用例保持興奮。