Plasma Cash 開發者指南(+如何使用 Loom 的 Plasma CLI)

買賣虛擬貨幣
Loom Network 正在構建一個基礎設施平臺,以幫助以太坊擴充套件達到真實世界用例,這是第一個正式上線的以太坊擴充套件解決方案。Loom 讓開發者透過部署到高吞吐量的以太坊側鏈來執行大型應用程式,同時保持乙太網主網的安全優勢。在之前的一篇文章裡,我們討論了使用轉移閘道器將資產從Loom轉移到以太坊主網。在本文中,我們將談談另一種實現方法:Plasma Cash。簡單地說,Plasma Cash 讓使用者可以將他們的數字資產從以太坊主網安全地轉移到側鏈,而無需信任側鏈。你轉移到側鏈的每個資產都會分配到一個唯一的序列號,並有它自己的事務歷史記錄。Loom 已經構建了一個名為 PlasmaChain 的共享側鏈,使用了轉移閘道器和 Plasma Cash 兩種功能。讓我們先快速回顧下轉移閘道器,然後看看 Plasma Cash 有何不同,最後再深入瞭解 Loom 最近釋出的 Plasma Cash 命令列介面。
回顧轉移閘道器轉移閘道器利用任意的 oracle 來在鏈之間轉移資產。也就是說,如果沒有人發起的話,鏈之間是不會發生互動的。Charlie 可以在以太坊主網上購買一張卡牌,然後將其存入以太坊主網的轉移閘道器合約。這會觸發 Oracle(伺服器)監聽該合約,以便在 PlasmaChain(或其他 Loom 側鏈)上為相應的資產發出所有權變更請求。然後Charlie就能去 PlasmaChain 上提取該資產了。這個代幣只能要麼在以太坊主網、要麼在 PlasmaChain 上“存在”。要在這兩個鏈之間移動,需要透過將所有權轉移到轉移閘道器合約來“銷燬”傳送鏈上的那個代幣。Plasma Cash 有何不同?Plasma Cash 的原理略有不同。 Loom 側鏈使用 Plasma Cash 定期向以太坊主網報告梅克爾證明(Merkle proofs)作為“檢查點”。
Plasma Cash 實現的工作原理是擁有一個存在於以太坊主網的以太坊 Plasma 合約(EPC)和一個同以太坊主網合約進行通訊的 Loom Plasma 合約(LPC)。使用者一開始有一個以太坊主網上的代幣。然後他們將其 Deposit(存入)EPC,它會發出一個事件。此事件由側鏈 oracle 接收,然後繼續用包含存入資產的單個事務在側鏈上建立一個區塊 — — 單個事務使“退出”(或提取)過程更容易。該事務將在 PlasmaChain上為使用者提供一個 Plasma Cash 代幣,代表其存入的資產。 使用者可以以任何方式在側鏈上自由地交易和使用該代幣,包括將其轉移給其他使用者。PlasmaChain 將透過提交每個區塊的梅克爾證明來定期檢查以太坊主網上的EPC,以驗證代幣所有權的變更。

梅克爾證明檢查點


Plasma Cash 鏈(實際上所有的區塊鏈)都使用名為梅克爾樹(Merkle Tree)的一個非常好的資料結構,來把有關事務的資料儲存在一個區塊中。在比特幣或以太坊的區塊中,可能存在無數的事務。 那麼我們如何驗證某個區塊中是否包含某個事務呢?想象一下,你想要顯示事務A在第500個區塊中。一種方法是讓每個人都儲存所有區塊的原始資料,然後轉到第500個區塊並讀取事務列表,直到找到匹配A的事務。然而,這需要大量的儲存資源來維護。

節約時間和空間


為了節約計算時間和儲存空間,對於每個區塊,我們還生成了該區塊事務的梅克爾根(Merkle Root)雜湊。這些雜湊被用來當作區塊的“概要”,並可用於驗證。
一顆梅克爾樹將事務一起進行雜湊來代表該區塊的梅克爾根  — — 一個固定長度的雜湊代表該區塊中的所有事務。

