1. 程式人生 > >Plasma MVP完全解析

Plasma MVP完全解析

1.什麼是Plasma?

眾所周知,目前的主流區塊鏈系統普遍存在可擴充套件性(Scalability)問題。解決該問題一般有下面兩種思路:

  • Layer1技術:直接修改底層區塊鏈,比如修改區塊大小和結構(2MB區塊/SegWit等)、修改共識機制(PoS/DPos/PBFT等)、分片(Sharding)等方案

  • Layer2技術:在底層區塊鏈之上構造新的交易環境,分擔主鏈的負載,代表方案包括狀態通道和各種側鏈子鏈技術。Layer2技術基於以下假設:並非每個人都需要知道網路上發生的每一筆交易。事實上,主鏈只需要記錄交易的最終結果,交易的過程可以在更高效更經濟的交易環境中完成。

Plasma屬於Layer2技術中的一種,即側鏈(sidechain)技術。具體來說,就是在主鏈上鎖定一部分資產,然後在側鏈上建立新資產,後續交易都在側鏈上完成。當用戶退出側鏈時,銷燬側鏈上的資產,然後在主鏈上解鎖剩餘的資產。

那麼由誰來建立新資產呢?共識機制。當然,側鏈一般會選擇效率更高的共識演算法,比如PBFT/PoS/DPoS等。根據不可能三角法則,在可擴充套件性提高的同時,去中心化和安全性必然會出現一定程度的削弱。因此,Plasma需要解決一個重要的問題:在側鏈安全性無法保證時,所有人都可以安全地回退(fallback)的主鏈上

為了實現以上目標,Plasma框架包含以下三個主要組成部分:

  • 鏈下執行:即在主鏈之外執行交易

  • 狀態提交:側鏈狀態的壓縮版本(即交易的Merkle根),需要提交到主鏈上

  • 退出機制:使用者通過提供憑證(Merkle proof),可以隨時、安全地退出側鏈

2.Plasma MVP

MVP即Minimal Viable Plasma,是Plasma的一個最小實現版本。

Plasma MVP基於UTXO模型,只支援轉賬,不支援指令碼或智慧合約的執行。側鏈共識機制採用POA(Proof-of-Authority),依賴一個被稱為operator的節點生產側鏈區塊,然後把側鏈狀態提交到主鏈上。使用者首先通過主鏈的智慧合約充值,之後就可以完全在側鏈上交易了,如果想要提現或者側鏈出現安全性問題,使用者可以向主鏈智慧合約發起退出申請。

2.1充值(deposit)

目前只支援ETH充值,後續會支援ERC20代幣。
在這裡插入圖片描述
首先使用者(紫色)向主鏈智慧合約發起一個deposit呼叫,交易執行後會產生一個DepositCreated的event。Operator(紅色)監測到這個event後,建立一個只包含一筆交易的區塊,為使用者建立側鏈資產。側鏈上的交易由兩個輸入UTXO和兩個輸出UTXO組成,在充值情況下,只有第一個輸出有值,其他都為0。

隨後,operator把該區塊的Merkle根提交到主鏈智慧合約,合約會發送BlockSubmitted的event。使用者可以監聽到這個event,並驗證其有效性。

2.2退出(exit)

如果使用者想要把側鏈資產重新轉回主鏈,則需要啟動退出流程。
在這裡插入圖片描述
使用者(紅色)向主鏈智慧合約發起一個startExit呼叫,同時提供一筆保證金(EXIT_BOND)。

合約會把該請求放入一個優先佇列中,優先順序等於區塊高度 * 1000000000 + 區塊中交易index * 10000 + 交易中UTXO的index。這樣設計的目的是保證出現非法交易時,之前的所有合法UTXO都可以安全退出。

退出請求需要等待一段時間才能生效,可以理解為“公示”。等待時間長度等於Max(UTXO建立時間+2 weeks,當前區塊時間+1 week),也就是說,最快7天、最慢14天可以完成提現操作。

