深刻理解Plasma(二)Plasma 細節

本文首發於深刻淺出區塊鏈社區 原文連接:深刻理解Plasma(二)Plasma 細節原文已更新,請讀者前往原文閱讀git

這一系列文章將圍繞以太坊的二層擴容框架,介紹其基本運行原理,具體操做細節,安全性討論以及將來研究方向等。本篇文章主要對 Plasma 一些關鍵操做的細節進行剖析。github

上一篇文章中咱們已經理解了什麼是 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]]框架

<img src="https://raw.githubusercontent.com/gitferry/mastering-ethereum/master/Plasma-in-depth/images/Deposit.png" width="400" height="360" alt="Blockchains of Blockchain" />ide

當用戶看到子鏈上本身以前存款的交易被確認後,就能夠在子鏈上使用這筆資產(給子鏈上的其餘用戶發送交易或者退出子鏈等)。函數

狀態確認(State Commitment)

當大部分都轉移到鏈下進行時,須要某種機制確保鏈下狀態的更新獲得確認,這樣才能保證當有惡意行爲發生時,主鏈能夠保證用戶不會受到損失。這就是爲何須要狀態確認(State Commitment),即子鏈週期性地將狀態更新狀況提交到主鏈進行共識。學習

然而,將子鏈中的全部交易都同步到主鏈顯然違反了 Plasma 的初衷,在 Plasma 中,實際向主鏈提交的是 Merkle Tree 的根哈希。所以子鏈中的實際交易狀況被隱藏,在主鏈上只能看到子鏈區塊的哈希值。區塊鏈

當有惡意行爲發生時,子鏈網絡中的全部用戶均可以向主鏈提交防僞證實,證實成立後,含有惡意交易的區塊將被回滾。優化

防僞證實(Fraud Proof)

Plasma 的一個關鍵設計之一就是容許用戶構造防僞證實(Fraud Proof)。防僞證實的意義在於只要發佈區塊的節點構造了含有惡意交易的區塊,那麼就要承擔被懲罰的風險。每當新的區塊被提交到主鏈上時,會留出一段時間給用戶提交防僞證實,若是在這段時間內沒有證實被提交,則認爲新的區塊被驗證合法。若是有防僞證實檢測到區塊中存在惡意交易,則該區塊將被捨棄,回滾到上一個被驗證合法的區塊。Plasma 中的防僞證實主要有如下(但不限於)幾種:

  • 資產可花費證實
  • 交易簽名有效性證實
  • 存取款證實

至於每種防僞證實的具體形式,則依賴於實際 Plasma 應用的實現細則。

以下圖所示(來源自[1]),子鏈中每一個節點都存有 1-4 個區塊的數據。假設區塊 1-3 已經被驗證合法,而區塊 4 中存在惡意交易,那麼每一個節點均可以使用 1-4 個區塊中的數據構造防僞證實提交到主鏈,主鏈驗證後將子鏈中的狀態回滾到區塊 1-3。

防僞證實還可使用零知識證實(zk-SNARKs 或者 STARKs)來構造,但因爲目前經過零知識證實生成證實的時間和空間還有待優化,目前設計的 Plasma 並不依賴零知識證實。零知識證實在 Plasma 中的應用是一個頗有前景的研究方向,感興趣的讀者能夠參考以太坊研究團隊關於這方面的研究[2])。

取款(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] 來介紹快速取款是如何實現的。

爲了實現快速取款,取款方和 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]

當子鏈中有拜占庭行爲發生時,用戶之間能夠共同協做執行批量取款。這時會有一個節點扮演取款處理人(Exit Processor)的角色,簡稱爲 EP,負責當前某個批量操做(能夠同時有多個批量取款操做發生,但同一個取款申請不能存在於多個批量取款),而且能夠收取服務費做爲報酬。EP 將構造一個位圖(bitmap,即一串0/1)記錄哪些資產要執行取款。以後 EP 將利用現有的區塊數據檢查每一個取款是否合法,以後將構造一個批量退出初始化交易(Mass Exit Initiation Transaction,MEIT),並將其發送到主鏈上。在 MEIT 被主鏈確認以前,每一個用戶均可以對這個交易提出異議。當爭議期結束,MEIT 被主鏈確認,批量取款成功。

總結

本文主要對 Plasma 框架中一些關鍵操做進行了比較詳細的介紹,但若是不依託於某個實際的 Plasma 項目,對一些細節仍是很難理解。所以在後面的文章中將會介紹 Plasma MVP 以及 Plasma Cash。

相關資源

  1. https://plasma.io/
  2. https://ethresear.ch/t/plasma-is-plasma/2195
  3. https://ethresear.ch/t/simple-fast-withdrawals/2128
  4. https://ethresear.ch/t/basic-mass-exits-for-plasma-mvp/3316

本文的做者是蓋蓋,他的公衆號: chainlab

深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。

相關文章
相關標籤/搜索