本文旨在介紹檢查點、證明壓縮以及默克爾樹等概念。本文屬於 Daniel Goldman 所撰寫的關於 Plasma 的系列文章之一。更多關於 Plasma 理論基礎,Plasma MVP 及 Plasma Cash 的內容請參見《將多筆 Layer2 合爲一筆 Layer1,Plasma 究竟如何做到的?》和《深入理解與 UTXO 截然不同的 Plasma Cash 結構》。

原文標題:《Understanding Plasma, Part 2: Make Plasma Fungible Again》
原文作者:Daniel Goldman
編譯:喏唄爾

在前面的文章中,我們開啓了 Plasma 的研究之旅。我們希望尋求一種高吞吐量的支付系統,該系統不僅能夠保留以太坊區塊鏈的安全性,同時它只需偶爾進行恆定規模的鏈上交易。

我們姑且把視線離開 Plasma Cash 結構 —— 在前文中,我們提到過這一結構實現了衆多我們想要的功能,但它也帶來了兩個重大的缺陷:Plasma Cash 的「幣」實際上是不可替代性代幣 (限制了支付面額的靈活性) 以及它需要用戶存儲大量不斷增長的數據集。

在本文中,我們將探索一些基於 Plasma Cash 並旨在規避 —— 或者至少緩解 —— 這些缺陷的其它功能和機制(以及 / 或者重新思考 Plasma Cash)。

事情將會變得越來越複雜。引用數學家 Peter Saran 的隱喻來說,這類研究就像是你試圖壓扁一塊尺寸略大於它所在房間的地毯。每當你踩在這個地毯的一角,另一角就會意外地翹起。此外,本文即將開啓關於 Plasma 的研究。正如我們將要看到的,一些問題仍然懸而未決。這裏討論的大部分內容仍處於探索中,仍有待不斷髮展和發現。

那麼接下來進入正文:

減少客戶端的數據量,策略 1:檢查點 (Checkpoints)

我們在(我們此後將稱爲)香草 Plasma Cash (Vanilla 除了有香草之意,還有老式 / 普通的意思,此處有雙關含義)中看到,每個客戶端需要存儲的數據量隨着時間的推移呈線性增長。

也就是說,對應每一個幣,每個 Plasma 區塊需要一個關於包含(幣被花費)或未被包含(幣的所有權保持不變)的默克爾證明。這個完整的歷史是十分必要的,因爲沒有人知道用戶在爭議解決過程中需要哪部分證據。完整存儲這些數據本身已經足夠痛苦了,而在每一次付款時還要將所有這些數據都轉移給下一個所有者,這無異於雪上加霜。

爲了幫助減輕這種痛苦,我們不妨設想一種方案:比如每隔兩週,或者每 500 個 Plasma 區塊,Plasma 鏈就會官方地發生一些「鏈上事件」以確定某些(或全部) Plasma Cash 幣的所有權。

也就是說,一旦這個「鏈上事件」被最終敲定,那麼它將成爲一個歷史檢查點:未來一旦需要驗證關於當前時刻的所有權證明時,只需要回到這一個點。這裏面不再涉及任何關於先前歷史的爭議。因此,我們可以安全地拋棄掉關於先前區塊的默克爾證明。與此同時,這個方案將爲必需的客戶端數據的大小限定一個具體的上限。完美!

要使這些檢查點發揮作用,我們首先需要做的第一件事是確定 Plasma 運營者(或其他參與者,但爲了簡單起見,我們姑且假設爲運營者)該如何證明某個特定的 Plasma 區塊中的幣的所有權的完整狀態。

你可能已經猜到,這裏面會涉及到一棵默克爾樹:運營者構造出一棵樹,這棵樹負責將每一個幣映射到它的所有者地址,然後將默克爾根發送到主鏈。每一位所有者分別都會收到相應的默克爾分支。如果在 2 周(或者其他任意時間)之後,這些數據都沒有受到質疑,那麼我們會認爲這個檢查點的狀態已經得到官方認可(這確實會要求每個用戶都在線接收這些數據並對這條鏈進行監控。但請記住,Plasma 與其他 Layer 2 結構一樣,都需要獲得這種活性)。

