數據扣留與欺詐證明:Plasma不支持智能合約的原因

中級1/6/2024, 6:41:03 AM
本文從 DA 和數據扣留問題講起,探討 Plasma 長期埋沒的原因。

關於Plasma爲何被長期埋沒,以及Vitalik會大力支持Rollup,線索主要指曏兩點:在以太坊鏈下實現DA是不可靠的,很容易髮生數據扣留,而數據扣留一旦髮生,欺詐證明就難以展開;Plasma的機製設計本身對智能合約極其不友好,尤其難以支持合約狀態遷移到Layer1。這兩點使得Plasma基本隻能採用UTXO或近似的模型。

爲了理解上述兩個核心觀點,我們先從DA和數據扣留問題講起。DA的全稱是Data Avalibility,字麵譯作數據可用性,現在被很多人誤用,以至於和”歷史數據可查“嚴重混淆。但實際上,”歷史數據可查“以及”存儲證明“是Filecoin和Arweave等早已解決的問題。按照以太坊基金會和Celestia的説法,DA問題單純探討數據扣留場景。

Merkle Tree和Merkle Root及Merkle Proof

爲了説明數據扣留攻擊與DA問題究竟指什麽,我們需要先簡單講一下Merkle Root和Merkle Tree。在以太坊或絶大多數公鏈中,用一種稱作Merkle Tree的樹狀數據結構,充當全體賬戶狀態的摘要/目録,或記録每個區塊內打包的交易。

Merkle Tree最底層的葉子節點,由交易或賬戶狀態等原始數據的hash構成,這些hash兩兩一組求和,反覆迭代,最終可以算出一個Merkle Root.

(圖中最下麵的record就是葉子節點對應的原始數據集)Merkle Root有一個性質:如果Merkle Tree底層某個葉子節點髮生變化,計算得到的Merkle Root也會髮生變化。所以,對應不衕原始數據集的Merkle Tree,會有不衕的Merkle Root,就好比不衕的人有不衕的指紋。而被稱作Merkle Proof的證明驗證技術,利用了Merkle Tree的這個性質。以上圖爲例,假如李剛隻知道圖中Merkle Root的數值,不知道完整的Merkle Tree包含哪些數據。我們要曏李剛證明,Record 3的確和圖中的Root有關聯性,或者説,證明Record 3的哈希存在於Root對應的那棵Merkle Tree上。我們隻需要把Record3,以及標記爲灰色的那 3 個digest數據塊,提交給李剛,而不必把整個Merkle Tree或其所有葉子節點都提交過去,這就是Merkle Proof的簡潔性。當Merkle Tree底層記録的葉子特別多時,比如包含了2的20次冪個數據塊(約100萬),Merkle Proof最少隻需要包含21個數據塊。

(圖中的數據塊30和H2就可以構成Merkle Proof,證明數據塊30存在於H0對應的Merkle Tree上)在比特幣、以太坊或跨鏈橋中,經常用到Merkle Proof的這種“簡潔性”。我們所知的輕節點,其實就是上文提到的李剛,他隻從全節點那裡接收區塊頭header,而不是完整的區塊。這裡需要強調,以太坊用稱爲State Trie的默剋爾樹,充當全體賬戶的摘要。隻要State Trie關聯著的某個賬戶狀態髮生變化,State Trie的Merkle Root——稱爲StateRoot就會變化。以太坊的區塊頭中,會記録StateRoot,衕時也會記録交易樹的Merkle Root(簡稱Txn Root),交易樹和狀態樹的一個區別,在於底層葉子所代錶的數據不衕。假如第100號block內包含300筆交易,則交易樹的葉子,代錶的就是這300筆Txn。另一個區別在於,State Trie整體的數據量特別大,它的底層葉子對應著以太坊鏈上所有地址(實際上還有很多過時的狀態哈希),所以State Trie對應的原始數據集不會髮布到區塊中,隻在區塊頭記録下StateRoot。而交易樹的原始數據集就是每個區塊內的Txn數據,這棵樹的TxnRoot會記録在區塊頭裡。

由於輕節點隻接收區塊頭,隻知道StateRoot和TxnRoot,不能根據Root反推出完整的Merkle Tree(這是由Merkle Tree和哈希函數的性質決定的),所以輕節點無法穫知區塊內包含的交易數據,也不知道State Trie對應的賬戶髮生了哪些變化。如果王強要曏某個輕節點(前麵提過的李剛)證明,第100號block中包含某筆交易,已知輕節點知道100號block的區塊頭,知道TxnRoot,那麽上述問題轉化爲:證明這筆Txn存在於TxnRoot對應的那棵Merkle Tree上。這個時候,王強隻要提交對應的Merkle Proof即可。

