Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。- U% _$ N( e' _) Y5 ]" P$ S

4 z6 {8 a0 H" }7 [- e- e) }. ALoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。! p: l8 B' q. o- B- d# `$ d6 K6 Q
9 s/ v9 D! I1 _7 Q  ]
在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。
8 V$ \2 d( L+ I
/ e3 N! Y! k3 p. v简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。/ X  d) D. Z2 I7 q

5 W/ t, x( [* j3 fLoom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。
  Z3 D5 m) c/ Z7 C2 {
* l2 O9 ?; r+ @8 E" }让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
4 Q& G+ U5 R0 R. T0 \; v9 O7 J# m; q. y% h
回顾转移网关
; _: y3 y- \. ^& g3 }) G
1 b" G9 w" y+ z, v转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。6 u/ i4 ~8 K$ @$ n9 }8 `- f

( j. Q, |6 J, Q) f+ {Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。
+ M6 r* @& b, N# d4 f! t' i  \# W4 X$ A
然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。. }3 D& F0 l6 c* o+ D# L" L) O

, x, x5 s4 ]* q; l  y9 f' IPlasma Cash 有何不同?, l: g% L0 N# O( _6 j- C+ X
: a: L  C# y, l% _, {
Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
, O1 E: c0 I: i4 L" H( q' c  w; m! Z+ Y
Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。
/ V  l$ B  m) c8 x% ]/ `6 G* a+ r3 j9 ]- r: V' x$ A
用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。0 {- i* _+ h  W4 c9 Q+ \% d; k
% T, ?7 t3 ?% ]7 F6 ?. X
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
7 O  y, t3 A1 {* D7 w  L" ?9 s+ @5 U# r9 G+ F+ ^- C% i
PlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。
9 T% N1 f# _4 {6 x, `8 ~$ R* G5 D. Y0 k. O/ W' {! c
梅克尔证明检查点
: D3 p" Y& g0 N3 i
% }- T  Q) |/ xPlasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
7 r2 r/ Q4 s1 a( I1 y
% ]; k$ K: m+ B) `2 t. K) C在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?7 f+ L  Y( A, \% g2 U* \+ X

) c& p% J/ G6 [3 d9 I想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
; u% X" ]- ^2 ~, D; l- a& L) ~7 |3 ^4 x( b! n
节约时间和空间2 ~5 N1 E& |( S) ]% m# v
, }. R2 h" W. |3 F6 u' P
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
4 A, q; k: z1 _) ^
4 V! q6 ~& z% K1 U) o2 J一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
/ _3 C7 b, e7 ^6 j5 b
3 G+ J. W7 g7 \9 a8 T/ n梅克尔树示例3 K& O" I3 `* ]  Q6 U. b

