Layer2 | Plasma 框架

在上一篇文章中,咱們介紹瞭解決擴展性問題的第一個 Layer2  解決方案,即狀態通道。接下來,本篇將會爲你們揭開另外一個稱爲 Plasma 的鏈下交易技術,而該技術則是由 Vitalik Buterin 和 Joseph Poon 在 2017 年,含金量十足。算法

Plasma

Plasma 是一個鏈下交易的技術,由 Vitalik Buterin 和 Joseph Poon 在 2017 年提出,它至關於貢獻了一條子鏈,可讓你在主鏈上質押資產,而後在子鏈上產生資產,並且它提供一個服務器,不須要點對點的交互,在服務器上就能夠進行交互。

Plasma 子鏈能夠更快地操做,且交易費用更低,由於它的操做不須要在整個以太坊區塊鏈存留副本

它的基本流程和狀態流程也比較類似。
安全

  • 主鏈上抵押資產
  • 在子鏈上交易
  • 提現退出

不過狀態通道更多的是針對你想交易的那幾個點,是兩我的之間的交互,而它想要在一個大的庫裏面進行復雜的操做是一個很困難的事情。而 Plasma 能夠在子鏈上進行各類形式的交易,調動智能合約,轉帳給多我的等等,很是靈活,不像 State Channel 同樣,只有打開通道的人能用,任何人均可以隨時進來。

Plasma 是一個大的框架,細分有好幾種不一樣的實現方式。

首先,讓我來詳細介紹一下整個過程,來幫助你理解 Plasma 的整個框架,以下圖所示。

服務器



咱們在以太坊上建立一套智能合約,做爲 Plasma 的 Root Chain,而 Root Chain 包含了子鏈的狀態交易規則,記錄子鏈的哈希值,而且其做爲一個橋樑,讓用戶在以太坊主鏈和子鏈之間轉移資產。

而後咱們建立子鏈,子鏈能夠擁有它們本身的共識算法,假設這裏咱們使用 POA ( Proof of authority )共識機制。

這個是一個依賴可信區塊生產者的共識機制,每一個驗證者都必須都是經過身份驗證的可信人。打個簡單的比方,之前交易須要一羣互不認識的人來比拼算力,艱難計算一道複雜的數學題,可是如今咱們有一個可信的人作擔保,因此即可以快速經過交易,要是這我的使壞,其餘的人能夠把他踢出網絡。

假設遊戲公司是惟一一個建立區塊的實體,這個實體運行着幾個節點,而這些節點被看成子鏈的塊生產者。

而子鏈一旦建立開始工做,塊生產者將按期向根合同作出聲明,這個將被記錄在 Plasma 的鏈上,做爲子鏈發生計算的證據。而用戶要玩遊戲的時候,他們得先在主鏈上抵押資產得到在子鏈上的資產,而後在子鏈上交互。由於不須要與主鏈交互,並且只有少數幾個節點必須處理交易,因此交易費會很低,並且操做會很快。咱們結束遊戲以後,能夠選擇提現退出。

下面我將經過幾個問題,幫你更加深刻理解 Plasma 的細節,包括週期性提交和安全退出機制。

當你在子鏈上宣佈要退出,你有 100 個以太要提現時,因爲主鏈不必定知道子鏈的狀況,它是不能相信你擁有這筆資產的。此時你就得提交證實,像默克爾樹證實,而默克爾樹證實是要證實到一個默克爾樹的根哈希的,你也得證實你上傳的根哈希是真實的。

這個就要求 Plasma 的子鏈週期性的把它的狀態(默克爾數的根哈希) Commit 到主鏈上,讓主鏈清楚子鏈根哈希的狀態。這就是週期性提交

不過這樣會存在問題。

若是記帳節點放出來的信息是假的呢,他提交的根哈希和這條鏈實際產生的根哈希是不對應的,由於主鏈其實也不清楚,這個時候怎麼辦?

咱們就須要提供一個數學證實,證實它在同一個區塊高度簽名的數據都是同樣的,比方說 Validator 若是在這個區塊高度發出的信息是 A ,而 Commit 到主鏈上的區塊信息是 B ,我能經過這種數學形式發現記帳節點是做惡了的,這樣就能夠罰沒它主鏈上的押金。

可是若是子鏈壓根就不公佈區塊信息,這樣就沒有做惡證實提交到主鏈上,這個時候怎麼辦?

這個時候 Plasma 提供了一種 Safe Exit 的機制。

每個在子鏈上的節點,若是意識到子鏈有可能做惡,並且他本身沒辦法證實子鏈做惡的時候,這個機制可以容許參與者退出。參與者提交他最後的一個的可信證實,有多少餘額,就把這個餘額提現到主鏈上,保證資金的安全

這個是 Plasma 的核心理念,Plasma 不會爲了速度犧牲安全。你能夠在子鏈上自由交易,而且在子鏈做惡以前,把幣提走。
網絡

MVP ( Minimal Viable Plasma )

