Ethereum Plasma MVP and Plasma Cash


Vitalik大約在一年前(2017/08)提出了Plasma這個概念以解決Ethereum交易速度及成本的問題,不過提出的內容太概念性,沒什麼人知道該怎麼實作,在今年初Vitalik提出了Plasma MVP(Minimal Viable Plasma),最小可行性的Plasma,而目前大家也是遵循這個規範來實作。

Plasma屬於layer 2的solution,就是在主鏈之外做運作(也就是離線交易)。Plasma簡單來說就是鏈中鏈,每個鏈都可以有自己的鏈,自己的鏈還可以再有鏈,就像是tree一樣的概念。舉例來說,往後交易所就可以創造自己的鏈,在自己鏈內交易,速度快而且無手續費。而目前MVP的設計是在主鏈外多一層而已,還沒有多層的概念。上個月的COSCUP有Ethereum Foundation負責Plasma的開發者的分享,影片連結在這(是中文,大家不用害怕 XD)。

  • Plasma MVP
在每個Plasma chain會有一個operator,operator負責產塊(可以想像是中心化的管理者),以目前來說,operator實作成Restful API server,而產塊可以想作是在DB insert一筆紀錄,跟我們以往中心化的系統一樣。而你要進入到這個Plasma chain需要先在主鏈上的smart contract作存款(deposit)才能進入。然後Plasma chain每產一個塊,就必須跟主鏈作回報(回報Merkle root),這樣Plasma chain這邊的塊才算被confirm。每個Plasma chain是獨立的,所以不能跨鏈交易,必須先轉回到主鏈。


可以這樣想像,一個Plasma chain是一間賭場,你要進入一間賭場要先去把新台幣換成賭場的籌碼(deposit),接著你就可以在這間賭場做任何交易,那如果你要去隔壁賭場下注呢? 你要先換成新台幣,然後再換成隔壁賭場的籌碼。而在賭場的每一筆交易,都會被記載在賭場的帳本上(可以想像是Excel表格),而這個帳本要定期地跟政府報備,報備通過了,在帳本上的交易紀錄,才會被承認。Plasma chain的概念大概就像這樣。

那安全問題呢? operator是中央式的,如果被攻擊或是原本就是惡意的呢?接續上面的例子,其實要把籌碼換成新台幣,沒有這麼簡單。首先,要七天後才能領出,這段期間就是挑戰期,在這段期間內,如果有人提出你在賭場內造假的證據,提交到法院(也就是主鏈)並被且被法院認證是造假,那你的錢就不能提領了。
接著回到,如果operator跟某個帳號串通,假造balance的數目怎麼辦勒?Plasma會依照transaction的順序處理,從最舊的到最新的逐一驗證。舉例來說,
     1.) A存了5塊存進賭場(A: 5顆籌碼)
     2.) B存了20塊進入賭場(B: 20顆籌碼)(此時賭場共有25顆籌碼)
     3.) 接著B給A 3顆籌碼(A:8, B:17),
     4.) operator從桌底下偷偷拿拿自己帶的1000顆籌碼給了C
這個時候,大家發現賭場詐賭,就會開始想跑,把籌碼換回新台幣,這個時候就會照1,2,3,4順序來驗證交易,驗證到到第3步,A有8塊可以提領,B有17塊可以提領,AB領完後,賭場就沒錢了,所以C想領假造的1000塊也沒錢可以領了。更細節的部分,可以參考Karl.tech 對於Plasma的介紹

  • Plasma Cash
簡單來說,Plasma Cash做了兩個修改
1.) 每一筆存入Plasma contract的錢,都給一個unique token ID
2.) Merkle tree的index存token ID內容存這個token ID的交易紀錄

這樣有什麼好處呢? 你每一筆存入的錢都有一個ID,可以想作是進了Plasma chain,你的Eth就變成了ERC20 token,所以當有人要偷錢的時候,就必須一個一個token的偷,對惡意的攻擊者來說,變得很不方便。不過相對的壞處就是,你存進去兩筆錢,要分開來用,不能合併一起,比較不方便。第二點,可以想像成,你的token有一個自己的帳戶,所有的交易都在這個帳戶裡,要找紀錄, 證明交易都很方便,重點是尋找起來很快速,只要是關於這個token的交易但不在這個帳戶的,都是無效的。

但是每一筆錢都有一個ID,可想像的是Merkle tree會長得很大,Ethereum Research上有個簡單的算數
Assuming we have a (very) small Plasma Cash chain with only 2^16 (= 65536) coins, then the Merkle proof of either existence or non-existence for a given coin will be at least 32 bytes * 16 siblings = 512 bytes per block. If we assume that Plasma block is created once every 15 seconds, then we’ll end up with 31557600 / 15 = 2103840 blocks per year. 2103840 blocks per year * 512 bytes per block = 1077166080 bytes per year = ~1.077 gigabytes per year. 1 gigabyte per coin, per year!  
source: https://ethresear.ch/t/plasma-xt-plasma-cash-with-much-less-per-user-data-checking/1926

簡單來說,就是65536種token(也就是63356次存款),每年大概會多1GB的資料量。如果Plasma 被大量使用,這個量會相當驚人。後來又有提出Plasma XT,是基於Plasma Cash之上做改進。資料會這麼大,是為了要有歷史紀錄作為查證,而Plasma XT提出了check point的概念,定期做驗證,也就不需要全部歷史紀錄了。

Check point的概念聽起來很簡單,就定期檢查就好,但是operator並不是實際的一個鏈,只是一個api server,所以假如operator不提供交易紀錄只提供Merkle root那使用者要怎麼確認? 假使有方法可以確認了,那token數量這麼多,大家都同時確認,是不是會超過gas limit的上限? 目前解決方案,第一個問題,就是用使用者的簽名驗證,如果operator擅自在某個check point finalize你的狀態,那你就很容易地知道這個operator作弊,因為你沒有在這個check point簽名過。第二個問題使用了checkpoint zone,也就是每個token ID有一個時間做驗證,例如0-99做N block做驗證,100-199在N+1 block驗證...以此類推,解決了一次太大量的問題。

Plasma的介紹大概就到這,若有錯誤歡迎指正!說不清楚的部分,也歡迎提問!

留言

  1. 感謝你的講解~~ 希望能有更深技術層面的探討~~

    回覆刪除
    回覆
    1. 謝謝你的回饋,我文章的定位比較是科普的程度,算是給有興趣的人的入門,如果有更深入的,其實可以直接看https://ethresear.ch,或是歡迎提出問題或是疑問,我們可以一起討論

      刪除
  2. MVP有点难理解,但是你写的很通俗易懂,感谢 :P

    回覆刪除

張貼留言

這個網誌中的熱門文章

瑞士滑雪分享2 - 策馬特

瑞士滑雪分享1 - 少女峰

東京藍帶 - 料理中文密集班Q&A