為什麼在 Plasma 上難以執行 EVM

感謝 Dan Robinson 對相關話題的討論,令我獲益良多。
從根本上來說,Plasma 目前僅利用非常簡單的 UTXO 或非同質代幣來完成大部分工作。很多人想知道是否有可能建立一條允許使用者部署 EVM 智慧合約的 Plasma 鏈。遺憾的是,要實現這一點比想象中複雜得多,如果你在 Plasma 上下的功夫不多,可能捉摸不透原因所在。我寫本文的目的是快速概述一下 Plasma 為何難以完全支援 EVM 的執行,繼而就如何建立一條能夠執行更多型別的智慧合約的 Plasma 鏈提出一些建議。
為何建立支援 EVM 的 Plasma 鏈如此之難?在我們開始揭祕之前,不妨再多聊一下 Plasma 。Plasma 的基本特性之一是 Plasma 鏈上的狀態一定要能夠撤回到根鏈上(例如以太坊),以確保狀態的完整性。Plasma 鏈上的資產一定要能夠自由轉移到根鏈上,反之亦然。這一功能非常重要,當 Plasma 的共識機制受到腐化時,使用者必須將他們在 Plasma 鏈上的資產撤回根鏈。
要切實理解這一點,請想象一條簡單的 Plasma 鏈,其使用者可以通過賬戶轉移或接收資金。如果你是這條 Plasma 鏈上的使用者之一,想要撤回資金。你該怎麼做?你可以告訴以太坊上的合約說你在 Plasma 鏈上有一筆資金,你想要撤回這筆資金。當然這裡有個條件——你不能謊報賬戶中的餘額。這就是為什麼我們要引入“挑戰期”機制,在此期間可以將無效退款鎖定。
現在,我們把這一概念擴充套件到一類耳熟能詳的 EVM 智慧合約上,以簡單的多重簽名賬戶為例。如果這個賬戶目前位於 Plasma 鏈上,我們需要提供某個方法將錢包撤回到根鏈上。然而,我們不想把資金從多重簽名賬戶中取出——而是想將整個智慧合約撤回到根鏈上。要知道每個EVM 合約都是由狀態、餘額和程式碼組成的。因此,我們實際上是將這個多重簽名合約的狀態、餘額和程式碼從 Plasma 鏈上轉移到根鏈上。轉移過後,這個合約理應能夠在根鏈上正常執行。
那麼,實際是誰決定將 Plasma 鏈上的東西轉移到根鏈上的呢?如果我們談論的是簡單的賬戶,賬戶所有人理應能夠隨時撤回餘額。如果我們談論的是多重簽名賬戶,那我們可以設計一些不同的機制來決定何時將多重簽名賬戶轉移到根鏈上。可能要求多重簽名賬戶上的每位使用者簽名,或是 n/m 位使用者簽名,或是一位使用者簽名即可。上述這些機制都可能有效——需由多重簽名賬戶的設計者決定哪種機制最合適。
不過問題來了—— 並非每次都能確定是哪些人想將合約從 Plasma 鏈上轉移至根鏈上 。想象一下,我們(在某條 Plasma 鏈上)運行了一個關於虛擬貓的智慧合約。假設共識機制受到腐化,每個人都需要離開這條 Plasma 鏈以確保資金的安全。我們要怎麼處理這個虛擬貓合約?正如上文討論過的那樣,我們需要將這個合約撤回到根鏈上。遺憾的是,如果我們允許所有人都撤回合約,使用者就會一哄而上,儘可能多地撤回合約,導致這條 Plasma 鏈作廢。因此,我們必須想出一個更好的機制。
我們能想出一些機制,只是這些機制不是中心化程度太高就是成本太高。利用投票機制來決定何時可以撤回合約看似可行。其問題在於,如果合法的投票者的人數較少,合約控制權的中心化程度就過高;而合法投票者人數越多,投票機制的成本就越高。
再說回從 Plasma 鏈上撤回事物的過程。別忘了,一旦我們發現某個要撤回的狀態是無效的,我們就可以阻止它退出。假設我們的虛擬貓合約上註明了我是貓咪 123 的所有者,現在我們想撤回這個合約,需要註明這個合約的當前狀態。當前狀態中有一條記錄是“Kelvin 擁有貓咪 123 ”。如果我在該合約的挑戰期內將貓咪 123 的所有權轉移給了另外一個人,會出現什麼情況呢?“真正的”狀態變成了“使用者 X 擁有貓咪 123 ”。這時,要撤離 Plsama 的狀態無效了(因此可以被挑戰成功)。我們迎來了第二個大難題—— 如果任何人都能修改合約的狀態,那麼任何人都能阻止退出 (校對注:即每一個使用者的許可權都變成了一票否決權)。
至此引出了我們的終極問題——我們需要驗證被挑戰的狀態變更是否為有效變更,然而 在EVM 中很難驗證 EVM 的狀態變更 (validating EVM state changes inside the EVM is hard)。對於像賬戶這樣基礎的合約來說,一次有效的狀態變更只需要賬戶所有人的簽名,而且在 EVM 中很容易檢查。然而,對於複雜的 EVM 合約來說,情況就要複雜得多。一種驗證 EVM 執行的方法是使用 TrueBit 之類的專案。雖然這可能是最簡單的選擇,但是會讓 Plasma 過於依賴外部系統,進而從根本上扼殺其安全性。在理想情況下,如果我們想要通過無需信任的方式驗證某個 EVM 的步驟,就要在這個 EVM 中再執行一個 EVM 。基於這方面的考慮已經有時日,Vitalik 甚至為此提出了一則以太坊改進計劃。真心推薦大家看一下這個以太坊改進計劃,看完就懂了(在 gas 限制中再設 gas 限制,呃……)。
這就是為什麼 Plasma 鏈無法像以太坊那樣執行這麼多合約的原因。最後再快速回顧一下:
- 並非每次都能確定是哪些人想將合約從 Plasma 鏈上轉移至根鏈上。
- 如果任何人都能修改合約的狀態,那麼任何人都能鎖定撤回物。
- 在EVM 中很難驗證 EVM 的狀態變更。
那麼,我們將何去何從?幸運的是,我們已經開始提出一些概念,主要通過分解典型的幾類智慧合約來弱化這些問題。同樣以虛擬貓合約為例,如果每位使用者要轉移的是自己虛擬貓而非整個合約的話,要確定是哪些人在將 Plasma 上的事物轉移到根鏈上會容易得多。我們可以用迷你智慧合約來代表每個貓咪,而且只有貓咪的所有者才有權修改合約。只要簡單地改變下設計,前兩個問題就迎刃而解。
關於如何修改設計並使之更適用於開發者,我已與 Dan Robinson 進行過討論,之後我會將一些初步的想法釋出出來。其要點在於,我們發現最簡單的方法或許是使用交易虛擬機器(TXVM)之類的東西和可以撰寫並自動分解 EVM 智慧合約的高階語言。我們稱之為 “Plasma VM”,因為這種方法是可行的,而且向後相容 MVP。
如有任何反饋/問題/評論,歡迎之至。如果仍有不解之處,煩請告知,我會加以改進!
原文連結: https://medium.com/@kelvinfichter/why-is-evm-on-plasma-hard-bf2d99c48df7
作者: Kelvin Fichter
翻譯&校對: 閔敏 & 阿劍