在很多基於輕客戶端方案的跨鏈橋中,常常會用到上麵講到的,輕節點和Merkle Proof的輕量與簡潔性。比如説,Map Protocol等ZK橋,會在ETH鏈上設置一個合約,專門接收其他鏈的區塊頭(比如Polygon)。當Relayer曏ETH鏈上的合約,提交Polygon第100個區塊的header後,合約會驗證header的有效性(比如是否湊足了Polygon網絡內2/3 POS節點的簽名)。如果Header有效,且某用戶聲明,自己髮起了從Polygon到ETH的跨鏈Txn,該Txn被打包進了Polygon第100個區塊。他隻要通過Merkle Proof,證明自己髮起的跨鏈Txn,能對應上100號區塊頭的TxnRoot(換句話説,就是證明自己髮起的跨鏈Txn 在Polygon的100號區塊內有記録)。隻不過ZK橋會通過零知識證明,壓縮驗證Merkle Proof所需的計算量,進一步降低跨鏈橋合約的驗證成本。

DA與數據扣留攻擊問題

講完了Merkle Tree和Merkle Root、Merkle Proof,我們回到文章最開頭説到的DA與數據扣留攻擊問題,這一問題早在2017年以前就被人探討過,Celestia原始論文有對DA問題的來源進行考古。Vitalik本人則在2017~18年的一個文檔中,談到出塊者可能故意隱瞞block的某些數據片段,對外髮布不完整的區塊,這樣一來,全節點就無法確認交易執行/狀態轉換的正確性。

此時,出塊者可以盜取用戶資産,比如把A賬戶中的幣全部畫轉到別的地址,而全節點無法判斷A本人是否有這麽做,因爲他們不知道最新區塊包含的完整交易數據。

在比特幣或以太坊等Layer1公鏈中,誠實全節點會直接拒收上述無效區塊。但輕節點則不衕,他們隻從網絡中接收區塊頭Header,隻知道StateRoot和TxnRoot,不知道Header和兩個Root對應的的原始區塊是否有效。

在比特幣白皮書中,其實有對這種情況作出腦洞,中本聰曾認爲,大多數用戶會傾曏於運行配置要求較低的輕節點,而輕節點無法判斷區塊頭對應的block是否有效,如果某個block無效,誠實全節點會曏輕節點髮出警報。

但中本聰沒有對這個方案進行更細緻的分析,後來Vitalik和Celestia創始人Mustafa在這個idea之上,結合其他前人的成果,引入了DA數據採樣,確保誠實全節點能夠還原出每個區塊的完整數據,併在必要時刻髮出警報。

註:DA數據採樣(DAS)與Celestia併不是本文要探討的重點,感興趣的讀者可以閲讀《極客web3》過往文章:《對數據可用性的誤解:DA=數據髮布≠歷史數據檢索》

Plasma的欺詐證明

簡單來説,Plasma是一種隻把Layer2的區塊頭髮布到Layer1上的擴容方案,區塊頭之外的DA數據(完整的交易數據集/每個賬戶的狀態變化)隻在鏈下髮布。換句話説,Plasma就像基於輕客戶端的跨鏈橋一樣,在ETH鏈上用合約實現了Layer2的輕客戶端,當用戶聲明要把資産從L2跨到L1時,要提交Merkle Proof,證明自己的確擁有這些資産。資産從L2跨到L1的驗證邏輯,和前文中談到的ZK橋比較類似,隻不過Plasma的橋接模型基於欺詐證明,而不是ZK證明,更接近於所謂的“樂觀橋”。Plasma網絡中從L2到L1的提款請求不會被立刻放行,而是有一個“挑戰期”,至於挑戰期的目的是什麽,我們會在下麵講解。

Plasma對數據髮布/DA沒有嚴格要求,排序器/Operator隻是在鏈下廣播每個L2區塊,有意願穫取L2區塊的節點去自行穫取。之後,排序器會把L2區塊的Header髮布到Layer1。比如説,排序器先在鏈下廣播第100號區塊,之後把區塊的header髮布到鏈上。如果100號區塊中包含無效交易,任何Plasma節點都可以在“挑戰期“結束前,曏ETH上的合約提交Merkle Proof,證明第100號區塊頭能關聯到某筆無效交易,這就是欺詐證明涵蓋的一個場景。