就這樣就可以了嗎?唉,生活並非如此簡單。很不幸,上述檢查點機制引入了一個非常討厭的邊緣情況。

假設某個惡意 / 受損 / 無聊的運營者在廣播了關於某個檢查點的默克爾根以後,無法再與用戶共享任何默克爾證明數據,那麼我們該怎麼辦?

任何讓用戶強迫運營者提供這些數據的方法都會讓我們陷入說者-聽者這一錯誤等效區域,並 (通常會) 引入破壞向量及其他複雜情況。我們可以說,用戶仍然可以安全地將資金撤回到主鏈上,這一點在技術上沒有任何問題。但問題是,現在每個用戶都必須疏散到主鏈上,並且由於我們剛剛介紹的檢查點的存在,他們必須在某個有限的窗口(即兩週)內這麼做。我們在前面的文章中所提到的那個被巧妙地按下的地毯的「大規模退出」一角又翹起來了。

但這些數據都不會被丟失,我們可以通過「加密經濟聚合簽名」這一額外的工作形式來保存這些數據(我敢發誓真實情況沒有聽起來那麼嚇人)。實質上,我們稍微修改了一下所有權證明,從而讓運營者要求獲取檢查點中的每一個幣的所有者的簽名。換句話說,運營者只能在獲得幣的所有者的明確同意下才能爲幣設置檢查點。然後,運營者還會在鏈上發佈一些額外的數據,以證明在該檢查點中包含了哪些幣(想象每一個幣都在二進制數字列表中表示,其中「1」表示同意 / 包含,而「0」表示不包含)。

這種方式雖然看似反直覺,但卻足以解決問題!這裏的關鍵是,每一個幣都對應特定的有效的所有者,並且這些所有者很清楚自己的身份是什麼。同理,他們也知道自己是否同意某個具體的檢查點。

因此,這些所有者唯一需要擔心的情況是,他們沒有在檢查點設立時對自己的幣進行簽名,但卻在幣的槽中看到了「1」。在這種情況下,他們只能提出質疑 —— 他們清楚這個質疑是有理有據的 —— 並使檢查點作廢。由此,我們避免了大規模退出的狀況,檢查點安全無恙。

Layer 2 純粹主義者可能一下子就注意到,這裏的鏈上要求並不是「嚴格的 Plasma」方案。位圖數據的大小與幣的數量線性相關。但實際上,這個成本應該相當小。尤其在大多數情況下,我們可以使用簡單的位域壓縮技術來極大地減少數據量。此外,檢查點的存在對於其所公證的幣而言十分有利。因此,鏈上交易的成本能夠十分理想地在所有幣的所有者中攤銷。最後,檢查點的設立是遵循自願原則的,它最終(可以說)是一個非常具體的優化點。

減少客戶端的數據量,策略 2:壓縮證明(Proof Compression)

另一個更先進的用於降低存儲需求的方案是將多個 Plasma 區塊證明有效地壓縮成單個證明。

我們不妨再次回想一下,對於香草 Plasma Cash 的幣來說,每一個區塊都需要一個關於是否被包含的默克爾證明。現有的想法,我們再添加一個關於包含的要求:我們不僅需要鏈上默克爾根和鏈下默克爾分支,我們還需要一個鏈上「RSA 累加器 (即純粹使用數論來證明成員資格)」和一個鏈下的「知識證明(具體細節待會兒再解釋,現在暫時先跳過)」。二者都需要對包含問題作出證明,但只有其中一方需要作出未被包含的證明。也就是說,一個幣要麼被包含在區塊中,要麼不包括在其中,沒有其他可能性。(對於包含證明來說,)「A 和 B」的對立面就變成了「(對於未被包含證明來說) A 或 B」。