/ c6 i8 \3 }+ F: T( s7 N例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
1 b' A& H* N( [1 h% p' z; l2 s
8 T4 \" b7 ^- g8 K1 g# J9 S0 G因此,这个示例中最终的梅克尔根哈希就如下所示:
; s9 ]; r4 Q! g5 L
# A* `4 s# n5 Y( C  ^7 t; Z! ~Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
7 \9 u8 x3 o% s3 p7 U
( s+ w/ Q7 ^* t& t# X: e! @. C由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。
/ C- b3 H% b& f9 R, B" t' U! e6 d4 D& U) h1 W
例如:
) Y8 a1 D) D0 A* [! h* x, p2 {3 I! s& g! v/ R
验证事务K是否包含在该区块中  `) i$ {2 _9 s' F; Z' o  q

: v# t* o2 N* v如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。, Y6 |6 }+ W7 a* c$ q( ^

( F) v1 l1 E. E* t4 d  S( h, c梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。6 i* v3 z2 @9 s# @8 s6 q

. K& U) a  y$ R" f/ J3 C( |9 w我们可以在这里看到节约的空间:
( b! l! o; x* i: w- K
- u9 Y1 \0 [# L; I6 x) \梅克尔树带来的空间节约7 |$ o& F3 g3 C* q9 C
2 K. M# u" s# t: V3 z' @% u
为何如此重要?
9 ?% h2 \* o( m
$ z7 _4 Y  k3 ^- F/ c通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
) T+ r8 o4 C* }1 `; u( E6 _. b" D+ s( ]
PlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。( m, S: x5 u3 y, r
. W* T, k- k0 X) V
Plasma 退出( J$ Y1 i0 s' _* `1 y5 D
! `1 H- B- U6 l: Y. Y0 x3 E
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。
' l/ X" R6 _: d2 g" h4 ^) p6 a
3 |7 G$ Z: @" w- Z+ h2 P  S1 F然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
6 g" ]% `$ v& T8 V; v
, U4 r: `3 f4 o/ E2 U在此等待期结束之后,该用户的代币将在以太坊主网上可用。7 n9 L- D7 j, d  O: F& U
" @1 [) o% `( C: Z4 a) m
Plasma Cash CLI
- H) o$ D' g- `) w: V3 Z' ?) P
- ~# P- G, J# p9 `9 _" N好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。9 h2 N1 E2 k8 O+ _$ t+ `

2 ^* r1 l7 H' C6 v你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli
7 W* [% B* M' V! z) S+ A  N
& U/ [1 `: {$ B2 A这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:
! I' S2 L% S: _1 g6 X  v1 Q! D" m( o- y$ |8 O
$ npm install -g plasma-cli
' N2 S0 N8 n) a3 [4 c8 S
5 Z, F" O- n" Q' m9 b( W5 R8 F如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。- ^# M. [# @; l
6 d' X% b2 @- e5 n
在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。- r* ?* i$ Z- r# n

/ d1 j: ?! K3 F9 I3 E一个合适的 json 对象将包含以下字段:
+ o! w3 I' d# s7 ?
0 S1 y/ r/ a  D& r0 |2 P{
7 V" a: T7 j- v, U$ \$ X' }( {2 Q8 s, t4 S! b- H" q
  "ethPrivateKey": "",
$ ~7 ?+ i# z& K& L: ?! u) ]" y2 ~/ ]% ?3 z2 U
  "dappchainPrivateKey": "",
3 x, k5 X* v1 ^& p+ _" E- H7 ?
! F8 A/ o3 }2 P  c' K2 R; r  "plasmaAddress": "",) |2 q# Z* \/ Q& T3 F9 O
- T5 V7 q4 c6 b1 U. Z
  "startBlock": "",
' k6 [$ i0 u/ p/ K3 f4 M# G* T: v5 H4 L) O( Y; Y  e
  "ethUrl": "",
5 [2 a5 t/ A  K' A7 q5 @8 v/ D0 Y# n
  "ethEventsUrl": "",' W* u' t0 ]9 s! G( @& T' w

. j) Y+ m# E- w! r% o* d  "dappchainUrl": "",7 w1 @6 x3 G- t

3 y5 h7 k+ ?% `# C  "contractName": "",
, n+ S8 m1 ?. W0 w3 e) F
& }; c3 G& i8 L0 r  "dbPath": ""
, P$ p4 W! X! w. y9 y( P
3 f! A. C! ?1 N6 x5 p+ {4 m8 [2 [8 v9 p}+ k& w6 q' H! e. c1 q
/ Y- v8 x0 c- @7 u* S
我们来分析一下每一行的意思。) y! \, r: x3 i4 z6 S

7 g0 j! ~' P- Y* Z  V4 {ethPrivateKey: 和你的以太坊帐户关联的私钥。
, t6 @( W# g  N* B" r: u6 q( T  O" B! z6 S8 Q- K8 j* Z" l
dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。( V1 r6 t( z" O: `# |8 L/ {; U

; S; F" l1 J' YplasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
$ F7 l" g+ v# ?. `+ x) e! [
; t& h0 {" f% NstartBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。6 U9 t4 s% h" c0 F. f8 Q% Z
6 \# |1 v' S# a0 j: U7 M0 L8 K9 C
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。3 ?4 [2 c+ w% R- ]

" k' [, R2 h) i) J* ZethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。& e* M1 n8 P" y

& c( {9 g: N; W# G* d8 e+ ZdappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
3 K& m! b: {  E+ y4 d- W7 A( T6 ]( l5 c+ S$ o, T3 X
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。7 t  c# U. H; v- k0 v2 ~2 j% F
- ^6 t" ~! o, _  W$ f
dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
* s5 M2 B# v! H. \+ M6 R2 b! v6 i2 i  o5 Y8 G
使用 CLI 进行转移
  _1 H* A! M/ I) s' ^, s5 t, _' s
/ X5 S2 d. b4 `3 _0 _1 ~当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:5 B% o& B1 a3 Z
7 c, L: p3 \8 l& b4 \+ A
$ plasma-cli --config config.json# A6 X3 h) b7 I% K5 R, a9 E0 [( j

; I, N4 h* w- B你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。) |# j( \) w$ A
7 k. m1 @( U" E: q; O4 H
如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。+ A+ j! U  ^. b# B6 ^: T

( e: k% |; Q0 h" ~, a/ A" f& G注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。
2 X  ^* p3 ^& j/ G# E* m# H. n) L, d9 Y3 P( e3 ]* }
$ depositETH 1000000000000000
( F1 z+ S$ u# U% Z/ g1 c* B% ^) E+ ^! i  q% `  Y" Z
大概需要30秒来确认事务,你最后应该会看到类似这样:5 A, k+ [3 _- Q" I2 |8 j
) k1 y6 d. j8 f  |' f/ o" w
请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。
8 i( t: Z+ ?+ H0 V* b* {( M2 T3 p+ y3 }$ c. d
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
- U7 i; b' H8 N9 W  B5 }1 }2 I$ s/ x6 ?' E- ^6 K( o6 z
如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
2 }: B- o- L6 y5 X/ P0 d- K6 _- q7 @
. ~5 z& q1 b  Z) @. m! H7 C要把你的币转移给另一个人,你可以使用:4 e8 s$ L, Z% w5 f& F, P
! [5 t7 t# i. }) b
transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。
7 l3 Z1 c  {. ^1 w/ P6 l
! S  x0 X2 q. C9 ~这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
8 H1 L! N8 J9 g( O7 ?2 @2 b  a! u( Y# B( _5 X5 I/ s
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。6 S7 ~  }% _! C5 Z

% C3 t$ @" u% i! o( P( o( C" C9 c退出并最终获得一枚币
8 w2 D2 v' a0 d9 Q
+ P" D' z9 H# D% Y- k" z首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。  U/ h9 {4 V0 y8 g1 n
' ~) T4 }) L" X" P  f. w- {
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
0 U; k/ ^6 s$ s! q5 v; t' f3 u, i' r) e0 E! U+ K
就是这么简单!
7 |/ Q6 c' ?/ @; V( N! \  ~$ E3 {# C
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。# }! Q# X* L6 J1 o5 t

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

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5