作者:MirandaChrist(哥倫比亞大學計算機科學專業博士生/a16z加密研究實習生)、JosephBonneau(a16zcrypto)來源:a16z crypto;編譯:Yvonne,MarsBit
隨着區塊鏈支持更多用戶和更頻繁的交易,驗證器爲驗證交易而存儲的信息量(“狀態”)也在增長。例如,在比特幣中,狀態由一組未使用的交易輸出(utxo)組成。在以太坊中,狀態由每個账戶的账戶余額以及每個智能合約的代碼和存儲組成。
對於擁有足夠账戶或 UTXO 來支持大部分人真正日常交易的區塊鏈來說,這種存儲負擔將變得難以處理,從而使其難以成爲驗證者並對去中心化構成威脅。人們很容易將密碼學作爲一種解決方案,像默克爾樹和零知識證明這樣的工具已經幫助我們實現了以前難以置信的目標。
這正是“無狀態區塊鏈”的目標。但是,盡管在這方面做出了大量的工作,它們仍然遠未實用。但事實證明,這種進展上的滯後是固有的——這些結構與實用性之間的差距永遠無法彌合。我們最近的工作表明,如果沒有額外的措施來管理狀態,任何無狀態的區塊鏈方案,無論多么智能,都是不可行的。正如我們在這篇文章的末尾所展示的那樣,這種不可能的結果不應該令人沮喪。
無狀態的狀態
如今,狀態規模雖龐大但可控。例如,比特幣節點存儲大約7GB的數據,以太坊節點存儲大約650GB的數據。但是,全節點的存儲負擔與鏈的吞吐量(每秒交易數或TPS)大致呈线性增長,而目前的吞吐量低得令人無法接受。根據當前的設計,真正支持日常交易(數十萬到數百萬TPS)所需的狀態將變得難以處理,需要使用幾TB甚至PB的存儲空間。
這促使人們尋找技術方法來大幅減少驗證者所需的狀態量——無狀態的區塊鏈,它將要求驗證者僅存儲一個恆定大小的狀態,而不管交易吞吐量如何。(實際上,這個術語是一個誤稱:仍然存在狀態,只是足夠小以適應任何未來的吞吐量——通常是恆定大小的。)這種輕量級的存儲要求將使得運行驗證者節點更加容易;樂觀地講,每個人都可以在他們的手機上運行一個節點。由於增加驗證者的數量將增加鏈的安全性,降低驗證者的准入門檻非常重要。
盡管對無狀態區塊鏈進行了大量研究(例如Todd, Buterin, Boneh等人,Srinivasan等人),但它們遠非實用,據我們所知,沒有一個被部署。所有已知的無狀態區塊鏈的根本問題是,它們要求用戶存儲稱爲證人的額外數據,以幫助驗證者驗證涉及其账戶的交易。例如,這個見證可能是一個Merkle包含證明,表明用戶的帳戶及其余額包含在全局狀態承諾中。當用戶進行交易時,他們將此見證提交給驗證者,表明他們的帳戶有足夠的余額。
與存儲永遠不需要更改的私鑰不同,這些見證經常更改,即使對於不積極進行交易的用戶也是如此,這給用戶帶來了不切實際的負擔。類似地,想象一下,如果你必須持續監視全球範圍內的所有其他信用卡交易,並相應地更新一些本地數據才能使用你自己的信用卡。爲了使區塊鏈實用,用戶必須能夠保持離线狀態,只有在提交交易時才能與區塊鏈交互。在許多情況下,比如硬件錢包,更新見證不僅不方便,而且不可能。
這就引出了一個自然的研究問題:我們能否構建一個不需要更新見證(或者很少需要更新見證)的無狀態區塊鏈?爲回答這一問題,我們开發了一個新的理論框架(可撤銷的證明系統),它概括了無狀態區塊鏈。使用這一框架,我們證明了一個結論性的不可能結果:簡潔的全局狀態和頻繁的見證更新之間的權衡是根本性的。我們的證明技術是信息論的,這意味着未來的計算機不會強大到足以解決這個問題:無狀態區塊鏈結構和實用性之間的差距將永遠無法彌合。
研究背景
爲幫助建立對不可能結果的直覺,我們將首先使用Merkle樹描述無狀態區塊鏈的自然但低效的構造。我們的目標是讓驗證器確定用戶提交的交易是否有效——例如,用戶是否有足夠大的账戶余額來進行交易。在無狀態區塊鏈方案中,驗證器存儲恆定大小的狀態。當用戶進行交易時,他們必須在交易中包含一個見證。驗證器可以使用當前狀態和用戶提交的(交易、見證)對來驗證該用戶是否有足夠的账戶余額來進行交易。
我們首先構建一個Merkle 樹,其中每個(账戶 ID,余額)對(a,b)都作爲葉子包含在內。驗證器存儲的恆定大小的狀態V是該樹的根,它充當對帳戶余額對集的承諾。每個用戶都維護其(账戶 ID、余額)對的 Merkle 包含證明作爲其見證人。葉子 ( a , b ) 的 Merkle 包含證明由沿着其到樹根的路徑上的夥伴節點 ( v 1 , …, v k ) 組成。給定用戶使用帳戶a進行的交易並聲明余額b,驗證器可以檢查b通過檢查 ( a , b )的證明 ( v 1 , …, v k )與其當前狀態V ,確實是帳戶a的余額。如果是這樣,驗證器將執行交易並必須相應地更新帳戶余額。Merkle 樹的一個便利屬性是,給定葉子的 Merkle 包含證明,當該葉子發生更改時,很容易計算生成的根。換句話說,驗證者可以輕松計算更新後的狀態V' ,該狀態V'在交易執行後捕獲帳戶 a 的新余額。
默克爾樹方案有兩個主要缺點。首先,用戶的見證數量相對較大,在系統中账戶總數中呈對數增長。理想情況下,它們應該是恆定大小的,我們可以使用RSA累加器(Boneh等人在無狀態區塊鏈的背景下研究)等方案來實現。
第二個缺點更難以避免:每當其他用戶進行交易時,帳戶-余額對的證明就會更改。回想一下,葉子的證明由從該葉子到樹的根的路徑上的夥伴節點(partner nodes)組成。如果任何其他葉子發生變化,這些節點中的一個就會發生變化,從而在實踐中出現問題。大多數區塊鏈用戶希望被動地將他們的代幣保存在錢包中,只有當他們想要進行交易時才登入。然而,在這種無狀態區塊鏈的實踐中,用戶必須不斷監控其他人的交易,以使他們的見證保持最新狀態。(雖然第三方可以代表用戶進行這種監控,但這偏離了標准的無狀態區塊鏈模型。我們將在本文的最後討論這個問題。)實際上,這對於無狀態區塊鏈來說是一個不可逾越的挑战,給用戶帶來了沉重的負擔。
我們的結論:無狀態是不可能的
這種現象並不是Merkle樹結構所特有的——所有已知的無狀態區塊鏈方案都要求用戶頻繁更新他們的見證。我們在本文中說明了這一點。更准確地說,我們表明,必須更新其見證的用戶數量與所有用戶進行的交易總數大致呈线性增長。
這意味着,即使用戶Alice沒有進行任何交易,她的見證也可能需要隨着其他用戶的交易而更改。只要驗證器存儲的簡潔狀態太小而無法捕獲完整狀態(即所有帳戶余額的集合),那么增加簡潔狀態的大小就沒有什么幫助。我們按照下面的定理繪制了這種關系,以及不同吞吐量的區塊鏈每天所需的見證人更改數量。這些圖顯示了見證人需要更改以獲得最佳無狀態區塊鏈的次數。這裏,數據域指的是帳戶(在帳戶模型中)或UTXO(在UTXO模型中)的總數。
我們證明的核心是信息論論證。Claude Shannon提出的信息理論的一個核心原則是,如果Alice從一個大小爲2n的集合中隨機選擇了一個對象,並希望告訴Bob她選擇了哪個對象,她必須向他發送至少n位。如果存在一個無狀態的區塊鏈方案,用戶很少更新他們的見證,那么Alice可以用少於n比特的時間告訴Bob她選擇了哪個對象——Shannon證明這是不可能的。因此,這種無狀態區塊鏈是不可能存在的。
爲了簡單起見,我們將在這裏描述一個稍弱的陳述的證明:不可能存在用戶永遠不需要更新其見證的無狀態區塊鏈。關鍵思想是Alice使用無狀態區塊鏈方案將她的消息編碼給Bob。最初,Alice 和 Bob 都知道所有n 個用戶的完整帳戶余額對。假設每個账戶至少有一枚幣。Alice 和 Bob 也都知道無狀態區塊鏈的簡潔狀態V和所有账戶余額對( a i , b i )的見證人 w i。Alice 和 Bob 還就消息和帳戶集之間的映射達成了一致。Alice會選擇與她的消息對應的一組A账戶,然後她會從這些账戶中花費代幣。她將使用無狀態區塊鏈與Bob溝通她選擇的集合,而他可以從該集合中了解她的消息是什么。
編碼: Alice 從A的每個账戶中花費一枚代幣。使用無狀態區塊鏈方案,Alice 計算更新後的狀態V'並將V'發送給 Bob。
解碼:對於每個i, Bob 檢查是否Verify( w i , ( a i , b i )) 。Bob 輸出账戶集合B,使得Verify( w i , ( a i , b i )) = false。
Bob成功地輸出了與Alice選擇的相同集合:B = A。首先,觀察到如果Alice從帳戶a i中花費了一枚代幣,則不應再接受其舊余額的見證 - 否則,Alice將能夠加倍花費。因此,對於A中的每個账戶a i,Verify( w i , ( a i , b i )) = false,並且 Bob 會將該账戶包含在B中。另一方面,Bob 絕不會在B中包含Alice 所識別的账戶。沒有_花一枚代幣,因爲這些账戶的余額保持不變,並且(回想一下我們要證明的寬松聲明)他們的見證人永遠不會改變。因此,B完全等於A。
最後,通過計算Alice應該發送給Bob的比特數來解決矛盾。她可以選擇的账戶子集有2 n 種可能,根據Shannon定律,她至少應該發送n比特給Bob。然而,她只發送了常量大小的狀態V',遠遠比n比特要短。
(熟悉密碼學的讀者可能會注意到,我們在這裏掩蓋了一些細節;例如,Bob的解碼失敗的概率可以忽略不計。我們的論文包括完整的證明。)
雖然我們用無狀態區塊鏈描述了我們的證明,但Alice和Bob可以使用各種其他經過身份驗證的數據結構(例如累加器、向量承諾)執行類似的過於高效的通信。我們使用一種新的抽象來形式化這類數據結構,我們稱之爲可撤銷證明系統。
結果帶來的影響
我們的結果表明,你不能“加密狀態”——沒有靈丹妙藥式的方案允許我們構建一個用戶永遠不必更新他們的見證的無狀態區塊鏈。狀態並沒有消失,而是從驗證器轉移到用戶身上,以頻繁更新見證的形式推送給用戶。
確實存在一些潛在的解決方案,但這些解決方案脫離了嚴格的無狀態區塊鏈模型。該模型允許第三方(既不是用戶也不是驗證者)負責存儲完整的狀態。這一方被稱爲證明服務節點(由Srinivasan等人進行了最嚴格的檢查),它使用完整狀態來代表用戶生成最新的見證。然後,用戶可以使用這些見證進行交易,就像在常規的無狀態區塊鏈中一樣,其中驗證器仍然只存儲一個簡潔的狀態。該系統的激勵機制,特別是用戶如何補償證明服務節點,是一個有趣的开放研究方向。
雖然到目前爲止我們的討論主要集中在L1區塊鏈上,但我們的結果也會對L2系統(如rollup服務器)產生影響。rollup(無論是optimistic的還是ZK的)通常採用一個大的狀態並使用存儲在 L1 上的一個小值來提交它。此狀態包括L2上每個用戶的帳戶。我們希望這些用戶能夠通過發布其當前账戶余額的見證來直接在 L1 上提取資金(無需 L2 服務器的配合)。此設置也是我們模型中可撤銷證明系統的一個實例。事實上,有人可能會說無狀態區塊鏈已經以 L2 rollup的形式在實踐中得到了實施。
不幸的是,這意味着我們的不可能性結果直接適用。用戶的rollup取款見證必須經常更改,否則幾乎整個L2狀態都必須寫入L1。因此,今天的集合通常假設有一個數據可用性委員會(有時稱爲“有效性委員會”),其功能類似於“證明服務節點”,在用戶准備退出時幫助他們計算新的見證。我們的研究結果表明,以太坊文檔中對用戶的警告——“如果無法訪問交易數據,用戶無法計算證明資金所有權和執行提款所需的默克爾證明。”——將永遠適用。
隨着區塊鏈系統的發展,开發更有效的方法來管理區塊鏈狀態將變得更加重要。盡管我們排除無狀態區塊鏈的結果似乎是消極的,但不可能的結果對區塊鏈設計者來說是有用的,因爲它們告訴我們將研究重點放在其他地方,理想情況下可以幫助我們更快地找到可行的解決方案。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。