從更高的層面來看,這種結構基於這麼一個事實,即未被包含這一事實本質上更加容易得到證明。而如果一個幣被包含進區塊中,那麼我們需要更多的數據——至少需要新的接收方的地址。在未被包含的案例中,我們只需要說「這個幣沒有被包含」。顯然,我們應該把這種不對稱且更加簡便的承諾方案應用到未被包含的案例中。

在進行大量簡化以後,以下是具體的工作原理:跟往常的 Plasma Cash M.O. 一樣,每一個幣將獲得一個自然數形式的 ID,但現在我們增加一個額外的要求,即所有這些 ID 必須都是素數。每一個 Plasma 區塊提交的 RSA 累加器 (G) 本身只是一個數字,它隨着 Plasma 區塊根據幣的轉移情況進行自我更新。

實質上,在當前區塊中,G 會隨着被花費的幣的 ID 呈冪次增長。例如,在第 101 個區塊中,發生轉移的幣的 ID 爲 5,7,17,53 和 83 (都是素數)。我們不妨假設第 100 個區塊所提交的累加器的值爲 G100 (這是一個大數),那麼第 101 個區塊的累加器的值計算如下:

再議 Plasma Cash:通過檢查點和壓縮證明策略解決固有缺陷

這一新的 G101 的值將被遞交給主鏈。

在鏈下 Layer 2 的世界裏,如果 Alice (假設她擁有 ID 爲「17」的幣) 想要確保自己的幣已經被提交到累加器中,那麼她只需要 17 的餘子式,即 5 * 7 * 53 * 83 (153965)。她獲取 G101,並且 G101 在主鏈上,由此驗證:

再議 Plasma Cash:通過檢查點和壓縮證明策略解決固有缺陷

這證實了她的幣 ID,即 17 已經被累加器接受不了。與此同時,她也得到了通常的默克爾分支的提交信息。一旦她確認了這一點,那就沒有問題了。

現在,我們不妨考慮一下 ID 爲 11 的幣的所有者 Bob。需要注意的是,這個幣沒有在第 101 個區塊中發生轉移。爲了得到這個幣沒有被包含進區塊的證明,Bob 只需要一個餘子式來表明,11 並不是 153965 的因子。也就是說,Bob 本質上只需要一個數字。一旦 Bob 得到了這個數字,基於上述要求的「任一 / 或」性質,Bob 就無需操心任何跟未被包含證明相關的默克爾分支業務了。

最後,最關鍵的一點是:考慮到取冪和素數分解的性質,上述過程可應用於多個任意編號的區塊中。也就是說,這個過程可以基於多個不連續的區塊來完成。換句話說,第 100 個區塊和第 101 個區塊之間的未被包含證明與第 100 個區塊和第 100 萬個區塊之間的未被包含證明看起來完全相同。二者都只需要 Bob 存儲一個數字。

如果再進一步思考,我們幾乎肯定,在特定的幣的生命週期中,這個幣很可能只是偶爾發生轉移。對於絕大多數的 Plasma 區塊來說,這個幣可能從未發生過變動。通過我們剛剛介紹的機制,幣的轉移過程之間的間隔現在只需要恆定規模的數據(即一兩個數字)。所以,現在客戶端的數據存儲只會隨着每一次幣的轉移而增加。這一點非常重要。

請注意,上面方案簡化得有點過火了:依照上述規則,G 的值很快就會變得非常龐大。我們做了一些細節的處理,就是讓這個值在某個模 M 處具有上限。這個模數允許我們限制累加器的值的增長,同時仍然保留我們需要的所有素因子的信息。然而,即使有了這個上限,如果 Alice 和 Bob 想要去執行驗證步驟,他們還需要進行一些非常繁重的算術運算。然而,事實證明,這個問題是可以克服的:我們可以使用幾種壓縮證明方案。這意味着,Alice 和 Bob 可以只驗證他們所關心的結果,而無需經常進行完整且繁瑣的計算。