例如,這顆梅克爾樹由四個事務組成,從 A 到 B。每個事務首先進行雜湊,分別產生出 Hash(A)、Hash(B) 等等。然後,Hash(A) 和 Hash(B) 一起進行雜湊,產生出樹的另一層:Hash(Hash(A) + Hash(B))。在樹的右側,事務 C 和 D 也是如此。

因此,這個示例中最終的梅克爾根雜湊就如下所示:Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash(C)+Hash(D) )

由於這個樹的構造是遞迴的,我們實際上可以使用這個根雜湊 連同梅克爾路徑 一起來建立一個證明,該證明可用於驗證給定區塊的任何給定事務。

例如:

如果使用者想要用一個節點驗證事務K是否在這個區塊中,那麼該節點只需要保留區塊梅克爾根的列表。使用者將提供(a)事務所在的區塊號、(b)事務K、(c)梅克爾證明。

梅克爾證明由Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 組成。節點可以從證明中計算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),該區塊最終產生的根雜湊應該與檔案上的根雜湊匹配。

我們可以在這裡看到節約的空間:

為何如此重要?

透過使用梅克爾根雜湊,我們可以將一個區塊鏈“備份”到另一個鏈上,而無需複製其整個事務資料庫。這意味著,在儲存方面,我們可以將 PlasmaChain 整個歷史的概要儲存在以太坊主網上。

PlasmaChain oracle 定期向EPC提交這些概要  — — 上次概要之後的所有新區塊的一組梅克爾根。以太坊主網上的這個智慧合約(EPC)可以用來保護 PlasmaChain。

Plasma 退出

要從 PlasmaChain 退出其代幣,使用者可以直接與以太坊主網上的 EPC 互動,提交梅克爾證明來顯示他們是代幣的當前所有者。

然後,他們進入“挑戰等待期”,在此期間,任何人都可以提供證據,證明這個試圖提取代幣的人不是這些代幣的有效所有者。

在此等待期結束之後,該使用者的代幣將在以太坊主網上可用。

Plasma Cash CLI

好吧,讓我們再深入一點,實際嘗試下由 Loom 釋出的新的 Plasma Cash CLI。

你可以在這裡檢視原始碼:https://github.com/loomnetwork/plasma-cli

這個 CLI 工具以 npm 包的形式提供,因此我們可以使用以下命令安裝它:$ npm install -g plasma-cli

如果在執行此步驟時遇到問題,你可能需要確保使用的是 Node v10.9.x。

在使用 plasma-cli 之前,我們需要用正確的引數建立 config.json 檔案。 你可以透過命令列傳入所有這些引數來使用這些命令,但我強烈建議將其定義為配置檔案以便於使用。

一個合適的 json 物件將包含以下欄位:

{
  "ethPrivateKey": "",
  "dappchainPrivateKey": "",
  "plasmaAddress": "",
  "startBlock": "",
  "ethUrl": "",
  "ethEventsUrl": "",
  "dappchainUrl": "",
  "contractName": "",
  "dbPath": ""
}
我們來分析一下每一行的意思。ethPrivateKey:  和你的以太坊帳戶關聯的私鑰。dappchainPrivateKey:  和你的Loom 側鏈(即本例中的 PlasmaChain)賬戶關聯的私鑰。plasmaAddress:  你連線的任何以太坊鏈上的以太坊 Plasma Cash 合約地址。 如果你連線到 Rinkeby,則 EPC 地址為  0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
startBlock:  部署 EPC 的區塊。 這用於事件過濾,因此程式只會檢視它之後的區塊。eth-url:  以太坊節點的網址。預設情況下,本地以太坊節點的網址是http://localhost:8545。我建議建立一個免費的 Infura.io 帳戶以獲得一個簡單的 API 網址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。ethEventsUrl:   監聽以太坊事件的網址。這是 WebSocket (不像 eth-url的 HTTP 網址),它在傳輸資料方面比多個 HTTP 請求都更為有效,並且總體開銷更低。如果你連線到 Rinkeby,請嘗試  wss://rinkeby.infura.io/ws。dappchainUrl:  你要與之互動的 Loom 側鏈節點網址。對於 PlasmaChain 測試網(extdev),網址是 http://test-z-asia1.dappchains.com。contractName:  這個不是必需的,只會給你正在互動的合約一個名字;plasmacash應該可以的。dbPath:  這是一個本地儲存資料便於訪問的路徑;對於這個欄位, ,/tmp/pcashDB.jsob 就夠了。
使用 CLI 進行轉移當你準備好配置檔案,我們就可以用以下命令來啟動 Plasma Cash CLI 工具:$ plasma-cli --config config.json你會收到一個空的提示。很正常,僅僅意味著它初始化了 CLI 工具並準備好接收命令。嘗試 help,獲取這個新提示符將接受的命令列表。如果我們輸入 myCoins,我們應該看到 [],提醒我們當前沒有存入幣。我們接著把1000000000000000 Wei(約0.001 ETH)存入合約中,將它變成我們可以在 PlasmaChain 上使用的幣。注意:要做到這一步,你的 Rinkeby 賬戶裡需要有ETH;否則,你將得到一個資金不足的錯誤提示。$ depositETH 1000000000000000
大概需要30秒來確認事務,你最後應該會看到類似這樣:


請注意,這是兩個命令的輸出:


depositETH,然後是 myCoins,我用這兩個命令來驗證我的幣是否正確存入。輸出將有許多 <BN: x>,它代表以 BigNumber 格式編碼的大整數(基於以太坊的互動標準)。其實我們只需要擔心第一行,slot: <BN: 967...> 這個數字是你的幣ID,你將使用它來轉移或退出幣。

由於 Plasma Cash 的工作原理,當你把那個 Wei 轉換為 Plasma Cash 代幣時,該代幣代表該 Wei 的整個值,不能進一步分割或組合(此功能正在開發中,將來可用)。因此,現在你有一枚 價值0.001 ETH的幣可以使用。你不能在某處使用0.0005 ETH或者將兩個0.001 ETH的幣組合成一個0.002 ETH的幣。必須退出並重新存入才能獲得值不同的代幣。

如果你試圖轉移 ERC20 或 ERC721 代幣,過程也是一樣的,除了你還需要為代幣合約提供地址:depositERC20 <address> <amount> 或  depositERC721 <address> <coinId>。 <address> 欄位將是代幣合約的地址。

要把你的幣轉移給另一個人,你可以使用:

transfer <coinId> <newOwner>,在我們的例子中,我們的0.001 ETH幣是coinId: 96726d…,如在輸出的 slot 欄位中所示。

這個幣的接收者 — — 在他們的CLI上 — — 然後應該呼叫 recieve <coinId> 來確認幣的所有權。如果他們不這樣做,幣仍然會被列為由發件人擁有。

要從 Plasma Cash 系統中提取你的幣,需要退出並最終獲得幣。

退出並最終獲得一枚幣

首先,我們需要呼叫 exitCoin <coinId> 來啟動退出。客戶端將透過向你收取挑戰押金來啟動退出。在挑戰期收到押金,作為制止錯誤退出的獎勵。在此期間,幣的“狀態”(如果你透過 <coinId> 或 myCoins獲得幣資訊)為1,意味著幣處於挑戰期。

質疑期結束後,我們可以對幣進行 finalize <coinId>,將其置於狀態2,準備取出。然後只需要輸入 withdraw <coinId> 和 withdrawBonds來提取幣並返回你押的所有資金。

就是這麼簡單!

希望這個透過 Plasma CLI 使用 Plasma Cash 的介紹能對你有用。 如果你遇到任何問題,歡迎加入電報上的 Loom SDK 聊天室:https://t.me/LoomSDK,大家會很樂意幫助你的。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;