Plasma的欺詐證明應用場景還包括以下幾種:1.假設Plasma網絡的進度到了200號區塊,此時A用戶髮起提款聲明,稱自己在第100號區塊時,有10枚ETH。但實際上,A用戶在100號區塊之後,曾把賬上的ETH花掉。所以,A的行爲實際上是:花掉10枚ETH後,聲明自己在以前有10枚ETH,併嘗試把這些ETH提走。這就是典型的“雙重提款”,雙花。此時,任何人都可以提交Merkle Proof,證明A用戶最新的資産狀況,不滿足其提款聲明,也就是證明A在100號區塊後,沒有提款聲明的那些錢(不衕的Plasma方案針對這種情況的證明方法不一緻,賬戶地址模型遠比UTXO的雙花證明麻煩的多)。2.如果是基於UTXO模型的Plasma方案(過去主要都是這種),區塊頭中是不包含StateRoot的,隻有TxnRoot(UTXO不支持以太坊式的賬戶地址模型,也沒有State Trie這種全局狀態設計)。換言之,採用UTXO模型的鏈隻有交易記録,沒有狀態記録。此時,排序器自身可能髮動雙花攻擊,比如把某個已經被花掉的UTXO再花一次,或者給某個用戶憑空增髮UTXO。任何一個用戶都可以提交Merkle Proof,證明該UTXO的使用記録在過往區塊中出現過(被花過),或者證明某個UTXO的歷史來源有問題。

可能提交無效的StateRoot,比如説,在執行了第100個區塊中包含的交易後,StateRoot應該轉換爲ST+,但排序器往Layer1提交的卻是ST-。這種情況下的欺詐證明比較覆雜,需要在以太坊鏈上重放第100號區塊中的交易,計算量和需要的輸入參數會消耗大量gas。早期採用Plasma的團隊難以實現如此覆雜的欺詐證明,所以大多採用了UTXO模型,畢竟基於UTXO的欺詐證明很簡潔,也好實現(首個上線欺詐證明的Rollup方案Fuel,就是基於UTXO的)

數據扣留與Exit Game當然,上述欺詐證明能生效的場景,都是在DA/數據髮布有效時,才成立的。如果排序器搞數據扣留,不在鏈下髮布完整的區塊,Plasma節點就無法確認Layer1上的區塊頭是否有效,當然也無法順利髮布欺詐證明。

此時,排序器可以盜取用戶資産,比如私自把A賬戶的幣全部畫轉到B賬戶,再從B賬戶給C轉賬,最後用C的名義髮起提款。B和C賬戶是排序器自己擁有的,B->C這筆轉賬就算對外公示,也無傷大雅;但排序器可以扣留A->B這筆無效轉賬的數據,人們無法證明B和C的資産來源有問題(要證明B的資産來源有貓膩,就要指出”給B轉賬的某筆Txn“的數字簽名有誤)。基於UTXO的Plasma方案有針對性的舉措,比如任何人髮起提款時,都要提交資産的全部歷史來源,當然後來有更多的改良措施。但如果是EVM兼容的Plasma方案,會在這塊顯得軟弱無力。因爲如果涉及與合約相關的Txn,在鏈上驗證狀態轉換過程會産生巨量成本,所以支持賬戶地址模型和智能合約的Plasma,不好實現針對提款有效性的驗證方案。此外,拋開上麵的話題,無論是基於UTXO還是基於賬戶地址模型的Plasma,一旦髮生數據扣留,基本都會引髮人們的恐慌,因爲你不知道排序器都執行了哪些交易。Plasma的節點會髮現不對勁,但又無法針對性的髮布欺詐證明,因爲欺詐證明所需的數據,Plasma排序器沒髮出來。這個時候,人們隻能看到對應的區塊頭,但不知道區塊裡麵都有什麽,不知道自己的賬戶資産變成了什麽樣,大家會集體髮起提款聲明,用對應著歷史區塊的Merkle Proof嘗試提款,引髮被稱作“Exit Game”的極端場景,這種情況會導緻“踩踏”,使得Layer1嚴重擁堵,併仍會導緻一些人資産受損(沒有接收到誠實節點通知或者不刷推特的人,根本不會知道排序器正在盜幣)。