那麼發起退出呼叫需要提供哪些材料呢?我們看一下startExit()的函式原型:

    function startExit(
        uint256 _utxoPos,
        bytes _txBytes,
        bytes _proof,
        bytes _sigs
    )
  • _utxoPos:UTXO的具體位置,以“blknum * 1000000000 + txIndex * 10000 + oIndex”的形式傳遞進來
  • _txBytes:UTXO對應的原始交易資料(RLP編碼),用於和merkle proof一起驗證該交易是否存在於區塊中
  • _proof:即merkle proof,算出原始交易的雜湊值後,可以通過merkle proof算出區塊的Merkle根,驗證該筆交易的合法性
  • _sigs:包含兩個簽名:交易簽名和確認簽名,用於確認使用者是否有權提取該UTXO(確認簽名後面會講到)

關於merkle proof,不熟悉的同學可以看下面這張圖,如果我想確認左下角綠色的交易是否存在於區塊中,只需要提供兩個紅色的雜湊值作為merkle proof就可以了:
在這裡插入圖片描述
最後,當等待期結束後,使用者可以向主鏈智慧合約發起一個finalizeExit呼叫,把資金連同EXIT_BOND真正轉入主鏈賬號中。

2.3挑戰退出(challengeExit)

如果使用者發現,有人給他轉了一筆錢,但是又發起了退出申請想把這筆錢提走,那就必須阻止他,這被稱為challengeExit。
在這裡插入圖片描述
之前提到,提現會有7~14天的等待期,就是為了讓使用者有足夠的時間發起挑戰。如果挑戰成功,則把退出請求從優先佇列中刪除,同時把EXIT_BOND作為獎勵轉給發起挑戰的使用者。挑戰退出需要提供的材料參見以下函式原型:

    function challengeExit(
        uint256 _cUtxoPos,
        uint256 _eUtxoIndex,
        bytes _txBytes,
        bytes _proof,
        bytes _sigs,
        bytes _confirmationSig
    )

其中_cUtxoPos代表發起挑戰的UTXO的位置,_eUtxoIndex代表被挑戰的UTXO是交易中的第幾個輸入。

2.4抵禦“扣塊攻擊”

“扣塊攻擊“,即Block Withholding Attack,指的是operator生成區塊後不廣播給其他使用者,同時把該區塊的Merkle根提交到主鏈上。這樣就造成了資訊不對稱:如果operator先偽造一筆交易把UTXO轉給自己,然後把你消費這筆UTXO的交易放在後面,一起打包進區塊(不廣播)。在這之後,operator向主鏈申請提現,使用者無法對他發起挑戰,因為無法提供需要的材料。當然,使用者也可以向主鏈申請提現這筆UTXO,但是operator可以出示被扣留塊中你的交易簽名,對你發起挑戰,導致你提現失敗。

為了抵禦這種攻擊,MVP增加了一個確認簽名(Confirmation Signature)的設計:
在這裡插入圖片描述
舉個例子:使用者A(紫色)在側鏈上給使用者B(黃色)發了一筆轉賬交易,此時他會對該交易進行簽名。只有當用戶A確認該筆交易已經被包含在一個合法區塊中(即他收到了這個塊),並且operator也已經把Merkle根提交到主鏈上了以後,才會給使用者B傳送一個確認簽名。之前提到過,使用者發起退出申請時必須提供確認簽名信息,所以如果發生扣塊攻擊,operator將無法得到使用者的確認簽名,也就無法成功提現。

另外有一個叫More Viable Plasma的專案據說可以不需要確認簽名,使用“youngest input”優先順序保證安全性,有時間再研究研究。

3.總結

Plasma是一個側鏈擴容框架,屬於一種Layer2技術。Plasma MVP是Plasma的一個最小實現,基於UTXO模型,使用者可以通過主鏈智慧合約充值到側鏈,在需要提現或者側鏈出現安全問題時通過“exit/challenge”機制安全退出側鏈。為了抵禦扣塊攻擊,採用了雙簽名設計,確保了側鏈資料的可見性(data availability)。

參考:

https://github.com/omisego/plasma-mvp/

https://ethresear.ch/t/minimal-viable-plasma/426

https://www.learnplasma.org/en/learn/mvp.html

https://www.learnplasma.org/en/resources/#plasma-mvp-specification

更多文章歡迎關注“鑫鑫點燈”專欄:https://blog.csdn.net/turkeycock
或關注飛久微信公眾號:
在這裡插入圖片描述