這個是 Plasma 最小實現,它採了取一條 UTXO-Based 的鏈做爲子鏈,因爲它須要子鏈不是機率確認的鏈,因此它通常採用的是 PoA 共識算法(或者 BFT)

全部的 Plasma 的核心都是在退出和挑戰的機制上,咱們這裏也着重強調一下它的退出和挑戰機制。框架


咱們從圖能夠很清楚的看到,用戶在主鏈上抵押了 Fungible Token 以後,在子鏈上得到了未花費的 UTXO。

假設這個用戶花費掉了這筆 UTXO,分紅了四筆輸出,而後決定要退出,要把這個錢提交到主鏈上,發起了一個 Start Exit。 同時他提交我擁有這個 UTXO 的證實,這個證實在默克爾樹的根哈希中,這個是由記帳節點按期的 Commit 到主鏈上的。這兩個數值就能夠證實這個用戶擁有這個 UTXO。

可是這樣就須要一個 Challenge 的過程,由於用戶提交的證實只能保證他在當前的區塊是擁有這個 UTXO 的,它並不能保證用戶以後不會花費這個 UTXO。

因此這裏有一個比較長的挑戰期( Challenge Period),即必定的出塊時間,讓別人去提交他做惡的證實 。假設用戶在發起提現以後又給一我的轉了一筆帳,那麼挑戰者是能夠將這個轉帳交易記錄和這個默克爾樹哈希發送到主鏈上來證實用戶 Exit 是無效的,以此來罰沒用戶在主鏈上的押金,這個時候挑戰者就能夠拿到這筆押金。

這裏咱們細化談談它的做惡和退出機制。若是如今有一個密碼學證實,證實這個東西屬於張三。由於這個交易打包在區塊裏,這個區塊的默克爾樹哈希放在這個主鏈上。

可是若是一條線都是做惡的,出塊節點是做惡的,出塊節點作一個假的交易,作了一個假的區塊和一個假的默克爾樹哈希,放到了根鏈上,這個時候根鏈實際是沒法判斷的,若是我不把這個區塊公佈出來,它是不知道我做惡的證據的。

這個時候用戶若是須要退出,怎麼才能保證用戶可以正常退出呢?假設我做爲一個做惡節點,知道大家要退出,我能夠先生成一批金額特別大的交易,優先大家退出,假設你要提現 100 個以太,我就能夠僞造一個 101 以太的提現交易,這個等於說拿着你的錢就跑了。

所以 MVP 設置了一個優先級的設計。每一筆進入 Plasma 的交易都會有一個優先的序號,高位是區塊高度,而後是交易在區塊裏面的次序和這個 Output UTXO 在這個交易中的次序。這樣就造成了一個全局惟一的序號,全部人按照這個序號退出。

若是某一個時刻你們開始發現節點開始做惡,要退出,必定是早期交易的區塊先退出,後期做惡的區塊後退出,我做惡區塊的意義不大。

可是這裏還有一種做惡的方法。

若是誠實的交易被礦工打包到了做惡交易的後面,由於礦工是能夠選擇打包次序的。在這個錯誤的塊裏面,誠實的交易打包到錯誤的交易後面,致使誠實交易的退出優先級低於做惡交易的優先級。

1 個大戶把 1000 個以太打入到 Plasma 鏈上,做惡礦工在存入的這個區塊裏優先造了一個假交易,而後放到區塊裏面,先把 1000個 以太提走了,大戶是沒有辦法的

這裏的解決辦法是對每一個存款( Deposit )都作二次確認,第一次是存進去,確認這筆交易被打包在 Plasma 的區塊裏,第二次是在用戶把幣存進去,確認存進去的區塊以及以前的區塊都是真實、合法的狀況下,再發一筆交易,去確認這個交易是正確的。

在作了兩次確認,證實交易都是真實以後,用戶再去退出就可以安全退出了。
post

More Viable PlasmA

不過 MVP 每一筆存儲交易多了一次簽名以後,對系統來講仍是開銷很大的,因此有人提出了 More Viable Plasma。

它退出的次序不是以打包的次序爲準,而是以退出的時候提交的 UTXO 的證據,UTXO 輸入最先的一個 Input( Input 可能有四五個),哪一個早就哪一個先退出。

這個的好處在於,早的 Input 必定是已經被打包到交易區塊裏面了,若是這個 Input 是假的,那麼在 Input 發生的那一刻就已經有人開始作退出了,這個是不可能的。

所以這個時候我能夠假設這個 Input 是真實的,越早的 Input 它的真實性就越高,我退出的時候就按照 Youngest 的 Input 退出,它的保障性最高, 這個是 More VP。
區塊鏈

Plasma Cash

Plasma 還有一個實現叫作 Plasma Cash。

MVP 的缺點是,每個人,不光是礦工,都要時刻緊盯着這條鏈,若是有人做惡,就趕忙退出。並且一旦出現問題,退出還須要提供相應的數學證實。數學證實還得從本地同步的區塊中獲取,由於別人同步的可能都是假的,這就要求你還要同步區塊。