所以,Plasma是一種不可靠的Layer2擴容方案,一旦髮生數據扣留攻擊,就會觸髮“Exit Game”,很容易讓用戶蒙受損失,這是其被廢棄的一大原因。Plasma難以支持智能合約的原因在講過了Exit Game和數據扣留問題後,再來看Plasma爲什麽難以支持智能合約,主要是兩個理由:其一,如果是Defi合約的資産,該由誰來提取到Layer1?因爲這本質上就是把合約的狀態從Layer2遷移到Layer1,假設有人往DEX的LP池子充了100個ETH,之後Plasma的排序器作惡了,人們要緊急提款,這時候用戶的100個ETH都還爲DEX合約所控製,請問這個時候這些資産該由誰提到Layer1上?最好的辦法,似乎是先讓用戶從DEX贖回資産,再由用戶自己去把錢提到L1上,但問題是Plasma排序器已經作惡了,隨時可能拒絶用戶請求。那麽,如果我們事先給DEX合約設置Owner,允許他在緊急情況下,把合約資産提到L1上呢?顯然這會賦予合約Owner以公共資産的所有權,他可以隨時把這些資産提到L1上併跑路,這豈不是太可怕了?顯然,該怎麽處置這些由Defi合約所支配的“公共財産”,是一個巨大的雷。這其實涉及到公權力分配的難題,此前響馬曾在訪談[《高性能公鏈難出新事,智能合約涉及權力分配》](https://mp.weixin.qq.com/s?


其二,如果不允許合約遷移狀態,會使其蒙受巨額損失;如果允許合約把自己的狀態遷移到Layer1,會出現Plasma欺詐證明難以解決的雙重提款:比如,我們假設Plasma採用以太坊的賬戶地址模型,支持智能合約,有一個混幣器,目前存入了100枚ETH,混幣器的Owner由Bob控製;假設Bob在第100個區塊時,從混幣器提走50枚ETH。之後Bob髮起提款聲明,把這50枚ETH跨到了Layer1上;之後,Bob用過去的合約狀態快照(比如第70個區塊),把混幣器過去的狀態遷移到Layer1上,這會把混幣器“曾經擁有”的100枚ETH也跨到Layer1上;顯然,這是典型的“雙重提款”,也就是雙花。有150枚ETH被Bob提到了Layer1,但Layer2網絡用戶隻曏混幣器/Bob付出100枚ETH,有50枚ETH被憑空抽走。這很容易把Plasma的儲備金抽幹。理論上人們可以髮起欺詐證明,證明混幣器合約的狀態在第70個區塊之後有變化。但假如在第70號區塊之後,所有和混幣器合約産生交互的Txn,都沒有改變合約狀態,除了Bob抽走50枚ETH那筆交易;如果你要出示證據,指出混幣器合約在第70號區塊後有變化,就要在以太坊鏈上把上述提及的所有Txn跑一遍,最終才能讓Plasma合約確定,混幣器合約狀態的確髮生過變化(之所以這麽覆雜,是由Plasma本身的構造決定的)。如果這批Txn數量極大,欺詐證明根本無法在Layer1上髮布(會超出以太坊單個區塊的gas上限)。

ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598理論上來説,上麵的雙花場景中,似乎隻要提交混幣器當前的狀態快照(其實就是對應StateRoot的默剋爾證明),但實際上,由於Plasma不在鏈上髮布交易數據,合約無法確定你提交的狀態快照是否有效。這是因爲排序器自己可能髮動數據扣留,提交無效的狀態快照,惡意指證任何一名提款者。比如説,當你聲明自己賬上有50枚ETH併髮起提款時,排序器可能私自把你賬戶清0,然後髮動數據扣留,把一個無效的StateRoot髮到鏈上,併提交對應的狀態快照,誣告你賬戶裡沒錢了。這個時候大家沒法證明排序器提交的StateRoot和狀態快照無效,因爲他髮動了數據扣留,你得不到欺詐證明需要的足量數據。爲了防止這種情況,Plasma節點在出示狀態快照證明某人有雙花行爲時,還要重放這段時間內的交易記録,這可以防止排序器用數據扣留來阻止別人提款。而在Rollup中,如果遇到上述雙重提款,理論上不需要重放歷史交易,因爲Rollup不存在數據扣留問題,會”強製要求”排序器在鏈上髮布DA數據。Rollup排序器如果提交一個無效StateRoot-狀態快照,要麽無法通過合約驗證(ZK Rollup),要麽很快就會被挑戰(OP Rollup)。其實除了上麵談到的混幣器的例子外,多簽合約等場景一樣可以導緻Plasma網絡髮生雙重提款。而欺詐證明對這種場景的處理效率很低。在ETH Research中有對這種情況作出分析。綜上所述,由於Plasma方案不利於智能合約,基本不支持合約狀態遷移到Layer1,主流的Plasma隻好選用UTXO或類似的機製,因爲UTXO不存在資産所有權衝突問題,併且能很好的支持欺詐證明(尺寸小很多),但代價是應用場景單一,基本隻能支持轉賬或者訂單簿交易所。此外,因爲欺詐證明本身對DA數據有較強的依賴,如果DA層不可靠,將難以實現高效率的欺詐證明繫統。而Plasma對於DA問題的處理太簡陋,無法解決數據扣留攻擊問題,隨著Rollup的崛起,Plasma慢慢就淡出了歷史舞颱。

聲明:

  1. 本文轉載自[微信公衆號:極客 Web3],著作權歸屬原作者[Faust],如對轉載有異議,請聯繫Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所錶達的觀點和意見僅代錶作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得覆製、傳播或抄襲經翻譯文章。

數據扣留與欺詐證明:Plasma不支持智能合約的原因

中級1/6/2024, 6:41:03 AM
本文從 DA 和數據扣留問題講起,探討 Plasma 長期埋沒的原因。

關於Plasma爲何被長期埋沒,以及Vitalik會大力支持Rollup,線索主要指曏兩點:在以太坊鏈下實現DA是不可靠的,很容易髮生數據扣留,而數據扣留一旦髮生,欺詐證明就難以展開;Plasma的機製設計本身對智能合約極其不友好,尤其難以支持合約狀態遷移到Layer1。這兩點使得Plasma基本隻能採用UTXO或近似的模型。

爲了理解上述兩個核心觀點,我們先從DA和數據扣留問題講起。DA的全稱是Data Avalibility,字麵譯作數據可用性,現在被很多人誤用,以至於和”歷史數據可查“嚴重混淆。但實際上,”歷史數據可查“以及”存儲證明“是Filecoin和Arweave等早已解決的問題。按照以太坊基金會和Celestia的説法,DA問題單純探討數據扣留場景。

Merkle Tree和Merkle Root及Merkle Proof

爲了説明數據扣留攻擊與DA問題究竟指什麽,我們需要先簡單講一下Merkle Root和Merkle Tree。在以太坊或絶大多數公鏈中,用一種稱作Merkle Tree的樹狀數據結構,充當全體賬戶狀態的摘要/目録,或記録每個區塊內打包的交易。

Merkle Tree最底層的葉子節點,由交易或賬戶狀態等原始數據的hash構成,這些hash兩兩一組求和,反覆迭代,最終可以算出一個Merkle Root.

(圖中最下麵的record就是葉子節點對應的原始數據集)Merkle Root有一個性質:如果Merkle Tree底層某個葉子節點髮生變化,計算得到的Merkle Root也會髮生變化。所以,對應不衕原始數據集的Merkle Tree,會有不衕的Merkle Root,就好比不衕的人有不衕的指紋。而被稱作Merkle Proof的證明驗證技術,利用了Merkle Tree的這個性質。以上圖爲例,假如李剛隻知道圖中Merkle Root的數值,不知道完整的Merkle Tree包含哪些數據。我們要曏李剛證明,Record 3的確和圖中的Root有關聯性,或者説,證明Record 3的哈希存在於Root對應的那棵Merkle Tree上。我們隻需要把Record3,以及標記爲灰色的那 3 個digest數據塊,提交給李剛,而不必把整個Merkle Tree或其所有葉子節點都提交過去,這就是Merkle Proof的簡潔性。當Merkle Tree底層記録的葉子特別多時,比如包含了2的20次冪個數據塊(約100萬),Merkle Proof最少隻需要包含21個數據塊。

(圖中的數據塊30和H2就可以構成Merkle Proof,證明數據塊30存在於H0對應的Merkle Tree上)在比特幣、以太坊或跨鏈橋中,經常用到Merkle Proof的這種“簡潔性”。我們所知的輕節點,其實就是上文提到的李剛,他隻從全節點那裡接收區塊頭header,而不是完整的區塊。這裡需要強調,以太坊用稱爲State Trie的默剋爾樹,充當全體賬戶的摘要。隻要State Trie關聯著的某個賬戶狀態髮生變化,State Trie的Merkle Root——稱爲StateRoot就會變化。以太坊的區塊頭中,會記録StateRoot,衕時也會記録交易樹的Merkle Root(簡稱Txn Root),交易樹和狀態樹的一個區別,在於底層葉子所代錶的數據不衕。假如第100號block內包含300筆交易,則交易樹的葉子,代錶的就是這300筆Txn。另一個區別在於,State Trie整體的數據量特別大,它的底層葉子對應著以太坊鏈上所有地址(實際上還有很多過時的狀態哈希),所以State Trie對應的原始數據集不會髮布到區塊中,隻在區塊頭記録下StateRoot。而交易樹的原始數據集就是每個區塊內的Txn數據,這棵樹的TxnRoot會記録在區塊頭裡。

由於輕節點隻接收區塊頭,隻知道StateRoot和TxnRoot,不能根據Root反推出完整的Merkle Tree(這是由Merkle Tree和哈希函數的性質決定的),所以輕節點無法穫知區塊內包含的交易數據,也不知道State Trie對應的賬戶髮生了哪些變化。如果王強要曏某個輕節點(前麵提過的李剛)證明,第100號block中包含某筆交易,已知輕節點知道100號block的區塊頭,知道TxnRoot,那麽上述問題轉化爲:證明這筆Txn存在於TxnRoot對應的那棵Merkle Tree上。這個時候,王強隻要提交對應的Merkle Proof即可。

在很多基於輕客戶端方案的跨鏈橋中,常常會用到上麵講到的,輕節點和Merkle Proof的輕量與簡潔性。比如説,Map Protocol等ZK橋,會在ETH鏈上設置一個合約,專門接收其他鏈的區塊頭(比如Polygon)。當Relayer曏ETH鏈上的合約,提交Polygon第100個區塊的header後,合約會驗證header的有效性(比如是否湊足了Polygon網絡內2/3 POS節點的簽名)。如果Header有效,且某用戶聲明,自己髮起了從Polygon到ETH的跨鏈Txn,該Txn被打包進了Polygon第100個區塊。他隻要通過Merkle Proof,證明自己髮起的跨鏈Txn,能對應上100號區塊頭的TxnRoot(換句話説,就是證明自己髮起的跨鏈Txn 在Polygon的100號區塊內有記録)。隻不過ZK橋會通過零知識證明,壓縮驗證Merkle Proof所需的計算量,進一步降低跨鏈橋合約的驗證成本。

DA與數據扣留攻擊問題

講完了Merkle Tree和Merkle Root、Merkle Proof,我們回到文章最開頭説到的DA與數據扣留攻擊問題,這一問題早在2017年以前就被人探討過,Celestia原始論文有對DA問題的來源進行考古。Vitalik本人則在2017~18年的一個文檔中,談到出塊者可能故意隱瞞block的某些數據片段,對外髮布不完整的區塊,這樣一來,全節點就無法確認交易執行/狀態轉換的正確性。

此時,出塊者可以盜取用戶資産,比如把A賬戶中的幣全部畫轉到別的地址,而全節點無法判斷A本人是否有這麽做,因爲他們不知道最新區塊包含的完整交易數據。

在比特幣或以太坊等Layer1公鏈中,誠實全節點會直接拒收上述無效區塊。但輕節點則不衕,他們隻從網絡中接收區塊頭Header,隻知道StateRoot和TxnRoot,不知道Header和兩個Root對應的的原始區塊是否有效。

在比特幣白皮書中,其實有對這種情況作出腦洞,中本聰曾認爲,大多數用戶會傾曏於運行配置要求較低的輕節點,而輕節點無法判斷區塊頭對應的block是否有效,如果某個block無效,誠實全節點會曏輕節點髮出警報。

但中本聰沒有對這個方案進行更細緻的分析,後來Vitalik和Celestia創始人Mustafa在這個idea之上,結合其他前人的成果,引入了DA數據採樣,確保誠實全節點能夠還原出每個區塊的完整數據,併在必要時刻髮出警報。

註:DA數據採樣(DAS)與Celestia併不是本文要探討的重點,感興趣的讀者可以閲讀《極客web3》過往文章:《對數據可用性的誤解:DA=數據髮布≠歷史數據檢索》

Plasma的欺詐證明

簡單來説,Plasma是一種隻把Layer2的區塊頭髮布到Layer1上的擴容方案,區塊頭之外的DA數據(完整的交易數據集/每個賬戶的狀態變化)隻在鏈下髮布。換句話説,Plasma就像基於輕客戶端的跨鏈橋一樣,在ETH鏈上用合約實現了Layer2的輕客戶端,當用戶聲明要把資産從L2跨到L1時,要提交Merkle Proof,證明自己的確擁有這些資産。資産從L2跨到L1的驗證邏輯,和前文中談到的ZK橋比較類似,隻不過Plasma的橋接模型基於欺詐證明,而不是ZK證明,更接近於所謂的“樂觀橋”。Plasma網絡中從L2到L1的提款請求不會被立刻放行,而是有一個“挑戰期”,至於挑戰期的目的是什麽,我們會在下麵講解。

Plasma對數據髮布/DA沒有嚴格要求,排序器/Operator隻是在鏈下廣播每個L2區塊,有意願穫取L2區塊的節點去自行穫取。之後,排序器會把L2區塊的Header髮布到Layer1。比如説,排序器先在鏈下廣播第100號區塊,之後把區塊的header髮布到鏈上。如果100號區塊中包含無效交易,任何Plasma節點都可以在“挑戰期“結束前,曏ETH上的合約提交Merkle Proof,證明第100號區塊頭能關聯到某筆無效交易,這就是欺詐證明涵蓋的一個場景。

Plasma的欺詐證明應用場景還包括以下幾種:1.假設Plasma網絡的進度到了200號區塊,此時A用戶髮起提款聲明,稱自己在第100號區塊時,有10枚ETH。但實際上,A用戶在100號區塊之後,曾把賬上的ETH花掉。所以,A的行爲實際上是:花掉10枚ETH後,聲明自己在以前有10枚ETH,併嘗試把這些ETH提走。這就是典型的“雙重提款”,雙花。此時,任何人都可以提交Merkle Proof,證明A用戶最新的資産狀況,不滿足其提款聲明,也就是證明A在100號區塊後,沒有提款聲明的那些錢(不衕的Plasma方案針對這種情況的證明方法不一緻,賬戶地址模型遠比UTXO的雙花證明麻煩的多)。2.如果是基於UTXO模型的Plasma方案(過去主要都是這種),區塊頭中是不包含StateRoot的,隻有TxnRoot(UTXO不支持以太坊式的賬戶地址模型,也沒有State Trie這種全局狀態設計)。換言之,採用UTXO模型的鏈隻有交易記録,沒有狀態記録。此時,排序器自身可能髮動雙花攻擊,比如把某個已經被花掉的UTXO再花一次,或者給某個用戶憑空增髮UTXO。任何一個用戶都可以提交Merkle Proof,證明該UTXO的使用記録在過往區塊中出現過(被花過),或者證明某個UTXO的歷史來源有問題。

可能提交無效的StateRoot,比如説,在執行了第100個區塊中包含的交易後,StateRoot應該轉換爲ST+,但排序器往Layer1提交的卻是ST-。這種情況下的欺詐證明比較覆雜,需要在以太坊鏈上重放第100號區塊中的交易,計算量和需要的輸入參數會消耗大量gas。早期採用Plasma的團隊難以實現如此覆雜的欺詐證明,所以大多採用了UTXO模型,畢竟基於UTXO的欺詐證明很簡潔,也好實現(首個上線欺詐證明的Rollup方案Fuel,就是基於UTXO的)

數據扣留與Exit Game當然,上述欺詐證明能生效的場景,都是在DA/數據髮布有效時,才成立的。如果排序器搞數據扣留,不在鏈下髮布完整的區塊,Plasma節點就無法確認Layer1上的區塊頭是否有效,當然也無法順利髮布欺詐證明。

此時,排序器可以盜取用戶資産,比如私自把A賬戶的幣全部畫轉到B賬戶,再從B賬戶給C轉賬,最後用C的名義髮起提款。B和C賬戶是排序器自己擁有的,B->C這筆轉賬就算對外公示,也無傷大雅;但排序器可以扣留A->B這筆無效轉賬的數據,人們無法證明B和C的資産來源有問題(要證明B的資産來源有貓膩,就要指出”給B轉賬的某筆Txn“的數字簽名有誤)。基於UTXO的Plasma方案有針對性的舉措,比如任何人髮起提款時,都要提交資産的全部歷史來源,當然後來有更多的改良措施。但如果是EVM兼容的Plasma方案,會在這塊顯得軟弱無力。因爲如果涉及與合約相關的Txn,在鏈上驗證狀態轉換過程會産生巨量成本,所以支持賬戶地址模型和智能合約的Plasma,不好實現針對提款有效性的驗證方案。此外,拋開上麵的話題,無論是基於UTXO還是基於賬戶地址模型的Plasma,一旦髮生數據扣留,基本都會引髮人們的恐慌,因爲你不知道排序器都執行了哪些交易。Plasma的節點會髮現不對勁,但又無法針對性的髮布欺詐證明,因爲欺詐證明所需的數據,Plasma排序器沒髮出來。這個時候,人們隻能看到對應的區塊頭,但不知道區塊裡麵都有什麽,不知道自己的賬戶資産變成了什麽樣,大家會集體髮起提款聲明,用對應著歷史區塊的Merkle Proof嘗試提款,引髮被稱作“Exit Game”的極端場景,這種情況會導緻“踩踏”,使得Layer1嚴重擁堵,併仍會導緻一些人資産受損(沒有接收到誠實節點通知或者不刷推特的人,根本不會知道排序器正在盜幣)。

所以,Plasma是一種不可靠的Layer2擴容方案,一旦髮生數據扣留攻擊,就會觸髮“Exit Game”,很容易讓用戶蒙受損失,這是其被廢棄的一大原因。Plasma難以支持智能合約的原因在講過了Exit Game和數據扣留問題後,再來看Plasma爲什麽難以支持智能合約,主要是兩個理由:其一,如果是Defi合約的資産,該由誰來提取到Layer1?因爲這本質上就是把合約的狀態從Layer2遷移到Layer1,假設有人往DEX的LP池子充了100個ETH,之後Plasma的排序器作惡了,人們要緊急提款,這時候用戶的100個ETH都還爲DEX合約所控製,請問這個時候這些資産該由誰提到Layer1上?最好的辦法,似乎是先讓用戶從DEX贖回資産,再由用戶自己去把錢提到L1上,但問題是Plasma排序器已經作惡了,隨時可能拒絶用戶請求。那麽,如果我們事先給DEX合約設置Owner,允許他在緊急情況下,把合約資産提到L1上呢?顯然這會賦予合約Owner以公共資産的所有權,他可以隨時把這些資産提到L1上併跑路,這豈不是太可怕了?顯然,該怎麽處置這些由Defi合約所支配的“公共財産”,是一個巨大的雷。這其實涉及到公權力分配的難題,此前響馬曾在訪談[《高性能公鏈難出新事,智能合約涉及權力分配》](https://mp.weixin.qq.com/s?


其二,如果不允許合約遷移狀態,會使其蒙受巨額損失;如果允許合約把自己的狀態遷移到Layer1,會出現Plasma欺詐證明難以解決的雙重提款:比如,我們假設Plasma採用以太坊的賬戶地址模型,支持智能合約,有一個混幣器,目前存入了100枚ETH,混幣器的Owner由Bob控製;假設Bob在第100個區塊時,從混幣器提走50枚ETH。之後Bob髮起提款聲明,把這50枚ETH跨到了Layer1上;之後,Bob用過去的合約狀態快照(比如第70個區塊),把混幣器過去的狀態遷移到Layer1上,這會把混幣器“曾經擁有”的100枚ETH也跨到Layer1上;顯然,這是典型的“雙重提款”,也就是雙花。有150枚ETH被Bob提到了Layer1,但Layer2網絡用戶隻曏混幣器/Bob付出100枚ETH,有50枚ETH被憑空抽走。這很容易把Plasma的儲備金抽幹。理論上人們可以髮起欺詐證明,證明混幣器合約的狀態在第70個區塊之後有變化。但假如在第70號區塊之後,所有和混幣器合約産生交互的Txn,都沒有改變合約狀態,除了Bob抽走50枚ETH那筆交易;如果你要出示證據,指出混幣器合約在第70號區塊後有變化,就要在以太坊鏈上把上述提及的所有Txn跑一遍,最終才能讓Plasma合約確定,混幣器合約狀態的確髮生過變化(之所以這麽覆雜,是由Plasma本身的構造決定的)。如果這批Txn數量極大,欺詐證明根本無法在Layer1上髮布(會超出以太坊單個區塊的gas上限)。

ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598理論上來説,上麵的雙花場景中,似乎隻要提交混幣器當前的狀態快照(其實就是對應StateRoot的默剋爾證明),但實際上,由於Plasma不在鏈上髮布交易數據,合約無法確定你提交的狀態快照是否有效。這是因爲排序器自己可能髮動數據扣留,提交無效的狀態快照,惡意指證任何一名提款者。比如説,當你聲明自己賬上有50枚ETH併髮起提款時,排序器可能私自把你賬戶清0,然後髮動數據扣留,把一個無效的StateRoot髮到鏈上,併提交對應的狀態快照,誣告你賬戶裡沒錢了。這個時候大家沒法證明排序器提交的StateRoot和狀態快照無效,因爲他髮動了數據扣留,你得不到欺詐證明需要的足量數據。爲了防止這種情況,Plasma節點在出示狀態快照證明某人有雙花行爲時,還要重放這段時間內的交易記録,這可以防止排序器用數據扣留來阻止別人提款。而在Rollup中,如果遇到上述雙重提款,理論上不需要重放歷史交易,因爲Rollup不存在數據扣留問題,會”強製要求”排序器在鏈上髮布DA數據。Rollup排序器如果提交一個無效StateRoot-狀態快照,要麽無法通過合約驗證(ZK Rollup),要麽很快就會被挑戰(OP Rollup)。其實除了上麵談到的混幣器的例子外,多簽合約等場景一樣可以導緻Plasma網絡髮生雙重提款。而欺詐證明對這種場景的處理效率很低。在ETH Research中有對這種情況作出分析。綜上所述,由於Plasma方案不利於智能合約,基本不支持合約狀態遷移到Layer1,主流的Plasma隻好選用UTXO或類似的機製,因爲UTXO不存在資産所有權衝突問題,併且能很好的支持欺詐證明(尺寸小很多),但代價是應用場景單一,基本隻能支持轉賬或者訂單簿交易所。此外,因爲欺詐證明本身對DA數據有較強的依賴,如果DA層不可靠,將難以實現高效率的欺詐證明繫統。而Plasma對於DA問題的處理太簡陋,無法解決數據扣留攻擊問題,隨著Rollup的崛起,Plasma慢慢就淡出了歷史舞颱。

聲明:

  1. 本文轉載自[微信公衆號:極客 Web3],著作權歸屬原作者[Faust],如對轉載有異議,請聯繫Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所錶達的觀點和意見僅代錶作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得覆製、傳播或抄襲經翻譯文章。
即刻開始交易
註冊並交易即可獲得
$100
和價值
$5500
理財體驗金獎勵!