Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。( y0 t! J* i0 X7 C! I. A# Y& X
. A+ _& W3 z* x% A
Loom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。* J  E# C3 T+ A/ R! w

# x4 S2 J2 @: C在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。5 Y" c" V7 t! q  X) }  g1 I' n% L7 V

6 U  H% h% a( q+ @0 ?8 z9 Q* N简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。
1 w1 J' s- \& f; G8 X- Q/ D; k& b1 s. m2 \0 h! E& G
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。  J3 b, z0 X4 q% D% H9 l5 k

, F* g  \- l) M2 }; ^3 c让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。. A) {/ X- c* H9 v% M

( |  I# A# X' x! M% c& C回顾转移网关. l" R4 I/ ]) [
) @0 G$ O6 |4 W# a" P7 R/ A4 t/ W4 }
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
0 ~  R' H' K# U$ T
8 e" {6 ^/ n0 sCharlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。3 e  {3 ?( z8 N
4 K) S% F- c" l- b+ W2 s2 H2 c
然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。# Q$ I2 {/ z' O7 t% v2 E
# h. n9 z9 i0 V% G
Plasma Cash 有何不同?& T4 m8 Y) T9 X! `$ y$ {

- @; B- f6 w2 s% D: Z5 HPlasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
- s  Z" i' M! Z3 Z2 j5 V
+ k: ~* w3 @) h; QPlasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。
6 D- y8 ^, \" o
% K! A% p8 s9 L; B用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
& Q& D$ |3 a8 ~. `
  P+ Y2 \1 Z5 J( B' Z, J, j1 |$ f该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
1 ^2 g- t( M0 q, L7 O$ a
' t! Z" c% |5 r* y2 d, {PlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。
$ I* E. S- }) g7 n! a
: Q) a) ~6 N4 I( f6 [6 j; {梅克尔证明检查点
) R1 R& u$ L: j, g' _8 K& I; ^0 N0 @6 i$ y( k0 w0 L
Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
  |( d/ i. c; ~$ P' B2 L
: [3 S- Y$ b* g* l- E在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
* J3 I# F& p. r! _5 N, E& B2 u+ C7 R, e
想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
5 I) M$ U$ b* E& X) n, w" @) j6 L8 b% l5 v5 d, i$ K* a
节约时间和空间
: ]8 v) [% @& h7 k5 s; q# g% a. f4 I5 B* m/ I3 [
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
( |& ?* K3 u* ?& r, d$ _& R/ C7 Y  j
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
4 B# a9 l7 [2 I; e6 g8 W
% ]; Y- z6 d2 e& c' X梅克尔树示例
) j' f  I$ R  _4 s! A4 k& Q
- i& b- J1 J4 C, n* B例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。8 h. C* k2 r% n" }
7 L/ }" m. f, g+ Q$ E4 D1 G/ H
因此,这个示例中最终的梅克尔根哈希就如下所示:
6 g7 g6 W. `2 B0 Y! d3 S2 A( E% P# I1 M' c9 O- z
Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )- B" g- e9 |6 _2 a* ?  i

% v- `/ o" t3 @0 K& \& S* g由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。! R2 U. q# V8 ?0 W! R! D/ f

