Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。( K9 S1 F& h6 _1 B6 w

5 T. i' T3 Q) iLoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。
8 e' `' q- E$ p6 t. v& a% o8 e5 Z" ]+ {6 Q7 }9 a( O5 @
在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。
& N: j( w1 Q: U: ]8 \# W
" p7 K" D% f, m简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。
9 l8 B8 b/ B* K8 l, f, v
, S2 g5 _- K  I8 f0 eLoom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。1 m! j, U7 E2 w- C
. ~% i+ T; \6 u/ H! e2 ]
让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
9 ~0 w3 z! a2 ]* p3 }* X. y
" Q/ w( o2 d  D: n  j回顾转移网关& \  M" L& p9 L  i
3 h, ]8 H6 \; O: n/ Q5 E
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
) d. N# P$ a& |, V/ k) B7 ~8 @& X9 s
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。' A3 M3 s& i) x

& D$ w) t" d" T. t/ F) E2 r然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。3 v, \) u( K6 ]2 Q/ O
. t) H) Y0 A6 M3 E- u
Plasma Cash 有何不同?  \' ^2 F6 C) `6 y8 N

; n# e" s' O5 n$ w3 [% O8 r" @( PPlasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。0 l& q0 J. ~. z" u1 p
5 [/ w" E4 w/ L; `" P' H& e2 ]
Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。
/ k$ h  s' K- A( T9 P0 G5 K* w
' C4 x2 k7 X: ?" C3 H2 \. }; ~用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
- w: P! Z$ p* q! P  Q
! g& b" j% V$ ], A该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
6 D+ A' V3 _- z* n' k; [# y. o4 q3 k0 X6 |' z. u' T
PlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。9 f$ O8 M1 k5 A

1 F4 P; A- P1 ?) D8 L梅克尔证明检查点: m# H5 E8 H: Z! D
# M* k+ Z, u8 U$ [( H. F) n
Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。6 f; h0 ]- _+ v' D0 p. L
% G1 T# T2 h+ `. X
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?( |/ X' N0 O' @. `5 I
! L! Z1 D# n  @/ W0 \- f, o
想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
2 w6 x7 u1 Q0 i4 C2 e7 d0 p* P
: p+ `) p& l8 Z7 ]* M* d节约时间和空间8 D: |$ I0 C0 D3 ]- l
2 c- d5 w3 @- C5 w* b
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。. _. G7 h8 o* c$ c& i0 i

) v0 y0 o8 o, A! J一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。* W" |2 M7 l; F7 w: d, e8 e& a

