極簡 Plasma MVP 和 Plasma Cash 介紹


極簡 Plasma MVP 和 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 的開發者的分享,影片鏈接在此(是中文,大家不用害怕 : ) )。

Plasma MVP

在每個Plasma chain 會有一個 operator,operator 負責產塊(可以想象是中心化的管理者),以目前來說,operator 實作成 Restful API server,而產塊可以想作是在數據庫 insert 一筆紀錄,跟我們以往中心化的系統一樣。而你要進入到這個 Plasma chain 需要先在主鏈上的 smart contract 作存款(deposit)才能進入。然後 Plasma chain 每產一個塊,就必須跟主鏈作回報(回報 Merkle

root),這樣 Plasma chain 這邊的塊才算被 confirm。每個 Plasma chain 是獨立的,所以不能跨鏈交易,必須先轉回到主鏈。


極簡 Plasma MVP 和 Plasma Cash 介紹


那安全問題呢? operator 是中央式的,如果被攻擊或是原本就是惡意的呢?接續上面的例子,其實要把籌碼換成新臺幣,沒有這麼簡單。首先,要七天後才能領出(取出),這段期間就是挑戰期(challenge period),在這段期間內,如果有人提出你在賭場內造假的證據,提交到法院(也就是主鏈)並被且被法院認證是造假,那你的錢就不能提領了。

接著回到,如果 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(專有的 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¹⁶ (= 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 有一個時間做驗證(即一次只驗證一部分 Token 的歷史),例如 ID 號為 0~99 的在 N block 做驗證,100~199 的在 N+1 block 驗證…以此類推,解決了一次太大量的問題。

原文鏈接: http://kimiwublog.blogspot.com/2018/09/ethereum-plasma-mvp-and-plasma-cash.html

稿源:以太坊愛好者(https://ethfans.org/posts/simplest-introduction-to-ethereum-plasma-mvp-and-plasma-cash)


分享到:


相關文章: