摘要:用戶在將主鏈的資產如以太幣或者其它合約發布的轉移到的過程稱為存款,具體做法是直接向主鏈上的合約發送以太幣或。將賣給,獲得了以太幣,賺取了以太幣。當子鏈中有拜占庭行為發生時,用戶之間可以共同協作執行批量取款。
本文首發于深入淺出區塊鏈社區
原文鏈接:深入理解Plasma(二)Plasma 細節原文已更新,請讀者前往原文閱讀
這一系列文章將圍繞以太坊的二層擴容框架,介紹其基本運行原理,具體操作細節,安全性討論以及未來研究方向等。本篇文章主要對 Plasma 一些關鍵操作的細節進行剖析。
在上一篇文章中我們已經理解了什么是 Plasma 框架以及它是如何運行的,這一篇文章將對其運行過程中的一些關鍵部分,包括 Plasma 提交區塊的過程,當有惡意行為發生時如何構建防偽證明以及如何退出 Plasma 子鏈等進行剖析。需要注意的是,由于 Plasma 是一套框架,因此本文只剖析 Plasma 項目的共性,每一部分的實現細則還是需要參考實際的項目,例如 Plasma MVP(Minimal-Viable-Plasma)和 Plasma Cash 等。
存款(Deposit)Plasma 的主要思想就是將大部分計算過程都轉移到鏈下進行,用戶只有在進入和退出 Plasma Chain 的時候需要跟主鏈上的智能合約交互,這也是所有 Plasma 應用的標準流程。
用戶在將主鏈的資產(如以太幣或者其它 ERC20 合約發布的 token)轉移到 Plasma Chain 的過程稱為存款(Deposit),具體做法是直接向主鏈上的 Plasma 合約發送以太幣或 token。Plasma 合約收到 Deposit 交易后會在子鏈上創建跟 Deposit 數額一致的交易,并將其打包進區塊中,作為存款確認的證明。這個過程如下圖所示(來源自[[1]]。
當用戶看到子鏈上自己之前存款的交易被確認后,就可以在子鏈上使用這筆資產(給子鏈上的其他用戶發送交易或者退出子鏈等)。
狀態確認(State Commitment)當大部分都轉移到鏈下進行時,需要某種機制確保鏈下狀態的更新得到確認,這樣才能保證當有惡意行為發生時,主鏈可以保證用戶不會受到損失。這就是為什么需要狀態確認(State Commitment),即子鏈周期性地將狀態更新情況提交到主鏈進行共識。
然而,將子鏈中的所有交易都同步到主鏈顯然違反了 Plasma 的初衷,在 Plasma 中,實際向主鏈提交的是 Merkle Tree 的根哈希。因此子鏈中的實際交易情況被隱藏,在主鏈上只能看到子鏈區塊的哈希值。
當有惡意行為發生時,子鏈網絡中的所有用戶都可以向主鏈提交防偽證明,證明成立后,含有惡意交易的區塊將被回滾。
防偽證明(Fraud Proof)Plasma 的一個關鍵設計之一就是允許用戶構造防偽證明(Fraud Proof)。防偽證明的意義在于只要發布區塊的節點構造了含有惡意交易的區塊,那么就要承擔被懲罰的風險。每當新的區塊被提交到主鏈上時,會留出一段時間給用戶提交防偽證明,如果在這段時間內沒有證明被提交,則認為新的區塊被驗證合法。如果有防偽證明檢測到區塊中存在惡意交易,則該區塊將被舍棄,回滾到上一個被驗證合法的區塊。Plasma 中的防偽證明主要有以下(但不限于)幾種:
資產可花費證明
交易簽名有效性證明
存取款證明
至于每種防偽證明的具體形式,則依賴于實際 Plasma 應用的實現細則。
如下圖所示(來源自[[1]](https://plasma.io/)),子鏈中每個節點都存有 1-4 個區塊的數據。假設區塊 1-3 已經被驗證合法,而區塊 4 中存在惡意交易,那么每個節點都可以使用 1-4 個區塊中的數據構造防偽證明提交到主鏈,主鏈驗證后將子鏈中的狀態回滾到區塊 1-3。
防偽證明還可以使用零知識證明(zk-SNARKs 或者 STARKs)來構造,但由于目前通過零知識證明生成證明的時間和空間還有待優化,目前設計的 Plasma 并不依賴零知識證明。零知識證明在 Plasma 中的應用是一個很有前景的研究方向,感興趣的讀者可以參考以太坊研究團隊關于這方面的研究[[2]](https://ethresear.ch/t/plasma...。
取款(Withdrawal)取款(Withdrawal),顧名思義,就是從子鏈中的資產取回到主鏈上,因此取款也被稱為退出(Exit)。取款操作可以說是 Plasma 框架中最重要的一步,因為它確保用戶可以安全地將子鏈上的資產轉移到主鏈上。之前的存款以及狀態確認步驟已經產生了一些交易數據,并在主鏈上得到同步,用戶可以利用這些數據構造資產證明,之后執行簡單取款(Simple Withdrawal)操作退出子鏈。當有扣留(Withholding)攻擊發生(即子鏈上的礦工惡意扣留區塊,意圖雙花攻擊等)時,用戶可能無法成功獲取數據構造資產證明,這時需要執行批量取款(Mass Withdrawal)操作退出子鏈。
需要注意的是,當子鏈中有取款操作發生時,跟這個取款操作相關的賬號或者交易都將被禁止。
簡單取款(Simple Withdrawal)執行簡單取款的條件是所要取回的資產已經在主鏈和子鏈上確認。
一個簡單取款的執行主要有以下幾個步驟:
向主鏈上的 Plasma 智能合約發送已簽名的取款交易。取款的數額可以包含多個輸出(UTXO模型),但所有輸出必須在同一個子鏈當中,而且每個輸出的余額必須全部取出,不能只取出一部分。取款數額的一部分還需要被當作押金,作為惡意行為的懲罰。
當取款請求發送后,需要等待一段“爭議期(Challenge Period)”,這期間其它節點可以構造證據證明該取款中的部分或全部數額已經被花費。如果爭議期內有節點提供證明成功,那么取款被取消,而且押金被扣除。
接下來可能還要等待一段時間,直到所有區塊高度較低的取款操作都完成。這是為了保證所有取款操作按照“先來后到”的順序執行。
當爭議期結束后,如果沒有爭議被提出,則認為取款操作成立,取款者將子鏈資產成功取回到主鏈。
快速取款(Fast Withdrawal)快速取款(Fast Withdrawal)跟簡單取款相比的差別主要是引入一個中間人,白皮書上稱為 Liquidity Provider,這里簡稱為 LP。如果一個用戶不想等待很長的爭議期(目前的實現至少要一周),那么它可以選擇從 LP 這里直接取款,只需要消耗一個交易確認的時間,代價是需要支付給 LP 一定的費用。由于 Plasma 白皮書上關于快速取款的描述太過晦澀,這里主要參考 kfichter 提出的 Simple Fast Withdrawal[[3]](https://ethresear.ch/t/simple... 來介紹快速取款是如何實現的。
為了實現快速取款,取款方和 LP 可以利用一個流動合約(liquidity contract)。假設取款方是 Alice,她想要執行快速取款將 10 以太幣從子鏈轉移到主鏈。她首先向流動合約發送 10 以太幣,注意這里的交易是在子鏈上進行的。當這個交易被子鏈打包成區塊后,Alice 可以調用合約中的某個退出函數,這時 Alice 將獲取一個代表她這筆資產的 token。Bob 作為 LP,他檢查了子鏈上數據之后證明 Alice 的取款沒有問題之后愿意以 9 以太幣的價格購買這個 token。Alice 將 token 賣給 Bob,獲得了 9 以太幣,Bob 賺取了 1 以太幣。
需要注意的是,實現快速取款的前提條件是沒有拜占庭行為發生,即沒有扣留區塊攻擊發生,因為 LP 需要驗證取款方的交易歷史。
批量取款(Mass Withdrawal)當子鏈中有拜占庭行為(例如,區塊扣留攻擊)發生時,將會影響以后生成防偽證明,因此網絡中的每個用戶都有責任快速退出子鏈。雖然批量取款(Mass Withdrawal)操作不是必要選擇,但當大量用戶執行取款時很可能會造成主鏈擁塞,也會消耗更多的 gas,因此批量取款是當子鏈受到攻擊時更好的選擇。
批量取款操作由于所采用的模型(UTXO 模型或者賬戶模型)不同會有較大的差別,而且目前關于批量取款的操作細節也正在研討當中,因此這里只對批量取款做簡單介紹,想要了解目前研究狀態可以參考[[4]](https://ethresear.ch/t/basic-...。
當子鏈中有拜占庭行為發生時,用戶之間可以共同協作執行批量取款。這時會有一個節點扮演取款處理人(Exit Processor)的角色,簡稱為 EP,負責當前某個批量操作(可以同時有多個批量取款操作發生,但同一個取款申請不能存在于多個批量取款),并且可以收取服務費作為報酬。EP 將構造一個位圖(bitmap,即一串0/1)記錄哪些資產要執行取款。之后 EP 將利用現有的區塊數據檢查每個取款是否合法,之后將構造一個批量退出初始化交易(Mass Exit Initiation Transaction,MEIT),并將其發送到主鏈上。在 MEIT 被主鏈確認之前,每個用戶都可以對這個交易提出異議。當爭議期結束,MEIT 被主鏈確認,批量取款成功。
總結本文主要對 Plasma 框架中一些關鍵操作進行了比較詳細的介紹,但如果不依托于某個實際的 Plasma 項目,對一些細節還是很難理解。因此在后面的文章中將會介紹 Plasma MVP 以及 Plasma Cash。
相關資源https://plasma.io/
https://ethresear.ch/t/plasma-is-plasma/2195
https://ethresear.ch/t/simple-fast-withdrawals/2128
https://ethresear.ch/t/basic-mass-exits-for-plasma-mvp/3316
本文的作者是蓋蓋,他的公眾號: chainlab
深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24376.html
摘要:用戶在將主鏈的資產如以太幣或者其它合約發布的轉移到的過程稱為存款,具體做法是直接向主鏈上的合約發送以太幣或。將賣給,獲得了以太幣,賺取了以太幣。當子鏈中有拜占庭行為發生時,用戶之間可以共同協作執行批量取款。 本文首發于深入淺出區塊鏈社區原文鏈接:深入理解Plasma(二)Plasma 細節原文已更新,請讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴容框架,介紹其基本運行原理,具體操...
摘要:稀疏梅克爾樹在上文中我們已經了解到一個交易的成功的前提是需要發送方提供關于一個的完整交易歷史。因此,中使用了一種稱為稀疏梅克爾樹,的數據結構存儲交易數據,能夠在的時間復雜度驗證一個交易不存在。 本文首發于深入淺出區塊鏈社區原文鏈接:深入理解Plasma(四)Plasma Cash原文已更新,請讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴容框架 Plasma,介紹其基本運行原理,具...
摘要:稀疏梅克爾樹在上文中我們已經了解到一個交易的成功的前提是需要發送方提供關于一個的完整交易歷史。因此,中使用了一種稱為稀疏梅克爾樹,的數據結構存儲交易數據,能夠在的時間復雜度驗證一個交易不存在。 本文首發于深入淺出區塊鏈社區原文鏈接:深入理解Plasma(四)Plasma Cash原文已更新,請讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴容框架 Plasma,介紹其基本運行原理,具...
摘要:合約會處理由子鏈提交的區塊,并且將區塊的哈希值存在主鏈上。負責處理所有子鏈上發生的交易,將其打包成區塊存儲在子鏈上,并且周期性地向合約提交區塊,將子鏈上的狀態區塊的哈希值提交到主鏈共識。 本文首發于深入淺出區塊鏈社區原文鏈接:深入理解Plasma(三)Plasma MVP原文已更新,請讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴容框架 Plasma,介紹其基本運行原理,具體操作細...
摘要:合約會處理由子鏈提交的區塊,并且將區塊的哈希值存在主鏈上。負責處理所有子鏈上發生的交易,將其打包成區塊存儲在子鏈上,并且周期性地向合約提交區塊,將子鏈上的狀態區塊的哈希值提交到主鏈共識。 本文首發于深入淺出區塊鏈社區原文鏈接:深入理解Plasma(三)Plasma MVP原文已更新,請讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴容框架 Plasma,介紹其基本運行原理,具體操作細...
閱讀 1148·2021-11-24 10:43
閱讀 3102·2021-11-22 09:34
閱讀 3549·2021-10-08 10:04
閱讀 3932·2021-09-23 11:58
閱讀 3115·2019-08-30 15:44
閱讀 483·2019-08-30 13:01
閱讀 1155·2019-08-28 18:07
閱讀 1448·2019-08-26 13:42