![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5iZ0Y2NmFTNlBDMykzM2QWMyYjZjVDZlFzNyMmY1MDO5M2Mm9CX0VmbjN3bvwFdl5mLh5WaoN2cv5yZtl2Yz92Lc9CX6MHc0RHaiojIsJye.jpg)
在上一篇文章中,我們介紹了解決擴充性問題的第一個 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 的區塊裡,第二次是在使用者把币存進去,确認存進去的區塊以及之前的區塊都是真實、合法的情況下,再發一筆交易,去确認這個交易是正确的。
在做了兩次确認,證明交易都是真實之後,使用者再去退出就能夠安全退出了。
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 捆在一起的,是以像 6、7、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 主要有三種。
- 假設 A 退出之後又花費了資産
A 提出申請之後又把這個錢轉給了别人,這個時候 Challenger 可以把這個這個交易送出給主鍊,讓 A 退出失敗
- 雙花交易
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 | 區塊鍊發展新思潮
Layer2 | 狀态通道 State Channel
Layer2 | Plasma 架構
Layer2 | 鍊下計算
Layer2 | 鍊間通信
轉載于:https://my.oschina.net/u/3919161/blog/2992528