極簡 Plasma MVP 和 Plasma Cash 介紹

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

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 是獨立的,因此不能跨鏈交易,必須先轉回到主鏈。api

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

接着回到,若是 operator 跟某個帳號串通,假造 balance 的數目怎麼辦勒?Plasma 會依照 transaction 的順序處理,從最舊的到最新的逐一驗證。舉例來講,less

  1. A存了5塊存進賭場(A: 5顆籌碼)post

  2. B存了20塊進入賭場(B: 20顆籌碼)(此時賭場共有25顆籌碼)設計

  3. 接着B給 A 3顆籌碼(A: 8顆, B:17顆),cdn

  4. operator 從桌底下偷偷拿拿本身帶的 1000 顆籌碼給了Cserver

這個時候,你們發現賭場詐賭,就會開始想離開,把籌碼換回新臺幣,這個時候就會照 1,2,3,4 順序來驗證交易,驗證到到第 3 步,A 有 8 塊能夠提領,B 有 17 塊能夠提領,AB領完後,賭場就沒錢了,因此 C 想領假造的 1000 塊也沒錢能夠領了。更細節的部分,能夠參考 Karl.tech 對於 Plasma 的介紹htm

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: ethresear.ch/t/plasma-xt…

簡單來講,就是 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 驗證…以此類推,解決了一次太大量的問題。

原文連接: kimiwublog.blogspot.com/2018/09/eth…

做者: Kimi Wu

稿源:以太坊愛好者(ethfans.org/posts/simpl…

相關文章
相關標籤/搜索