然而,還有一個極度複雜的問題需要解決。我很抱歉地告訴你,目前爲止還沒有一個簡潔的解決方案。簡單、輕量級的證明驗證確實是一個好東西,但我們不要忘記這些證明首先需要一部分「幸運兒」(即運營者)來生成這些證明。例如,對於消費級筆記本來說,計算大量複合指數的計算成本實在非常高。

因此,我們至少需要要求運營者擁有精良的服務器端設備。有的人希望我們可以找到一些方法來讓這些操作實現並行化,或者將這些工作的一部分外包給多個運營者,甚至整條 Plasma 鏈的用戶羣。此外,在機緣巧合之下,其他無關的以太坊生態系統研究引起了 Plasma 研究者對可驗證延遲函數 ASICS 的興趣。可驗證延遲函數 ASICS 恰好也需要計算大量的指數棧,因此可能會對此有所幫助。最後,其他方法與 RSA 累加器結構差不多,只不過具有不同的數學 / 密碼學細節——包括向量提交信息和不同的 ZK-SNARK/STARK 方案。我們仍在探索中。然而,這些研究最終是否能夠在某種程度上在經濟方面克服計算瓶頸,仍有待觀察。

可替代性支付:從數字範圍的角度來思考

最後,我們不妨做一些改變,比如降低 Plasma Cash 的基本限制,即其資產的不可替代性。如果我們創建一個價值 5 個以太幣的 Plasma Cash 幣,那麼這個幣無法被拆分或合併 —— 終其一生,它都是一個價值 5 個以太幣的幣。

要解決這個問題,我們首先重新思考我們對 Plasma Cash 的看法,而不是實際改變它的任何功能(至少暫時是這樣)。

我們不妨設想一條 Plasma Cash 鏈,其中每一個幣代表一個固定面額的單一資產,這些資產在主鏈上是可替代的(比如以太幣)。在此之前,我們談到將每一個幣視爲具有唯一 ID 的不可替換性代幣。Alice 的 ID 爲 2342 的幣可能價值 20 個以太幣。我們去做一個等效的思維變換,想象一下這條 Plasma 鏈中的所有以太幣都依照數字線段的形式有序排列。如果鏈條上總共有 5000 個以太幣,那麼這條線段將從 0 延伸到 5000。Alice 那 20 個以太幣不再由某個獨特的 (雖然是任意的) 幣 ID 表示,而是用數字線段上的某一段(即「從 520 到 540 的以太幣」)來表示。爲了保證每個人的以太幣的所有權的合法性,合約必須強制執行以下功能:無論何時創建出新的「範圍」,舊的數字段都存在於先前未被其他範圍所佔據的間隔中。只要我們能夠保證這一點,那麼我們就能夠構建出與舊的 Plasma Cash 同構的新模型。

到目前爲止,一切進展順利。現在,我們再做進一步升級:假設 Alice 正在花費她的「幣」,這意味着現在我們要將她的「數字範圍」的所有權轉讓給另一方。如果在轉讓的過程中,Alice 不僅可以將這個範圍分配給新的所有者,同時還能夠改變範圍的端點的話,那麼會怎麼樣呢?如果這個功能能夠實現,那麼 Alice 就可以自由地向 Bob 支付不多於 20 個以太幣的面額,比如「只有從 520 到 523 的以太幣」。

爲了適配這種情況,我們需要把 Plasma Cash 的結構做一點點改動:我們將保留「幣」的概念,同時每個幣將代表我們想要支持的數字線段的最小單位(假設是 0.00001 個以太幣)。現在,這些「幣」只是作爲一種抽象的存在。從字面意義上說,它們並不構成 Plasma 區塊的內容。相反,每一個區塊現在都是一棵交易樹,每一筆交易都花費在給定範圍以內的幣。如果某個特定範圍內的「幣」被其他非支出方(所有者)所擁有,那麼真正的所有者可以發出質疑。這時,我們將使用大家熟悉的香草 Plasma Cash 裏面的加密經濟質疑遊戲來解決問題。