這一系列的過程對用戶是很不友好的。這個時候有人就提出了 Plasma Cash,它最大的特色是用戶只須要關注本身的數據就行了。

它採用的是 Non-Fungible Token 的存儲機制,它的 Deposit 進來以後是不分割的,每一筆存款,比方說 1號是 10 個以太,2 號是一隻貓,它們被打包成一個 Non-Fungible Token 放進來,系統給每個打包的包裹一個序號,如圖所示,這個系統如今是有八個存款,每個存款都是一個包裹。

設計



假設三號包裹原來的持有人是 A,他把這個包裹轉給了 B,在這個區塊裏,它就包含了一個 A 到 B 的交易來指向三號包裹,六號包裹是 D 到 B,把全部權轉向了 B,剩下的包裹沒有動做。

而用戶只須要關心和本身有關的數據,像圖中的 A ,他只須要關注 3 號和 5 號包裹,不須要關注其餘人,由於全部人的錢是自成體系的,不是像 Fungible Token 捆在一塊兒的,因此像 六、七、8 該退就退,由於不是 A 的東西。

不過這裏有一個問題,好比說 Bob 擁有 7 號包裹,要轉給 A,可是因爲 A以前沒有和 7 號包裹交易,他只關注本身,他是不瞭解 7 的歷史的,因此Bob 給 A 轉帳的時候其實 A 是不肯定對方是否擁有 7 號包裹的全部權的。

而 Bob 要證實擁有 7 號包裹的全部權,就必須把 7 號資產從創生到如今全部的資產、每個默克爾樹和默克爾樹哈希都給 A,來證實這個塊是真實屬於 Bob 的。

因此 Plasma Cash 轉帳的時候數據量是很大的。

Plasma Cash 要求退出的時候,須要把最後關於這個 Token 的兩筆交易上傳,比方說 A 轉給 B,B轉給 G,而G要退出,那麼 G 就把這兩筆交易提交到子鏈上退出,退出其實不復雜,複雜的是 Challenge,其 Challenge 主要有三種。
cdn

  • 假設 A 退出以後又花費了資產

A 提出申請以後又把這個錢轉給了別人,這個時候 Challenger 能夠把這個這個交易提交給主鏈,讓 A 退出失敗
blog

  • 雙花交易

A 和礦工串通同時轉給 G 和 F,Challenger 能夠採起和 1 相同的方式,讓 A 失敗。

  • 歷史的證實

由於退出的時候只提供最後的兩筆交易,而它們可能都是假的,這個時候 Challenger 能夠任意指定一個塊,要求對方證實是怎麼到這個狀態的,以保證系統安全性。

Plasma Cash 的挑戰很複雜,轉帳證實也很複雜,優勢是無需關心別人的狀態,只須要關心本身。

Plasma Debt

Plasma Debt 和 Plasma Cash 比較像,轉帳、證實和挑戰都很相似,其區別是 Plasma Cash 裏每個包是一個 Non—Fungible 的資產,而在 Debt 裏每個包是一個狀態通道,這意味着和狀態通道的交互能夠不按整個包來交互。

好比說我有 100 個以太,在 Plasma Cash 中,這 100 個以太我只能一塊兒轉給張三或者一塊兒轉給李四,可是在 Debt 裏面,這100個以太,我能夠轉一部分給張三,轉一部分給李四,不用全轉。

每個 Token 都是使用者和 Plasma 鏈的運營者的一個小型狀態通道,這個狀態通道也能夠按照 Plasma Cash 的方式進行流轉,這樣可讓用戶能夠不須要把資產當成 Non-Fungible Token,還能夠進行比較高效的運轉。

不過狀態通道按照 Cash 方式進行流轉仍是會和 Cash 面臨同樣的問題,轉帳證實很複雜,由於它依舊須要全部的歷史交易。

Plasma Leap

Plasma Leap 是在 MVP 的基礎上作的,MVP 是一個相似比特幣的一個 UXTO 鏈,在比特幣裏面是有一個解鎖腳原本作智能合約的,Plasma Leap 就把這種相似比特幣的智能合約的理念帶到了 Plasma 裏,引入了 P2SH 加鎖腳本,對於存儲結構進行了提高。

在每個交易裏面是能夠加一個 EVM 的二進制代碼做解鎖腳本的,這個代碼是對應一個智能合約,由智能合約來進行解鎖。

不過這個智能合約不像以太坊上的智能合約,那麼完整完善,它作的事情很簡單,就是證實用戶能不能花費這個 UTXO,就像比特幣同樣,用戶能不能花費它,何時花費它,它不能作更復雜的智能合約。


延伸閱讀:

Layer2 | 狀態通道 State Channel

Layer2 | Plasma 框架

Layer2 | 鏈下計算

Layer2 | 鏈間通訊

相關文章
相關標籤/搜索