Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。  G1 s/ \6 T/ Q8 k/ H$ s# q& j0 R/ T
7 D0 I5 c7 Q/ e0 R/ r
Loom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。
& c; c1 G5 j0 a+ ^+ H' ^9 s6 Y8 K0 O
在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。
' i. \! S% ~! |/ _# k
$ c! n9 b9 J1 B1 G( H0 a0 L简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。! P; _! [4 A6 P' l( }

! M; Q3 }" o; C& \Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。
3 S/ D: L9 j" C0 t1 y$ W& ?; J3 O) J+ T$ S6 B8 ?
让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
5 m! O. r$ b% ~
# v+ Z3 Z8 S2 [+ }% p# h回顾转移网关
: g" n0 x; p8 i  P5 B% @2 C' v" a6 h# X* y' r
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。) w+ O" X, ^) C) h% o8 U
" _9 i4 S, p" q5 Z
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。$ x  i2 Y8 ?* o" a* g
( m% ]- o" I+ V& h/ A
然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。0 [* ?9 z3 g( z1 r3 I
$ |7 s0 e+ ~& B5 y
Plasma Cash 有何不同?
* V$ I2 R9 o( v$ I) ^
4 \- s# u  m/ [, F1 i7 D$ B& HPlasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
+ `( K. P0 q) }. q# j" T1 v: r5 c) q; r; `2 c
Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。' s: P* T7 g2 _& s4 _/ F
+ ]2 E# |0 e! k
用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
* z& b: M: A# T- Q0 {, |4 c6 Z) G" u2 h7 }8 S
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。- l- D' f/ l( n' Q* ^

2 e* T% d1 H3 e1 G+ aPlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。" c, `! n: Y: o; k& k
* W! N" K6 V" T
梅克尔证明检查点- v1 X4 \( B% P, A/ }8 i. k

4 s" q; x" O7 i% a. dPlasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
- V5 f% B+ E/ e  f" N% ~& o' R! N& [8 |
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?( C. A8 \. C4 e$ h

3 a2 F# `- M' z" N想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
  h% M4 _2 h0 K  r
. G* s0 y1 o+ R2 Q, }3 S节约时间和空间
' |8 x# l* `- m8 N/ J$ c5 x9 a5 _; |
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
4 k8 I6 P* ?3 K% _- X
) ^) o( ]/ p6 l& t7 [$ v一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
% r" V2 w. V; o% S- _; n( ^) \' F, ^5 d3 K3 n! {
梅克尔树示例( n6 Z: v$ j$ {( T7 Q2 P

; f- E# P. @7 I+ c0 W- ~例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
2 n' E/ O* e5 q% i
, e6 K6 l$ W8 t" d因此,这个示例中最终的梅克尔根哈希就如下所示:
, Z4 _/ i# F# g* }1 C5 N0 J' t/ a7 r2 Z- t  S' W" R
Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
0 P; ?& x2 _# q9 R6 v4 `& ?* L5 ?6 ?; \+ V/ E1 y1 j
由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。, J7 q. B- t$ X" b  X
. |$ }8 |# A. q( f
例如:
# e# E$ z! ]& {/ X9 R$ z1 C! T5 Q* l' S: M
验证事务K是否包含在该区块中
3 {- [" Q3 l% b+ z) U+ ?" ]& l/ Q) a# _/ f
如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。) Z7 l/ [- x: Z6 o( h( r. _) }! S
7 o& c, }0 y/ n7 v; H
梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。  v% P1 x; [6 l6 `

' C4 k  `! v: @; x" @! p9 {- C我们可以在这里看到节约的空间:; z6 X' w3 a% |+ R. a! J6 ]( A
: l+ Q4 I: p2 T9 G( n
梅克尔树带来的空间节约! ?/ t& X% z9 I- n  v1 [. V& _

/ R% K: {7 j5 N! K+ i& K2 x为何如此重要?
  H$ p/ V6 n( `4 O" x( e3 O- O
. t0 J% M$ A( F+ ~通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。# j; a1 w  h+ N4 j

& c. n) Q4 W; M5 f9 O7 f9 XPlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。
: V# F0 l$ X' l; O5 T2 \3 U' T1 ?3 _1 w' W% W% _+ p( F2 X. h
Plasma 退出
" }7 j' k- R- ?
. k! k. z9 F2 x% w1 s要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。  n8 X- s, C8 |* A- V% h
; I! I3 A4 Q# q' n7 j7 G
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。8 }+ _  S1 L; B) R
1 ~2 x0 b1 h4 s) u3 _# [
在此等待期结束之后,该用户的代币将在以太坊主网上可用。
" x- n7 N( F( p# |! P; E
1 y# W6 X5 C3 I1 y" ~1 l, O0 cPlasma Cash CLI
7 ~- E0 I& B0 ]3 B7 X* F# E
( [+ n0 D: D7 G7 `9 }好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。/ J) f9 V+ b# T
) S8 Z- N) r$ x* [: k$ D. K, K0 R7 M
你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli7 \8 d. x6 ~3 D& d. K$ x6 r& F

4 B% L9 K3 w8 p+ A这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:) B2 u4 i) }* x! S  u; O! e+ G' V
. ?  F% j# m, o5 q3 j2 k! ~( `5 c, m
$ npm install -g plasma-cli. n, `# v4 M, ]7 b+ \+ j7 q

0 \& P2 n/ ^$ v: ~9 D# J如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。; c5 O7 Y9 W. H3 B

1 n0 h" ?. n$ D7 G/ V0 ?( E6 \在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。
8 v; y3 g5 `+ M9 f  E* p; Y! e  t1 B
  R5 R  o& u" v" ^  o一个合适的 json 对象将包含以下字段:
: E& w0 i0 b* I/ y6 J$ M/ h- [; E% }: E9 S" L
{' F5 U' \2 h# e6 S

1 b% @8 k+ l* c  "ethPrivateKey": "",5 V2 `! |0 i/ b: s% Y# x
0 @! {& C$ L( f) O
  "dappchainPrivateKey": "",
' A4 n4 y3 T) b& b+ V" I! D0 p: l( Q( F* y2 E
  "plasmaAddress": "",
; |+ f3 _7 n1 Z/ C: F' E; l3 W3 w4 p/ L, N5 @( p: B' `) a8 |
  "startBlock": "",
; r& u" ^& I0 D( H# e9 E3 W1 Y% Q; M+ f8 _- G( U8 i6 n8 z
  "ethUrl": "",
0 {  c5 a; l1 I, y$ A) g: Y: A% s% Y' A+ H' W0 i; t9 |$ G! v  @
  "ethEventsUrl": "",
* x* H+ ]; F' D: J9 O1 i5 U8 H9 y" N0 s3 `, d
  "dappchainUrl": "",