6 `/ C0 M3 e4 |7 z5 N例如:$ N2 d4 F, w& \

' U' e- J; {! U; E, p验证事务K是否包含在该区块中4 B5 w) h; E' n& H

. P6 G! x5 T7 D- B- F0 m* V+ f如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。: Y( k, V: \1 ?2 u: m# v

- q: P- m& v" N9 F梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。9 W7 I+ P4 R8 _: E6 h% ~- w, ^9 ^0 e9 F

, r2 D1 l  K/ n" J我们可以在这里看到节约的空间:
- m2 {# b4 g' ~  e
  ?' k: r  C5 |. J2 J) Z( Q2 D梅克尔树带来的空间节约4 G$ M6 b8 P( Y8 o
; Z9 R% l$ |& @# i, r
为何如此重要?0 @) U( ^2 s& P1 R0 h, ^
* q) `$ r7 e; k5 ]3 _+ {2 q
通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
. w- I) }" _0 I# Z
! j0 U4 ^: H% W, X2 B' `3 fPlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。
' z2 ^- ^/ r  v8 |) ^9 Z
) l3 U, A% d* j/ [Plasma 退出4 @, `/ i, f* }4 ~9 k$ e, I
2 Y# E+ U+ Z: p( }# t
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。' @# i) y! L* l' n) ]
  `% ]; Q& h; `2 ]+ i, b
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
5 g; U7 r5 @5 j8 e* `0 X4 f% U! Q/ l: S. v1 [/ u' e; P. {
在此等待期结束之后,该用户的代币将在以太坊主网上可用。
$ T/ q# T$ N- V3 ]6 L2 y6 z
: V8 N" }/ {* [, bPlasma Cash CLI
/ F% ]" i& C6 r1 S  a+ O! k" R- Q' o! U1 x' s/ y
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。
( f* L( s( g+ |% y
: P, `$ Q  C8 |3 j% S: h你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli& I+ v" X! t2 k7 v, w2 c' X! k

. [/ v9 K0 X6 {) a3 W3 L这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:- v& X7 K+ i4 n" E- H4 K

, ?2 g& E2 g6 r3 X/ B$ npm install -g plasma-cli
. e/ R! c+ y  B
+ S2 I1 X, Y) d: {如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。
  p# ~* V& }  e1 h8 ?5 O5 ^, k
7 c+ I8 I8 A: l" p- e在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。& p! p( n3 O- U; \

9 u) b0 h5 g7 H% k# f! \/ M一个合适的 json 对象将包含以下字段:
" [/ i3 u- w3 U" C
( e5 D* H( `" u) k9 K2 w{
! N4 {. A' o, M+ \  o" l; c- Y/ Z% e+ a. R  ?
  "ethPrivateKey": "",1 X2 j( d/ F8 _* i
) E( b! L6 w7 h) e' x9 s
  "dappchainPrivateKey": "",
8 V4 R' U) R$ k6 X' e, @+ Z3 @- h; r% m  H) c: a
  "plasmaAddress": "",; E1 V8 f1 T1 g, [( S
1 c% C# y  u% H, O' s6 r' a
  "startBlock": "",' ?. l, v4 H4 G0 a9 o' W6 v& P8 }2 J

* U" p$ Z/ Q% y  "ethUrl": "",
6 s7 {. p# B' _) d! l: l
2 s% c9 D" M6 h" a, [  "ethEventsUrl": ""," M7 S4 J6 O1 B# l
/ M0 i  C; S. I) ?* s! g7 o
  "dappchainUrl": "",
+ }" |, X3 u: M6 ?. I+ O4 T) v0 {3 C' F: J  ?# t7 C) ], j( f
  "contractName": "",
& e. O$ p+ k( N8 W1 n$ T3 ~& g$ z' A' r. h
  "dbPath": ""
+ y# L# Z2 ~* J$ j% s9 o7 C# f6 C' K
( P8 M0 {/ |8 c$ D$ L}! w/ q1 @: l2 T) k% m/ C8 W2 s

! u6 {( E/ }2 F我们来分析一下每一行的意思。
0 w/ x3 w- v& h+ C2 G1 k# ]3 ?2 c( x
ethPrivateKey: 和你的以太坊帐户关联的私钥。5 E9 l& x8 v! |

; [' q/ y( x- VdappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。5 r6 [0 H5 [- n! d) f
$ F* L3 x7 l- V  P; ]
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。# u3 l5 a/ q5 w; ]1 V
8 M( D& ~# D4 q7 z
startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。' \' W2 h! _! |7 u/ q
# A* W) d0 J7 m- V& Z, j
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
" B0 z( m& k0 I" d8 F1 `. ^7 O- P! A9 s- K. B- {+ p
ethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
- r/ z6 j% \8 C, l, H5 F4 [1 a& [% R! M; O: F7 w
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
% |1 S3 m) c$ {; n- Z# E( [% T4 R7 z4 [  y7 B9 r0 u( g4 {
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。
# b; t' }1 ^  N6 W3 E" @. [4 E2 t* n+ r( ]  z1 A
dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。; `) T2 q6 b( ?; J2 |1 ]
  ]' c6 K) O9 a1 L8 Z' a) B* P8 ]
使用 CLI 进行转移
3 f4 A0 O! P% F, J" G5 e4 B1 P
5 U+ F" a2 E# i当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:2 V7 e# T7 K) t( T; R) o$ k# j

% }' j/ j; x7 u$ plasma-cli --config config.json& o9 F. X# k: |$ e. T* }
5 I9 S6 e# T1 ~  U% S
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。3 I$ p- b0 P$ {7 a) k% B
0 ]* d% k* X8 e2 T7 k+ Y/ n+ R2 N# i
如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。+ `; r* U7 Q: z' [

( g4 S- Q& L! ^* u! O- j注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。' x9 D3 ^) K) S; {% f1 g

7 ~+ D& S' O* p/ B$ depositETH 1000000000000000
" J7 K1 y1 J& F
0 F( o: b3 [( F$ O大概需要30秒来确认事务,你最后应该会看到类似这样:$ `# F( X1 z% T" T8 W

3 ~/ B( n7 X, s3 t; A2 ?7 I请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。: i5 H- B  d/ c5 w2 [) e* H5 D
( H6 P5 a' m# _" U8 q- Z; X6 }9 R8 J
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
* z* H2 D. q0 ^# {$ I: f! n' Y8 W' v$ I- [! W
如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
$ M' t) |. [7 g6 V+ ^4 e
  W4 J; t: d7 O# e, t  t要把你的币转移给另一个人,你可以使用:9 y/ H& v; e% {2 m
; Q1 R# q/ W# |0 h! b
transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。
0 }9 b) a" ?" ~( o$ {; V" g
# m7 Z) N& Z# g5 u这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
* X* W# }. ]  u1 Y6 @
+ v! D5 e( C- `3 Z0 g0 a: L- H要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。
( g3 o$ M- L! z! V/ l
5 }- `* ]+ J0 R% K( k5 c0 `退出并最终获得一枚币8 z* I6 @1 C% V1 n4 C9 r
8 }/ ~; t" V: W7 {4 l0 Z
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
8 {; G) l0 k4 k/ J9 [. _  _! {, W% h! `0 T$ w! R( J4 [
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。8 S. j3 m! g6 ^2 C/ D) f

% d) p1 l" O% [/ R  f就是这么简单!$ N: f; k) [) n5 X7 T

6 v. D8 ?) O) u希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。. v, I1 b7 F+ k$ _

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

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5