所以現在,新的難題變成了:Alice 該如何簡潔地向 Bob 證明她正在交易的所有的幣都歸自己所有,並且不存在其他交易的範圍與之重疊或「溢出」到自己的範圍內呢?如果是在之前,那麼每一筆交易都會被包含在某個幣中,但現在,我們需要某種證明以某種方式來傳達有關區塊中的其他交易的信息。

爲了實現這一目標,我們將引入另一種版本的默克爾樹!我們將這種新的數據結構稱爲默克爾索引樹。樹的葉子是交易本身,每一筆交易代表某個範圍內的幣的轉移。默克爾索引樹的新功能是,現在樹中的每一個節點都會獲得一個分配給它的數字。其規則如下:

(1)樹的底部的葉子的範圍必須連續排列(即每個範圍的結束點必須小於下一個範圍的起始點),並且(2)每個父節點的數值等於其兩個子節點的較小值 (如果其子節點是範圍,那麼我們則使用每個範圍的起始值作爲參考)。

再議 Plasma Cash:通過檢查點和壓縮證明策略解決固有缺陷

只要某個範圍的接收者驗證上述規則成立,那麼默克爾證明就足以讓他們相信當中不存在範圍重疊問題。這樣的結構很難被攻擊。

因此,上述結構讓 Alice 只需發送其所擁有的某個範圍的子部分。這在某種意義上就是對她的以太幣進行了「拆分」。接下來,我們希望用戶能夠「合併」他們的以太幣。假設 Bob 總共有 12 個以太幣,他從 Alice 處收到了「從 520 到 523 」以及「從 1001 到 1010」範圍內的以太幣。我們希望 Bob 能夠將這 12 個以太幣作爲單個整體原子支付給他人。

經過一些巧妙的轉換,我們可以實現這一功能:網絡中不存在任何阻礙來阻止單筆交易同時指定多個範圍用作支付。如果其中任意一個範圍顯示無效,那麼所有範圍的支付請求都會被取消。這裏面的問題是,現在接收者需要追溯上述兩個範圍的歷史。當然,如果他們將所有這些範圍外加一部分額外的範圍都發送給另一方,那麼接收方需要所有相關範圍的歷史記錄。因此,我們逐漸開始靠近需要所有參與方來驗證整條鏈的終點站。這塊地毯的「證明大小」一角已經翹起來了。

爲了解決這個問題,當歷史記錄的大小開始接近某個棘手的水平時,各參與方可以對其範圍進行「碎片整理」。他們只需要與其他參與方 (等值地) 交換範圍,以便使範圍儘可能地開始整合。人們可以認爲這類似於支付通道網絡中的通道再平衡策略。擁有整個網絡全局視圖的運營者顯然可以幫助實現這一目標。我們已經討論過幾種用於實現這一目標的加密經濟機制和碎片整理算法,但具體哪種方法的效果最好,則需要在實踐中驗證。

(請注意:另一個結構家族,即混合通道 / Plasma 模型,也可以爲我們提供更大的支付可替代性。這一部分內容在後續文章中會繼續討論)。

結論

恭喜你,你已經實現了 Plasma 的可替代性了!那麼接下來我們應該怎麼辦?Plasma 的難題是不是已經被我們破解啦?很難說,上述方案不太像是一個殺手級解決方案,我始終感覺還有哪裏不太滿意。與此同時,這個工具包中的各種技術也許最終足以實現真正的 Plasma 鏈。時間會告知答案。

不管怎樣,關於 Plasma 的研究和開發仍在以驚人的速度向前發展。所以當你讀到這篇文章的時候,你會發現還有更多事情等待你去考慮(實在抱歉)。我們下回再見。

來源鏈接:www.theblockcrypto.com