/ j6 F7 ]$ F/ B0 N% B9 s  L( K. ~1 c* o1 Q! k- [
  "contractName": "",- F& ]# N; }& R" @/ c1 r

$ j9 P% z2 W+ n+ e$ c4 D  "dbPath": ""
1 s& k1 I0 J# V  Y* r" }' R5 Q8 e; r: W5 c0 |3 E0 Y
}
! z5 Q. X2 `: ?; `5 U
- x- s7 p* b+ v* i- h$ G我们来分析一下每一行的意思。* X2 W. A; x: C2 ]  f

6 w; ~7 n- A2 `4 y* ^' m7 o3 r" hethPrivateKey: 和你的以太坊帐户关联的私钥。  C+ S2 b' t  b3 @, e6 L! g

. {0 E* w2 W" {2 B3 Y5 n/ {dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。, `2 p9 N2 T& c$ D
9 W9 M) x: F. G$ @& ~: Z( e0 A* b
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。3 b* f$ y1 D5 `, I/ W; n

. R  _% q7 O/ QstartBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。% h( I. g& N% u  Q/ S8 P$ H
0 Q0 |0 x+ e9 @
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。0 g. Z6 \4 p7 s

* i; R! k0 b' ZethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
1 c2 }; h0 t# W: c% ~/ N1 ^0 ~; [; T$ U9 c6 c
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
) C) {/ f- N$ O. p; ]6 ?& c1 R4 O! }' R" b( U& p7 b5 C4 ^
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。7 M2 C# U6 B# L1 \& d

  i! l  h3 M+ A7 J( n. a3 DdbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
/ }( Z3 E3 E. w( o1 X. W) y# h; v! L$ _1 b3 D! D8 j
使用 CLI 进行转移' W6 N: w1 G! l/ i- M6 Y

0 l# |! X$ z7 Y. M当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:
1 w# D2 Y: B9 f- e: |5 g# p* u7 O9 y1 r' Q0 R+ G/ L" z* V
$ plasma-cli --config config.json
' R4 |5 X& P3 G9 X. o1 K
! d% j8 E0 E9 B: ^8 Z8 j: Z5 l你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。
" A7 D4 G: [) M) e6 H* ?3 a0 q+ N
% c! j" ^9 _7 A' @+ y如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。1 c" b! X+ I) N' x4 z+ d/ ?; u0 b

0 k$ C, ]+ n5 Y" i2 T& T注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。" l4 r3 u9 f9 t3 D& u. L

$ v, q  G! t* ], H' q$ depositETH 1000000000000000* R1 y* w. n1 p) Q

  I  u0 M* p' g大概需要30秒来确认事务,你最后应该会看到类似这样:. N  M; f2 ~1 Y1 ]* d

8 j/ f, m+ N/ r0 F) x( q+ z请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。7 V- g7 ?" z- `
, v! ^1 o3 v, }$ w
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。* c2 ~* Q* O# s9 x

) Z7 Q: P" v7 B$ a如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。9 d3 U( E0 g6 t
' U& A) n. s1 r
要把你的币转移给另一个人,你可以使用:, N6 G. v+ Y' l9 I& K& @( O

* @9 e) t. B  j$ r" i( N2 }transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。5 |! G1 C7 [% n& {- V
% T: [) K8 S, R# U2 b1 d
这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
! V; g1 v- H0 V6 w. r4 L& H6 f' e- l7 K
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。" y4 K5 z" T. ^6 b; C
$ D1 m- R; a( S
退出并最终获得一枚币
/ n  r( e: k3 h8 y# N3 B" g6 B; ]  J% @2 ?
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
1 [" n4 ^; C7 X% F2 U' |/ _; u7 e7 c
9 u4 ]2 N  z7 x! J, B% |质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
4 e# l2 |1 d. ^- ~! b' Y0 t- z+ Z9 s) _' U( `9 Q3 H8 J7 M
就是这么简单!
. j$ \" k7 l. A9 {6 ]( x
8 d; N8 x2 y6 W希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。
' j: t, k: }3 F5 m# ^
& m  B% }; \1 I6 U, e$ WLoom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5