7 ~- s" M% m8 P  C, M  X6 D6 w梅克尔树示例
" E8 G5 B; D2 n
" d6 X6 Q; s% S5 Y# C# ~. \3 |2 x( f8 y例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。7 d- ^+ ]" I9 l$ m8 {

5 {( F* g* v( y4 V$ p& T, ]3 I* e" x" U因此,这个示例中最终的梅克尔根哈希就如下所示:* W9 o7 q+ Z& A; ~  Z- [; ]

" t" k0 A  I( S7 }5 |( ~* u/ s$ v8 mHash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
8 q9 Q6 s0 z1 X( Q5 e
# \; ]4 [9 G$ `7 g3 G7 n3 n4 J由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。
; u& Q2 X, ?# s3 ?% R' @4 Q) H' l
# Q% m/ U1 I9 a1 Q  k例如:
: A' l2 E# I3 k. T/ I7 `7 d4 z! A0 i3 y* V, n9 {6 S+ N
验证事务K是否包含在该区块中1 n( S7 A1 V4 m
! |/ R& h7 Z! [: p  _7 E7 \6 E
如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。
" o2 Q9 d+ U& \0 H  Q& [2 ~3 U! P# x! C* ]
梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
! X/ t( z' L  |4 P* [  L+ `! {9 Z. I: P$ H" Y# p
我们可以在这里看到节约的空间:
% m  H8 y& ^- y7 P: q' l5 Y8 r; n* f  a+ J
梅克尔树带来的空间节约
: s2 u# }- P3 T1 B. Z5 j# V. l
  C+ E) J  u, P- W: R& ^为何如此重要?
7 W6 U7 F5 @2 r! B) W8 |4 T
3 ^& l1 N! y9 G/ ~8 r8 ^! q4 a% l3 C通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
+ w2 @% R4 l1 o% e& G, i+ _0 j9 d  v; R
PlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。- S4 q  g) R- u8 G7 g+ [6 g
7 h7 l5 x8 H; q. F1 ]9 W5 @% P5 f
Plasma 退出! K8 }5 q/ H0 c' {' p3 T+ @! Q$ Y

; P5 T9 O2 O& q0 a# E要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。
; o9 ]$ f% e. t8 M4 D3 @" i+ ^+ A. o) V9 M3 S% I( G8 i$ V4 y
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。1 d( y7 b0 Z6 U

/ @) W/ w( H1 z: V在此等待期结束之后,该用户的代币将在以太坊主网上可用。+ U1 D+ ]# n$ o% o* L8 b1 N2 y  p

# Z4 D8 e, \7 }& IPlasma Cash CLI& c9 @/ M2 E" T) m- ?

( Z4 |" i2 x! K4 A好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。0 ?# k! e4 P" P7 r% T& m

% j. }/ ^6 W: D& y6 E$ i你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli5 c6 K% q% l8 \8 T
' |: b3 F; ~* i% `) \, q) K6 R9 q
这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:
" x6 L% W, n, W' ^" B: G! O2 n; J. O; f: b0 q2 |
$ npm install -g plasma-cli
5 @: q/ r  p. W, `. R& G# Q
: F9 |4 b0 H1 B; d( f2 ~3 J8 ^7 U5 G: L如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。
1 ~/ V0 y' F0 B/ a9 j- y+ y. F5 a% N4 s) z* F
在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。# T0 R- f2 A; @' i1 r6 u
! f/ \& e9 V( g5 a6 \' P
一个合适的 json 对象将包含以下字段:5 D% n4 |! P4 Q7 d& `3 }0 F
! d( t6 W! K8 ]9 l/ M1 g1 Z" _
{
( p, q2 U+ Z. d( g6 E1 J
% P3 m: N9 Z) s- V7 M  u! X5 `6 Q  "ethPrivateKey": "",
: c& b- T7 j+ M" E- Y/ w- n$ p+ K4 c+ |2 R1 T
  "dappchainPrivateKey": "",. s) ^, k; \+ M$ @1 P/ I
6 S# c: E: J: V
  "plasmaAddress": "",6 S0 c' B) M  y  ~2 T" p/ Q
' `" k+ p, K0 h& ^0 r2 R5 @
  "startBlock": "",
3 s" k" I: S1 x
& H# j1 [9 `  R  P- I) z; p  "ethUrl": "",
. G1 ?; P0 X  W7 Y: \0 U5 {: Y" n0 ^! g8 v) j; v/ v& U! e
  "ethEventsUrl": "",
- x& {! j2 h+ V( j6 T  e. ?5 k
* M+ |$ s/ Y. Y7 x& L  "dappchainUrl": "",
- \3 p3 Z; l: D  M2 W4 B8 k% z) x4 ]( c3 h' b+ v' g# N5 y6 M; M% O
  "contractName": "",/ M2 y$ D+ j7 y. Z8 a. E2 b$ b1 Q

& a, r7 u5 y# s  "dbPath": ""0 v" t6 j! \: ]( ?- X, `
' l  k4 M! K' y) ?% @  ^/ `/ L5 X7 ]
}# g) [1 ]9 K9 |; S; o: }1 W
, L) t) F4 Z: N; b
我们来分析一下每一行的意思。9 i& D) B) q8 U7 P
& Q8 |" V- s  j9 c6 o8 M, m) ]
ethPrivateKey: 和你的以太坊帐户关联的私钥。5 n' \1 \' a, p. S

# Q% T; S7 a" [9 t7 \* d8 tdappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。  `3 A1 A: n4 T

+ |/ c4 l, B5 @, ZplasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
; K+ r( A# [! S/ o! U! A+ v
4 S8 S2 v3 n" X- IstartBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。
: P# O2 H7 e# e2 Q
: c0 D7 \+ C5 I- Eeth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
$ t0 r5 P0 v9 z% m- G: K3 ^
  H" C' Q3 Q6 W, m# q- AethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。" p* @( n8 E: w
: N$ p5 d: v  K+ g% e
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
( M$ T- h4 ~$ o$ o: m) |
! X: V- E9 k! H% a2 `) u3 K6 wcontractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。; n8 F; r0 l2 s  @

  l: x2 t9 u# T) K: |" XdbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
3 R/ \! y* G5 m; z* f' g& W8 z, V! B  u4 K$ d
使用 CLI 进行转移7 ^. o& S4 K2 x
/ A( X: {- r8 E
当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:
1 W8 W" w; a9 Y0 z) ~
* s4 _% i. o8 @$ i& |' S+ ?$ plasma-cli --config config.json
& Z( v1 `, \7 b. K1 p( ~
( A5 Q7 p5 {* u( V; I你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。
# E5 @7 r0 k5 }: D
# [. J% S: w9 w% g  Q/ D如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。) [0 o5 x, f- L5 r! ~0 j4 S

3 ~) D& f9 z$ w8 F7 w注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。- W* z7 y9 s1 ?' K, A  j
7 b9 X8 a# \2 r4 g9 V
$ depositETH 1000000000000000
' F$ [. b# U. j# l8 `5 q3 S7 v8 n3 P  l) d
大概需要30秒来确认事务,你最后应该会看到类似这样:
# T5 P4 F* t5 R! `
# S* f+ d8 Q; P; x请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。2 o1 |, b9 w/ ^% K

9 _( A7 u( W) |, Z由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。/ u4 m1 ]* m, b7 c  o$ t! P

8 [* |; a. x1 `如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
. R  W: m/ o1 L9 O/ N0 Q0 z! Q: A" ]7 e; Y" V& |
要把你的币转移给另一个人,你可以使用:
% R$ ~* s6 |% _  y' b. l1 s7 {, Q- z; e0 U
transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。' \' [6 w! n/ E4 c

8 Q4 J/ q  u% @* g; K, B# M这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
4 n: @' i- O% c, p( H" B- C5 f6 W+ g4 b* t0 [5 {! V; U
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。4 y+ `$ u, Q5 ^; t0 z; A

3 p: l* `! b& a" u退出并最终获得一枚币! ~5 Z0 N" M9 w; b2 B

6 g( Z* U. ~; `( e% Z首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
$ @9 {% f$ {/ h" b6 J- d- S+ S0 T! X# u. u. D6 M! w0 I3 y+ v/ p
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。8 j0 A5 G8 D: f  E% a& g5 Y
6 v! x! U% _$ k8 c4 B- t; @
就是这么简单!
. ]9 m- g$ T2 t2 h0 L% G2 ~# r7 [* h) p. X  N) n5 d
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。) {0 H  j) H/ u6 m

- o; P; \8 L1 N6 ]( b2 lLoom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5