Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。' q# |1 ]5 A$ R4 U1 B& u

/ |8 Q1 Y  t: {* c2 \( i/ E! C- w9 uLoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。& J2 ?- m) m2 T' h

5 g, R) t0 n! I: ]- B  p2 h在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。2 f6 [; X9 L1 N9 j! y, g
1 B. _2 I8 g. Z+ R
简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。, @& u& {  }% ?
" C" k3 K' Y& I, Q- L7 M' h
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。
5 z, ^0 x  M- Y6 g9 C
& |$ G( r  g% U7 p  n$ U1 |# ^3 k& f; T让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。0 d, l/ u7 Q. d" ?8 u! X  S1 [. R
4 N6 H3 S0 \$ w8 Q
回顾转移网关
% E7 Q& E+ D" C8 u( k( [
- L7 v2 S9 ~) C  K转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。7 N6 \- @( T! t3 H
8 K. W' U) W- M. F5 g
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。
: ]: n1 y% ~  u- M+ e" @7 K* M
3 B; Y1 L, S  j5 H$ N. T7 f9 J1 d然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。
2 U* N6 j' A  \1 E! X1 Y% L( a  r1 Y+ I% R
Plasma Cash 有何不同?5 M0 g9 U9 o) x# U; ~  M

1 ?! k" ]1 F. l' \% @5 S6 jPlasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。* _' n6 w# M: A6 ^

4 ~7 [# n6 I, q+ GPlasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。9 B) G6 Q: Z4 h

+ h8 M% ]7 E5 {* F& G; y用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
; _, U: w& z6 m% I: ~( W) H( s# O. O: c2 X. M
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
+ d4 o* {0 B( g, g; G) |8 T  e  S6 f( H$ R! q
PlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。
4 |* F1 N* G5 z- H3 [9 m" A/ \" Z3 c" }2 X( j) X
梅克尔证明检查点
6 M2 a/ ~; s: P1 N. E
+ Q+ d3 V# v+ ~Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。7 k+ t8 x9 V9 O+ Y' Y
: z( ?, u0 |6 e& l# a* K# W) z
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
2 n8 N' }8 D  Z" @$ a5 ?! y0 M" P/ B' ?, S# ~2 X
想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。! c% o3 c  Y* R, j
( [/ T; a; ^( h! X* W8 ]5 @
节约时间和空间
2 o/ C5 o8 W4 m- Z
& M( u) N' [6 I7 _  E9 ~3 \3 X为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
* L! f6 l0 W6 s3 R
* G$ ~! p3 O4 S$ m5 o/ k1 {一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
2 Z  N0 J# o8 v+ R  s( d3 `4 Z& R; m. J% _
梅克尔树示例
6 G6 p! @1 n( W* H/ U) z, F) g9 u( _% _: x
例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
6 Z( |. I/ F$ A# {6 P- o4 d$ m
因此,这个示例中最终的梅克尔根哈希就如下所示:  J  Y% }/ y3 g' N
! N% R1 Q$ C' o# B
Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )6 Y9 R- C  j; R) A- F

8 a; ]  D3 Q6 Z2 s; p由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。/ a: k( \  n( X
2 O/ e  x  Y- j7 X* |# a
例如:
8 S! N* S. v, [4 S2 ]  @! P- F+ I) y5 R, O: R1 ^! P2 O4 B
验证事务K是否包含在该区块中
+ y# X7 }) [/ D9 F9 _+ [  w, R9 o7 e- i7 |! X2 k# r$ {
如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。# M  V: r9 X% H! b
' Y9 A* ?* s( k% W  c) x
梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
5 Y# t* T% j* y  O' l. k' A! _8 H( r' Z2 X$ R6 k- o
我们可以在这里看到节约的空间:
# ~$ f" ~) Q8 c* R) l  y& ^! W6 G4 `% U1 ^4 C7 I$ {
梅克尔树带来的空间节约7 E" I  V/ w0 o4 U* r% a+ K. Y
. m' O  @+ D  _6 N
为何如此重要?' X+ Q; [# S: @* E: v

0 d. m- Q$ o9 l* g: Z通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。, ^3 f* g$ K: b0 [/ j
+ Q8 ?/ `9 A) P6 i# @$ c( ]
PlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。
5 c" _' K4 t% S8 F" l
, O' w. U2 L& M7 dPlasma 退出
7 m- B$ S$ s7 R- `4 j+ V; J# y9 W" M3 m, F0 m  E  ]
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。8 ?$ s7 f. u, z5 D; c3 z9 |6 g4 k

3 L1 l) ?* E' A+ i然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。: \  f% Q5 j( {& G% ?
- f4 X5 W! x: E0 |2 A
在此等待期结束之后,该用户的代币将在以太坊主网上可用。! G* c; a5 v2 V$ W4 u7 R

  n( X' x4 c8 |0 V9 p, L* APlasma Cash CLI. f8 @6 ^/ c% ~5 D
# w6 L# @1 l! j  N
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。: `, g0 m' |2 }
5 P+ N/ B6 Q' w- B
你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli& l9 P* B( R8 o. i* u

. `7 t; e' }/ t: ^* O$ v这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:  s/ j* R1 Z. T+ b/ C

# P' S5 }. A. r$ npm install -g plasma-cli1 `4 O+ R6 ^& F5 \$ h+ C- j2 r
9 X5 Y. B, ]! z+ |  C3 x0 n* [* m& f- K
如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。5 t! Y5 z$ v( t: M/ [/ x( K" T% f
/ T, I8 f, V! S/ n# `: U
在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。5 V4 A& \2 ~* v' b8 f

, Y! c5 ]% E( E8 _: ^9 R一个合适的 json 对象将包含以下字段:
$ t/ l) y1 v" Z2 |4 h9 L6 C
4 o* H1 ]& s! j" C{) Z' s* d! `/ U8 I& u% M$ q. \& W

3 u6 _& L" k2 I; K2 _) u$ D  "ethPrivateKey": "",
0 T7 Z& H: I9 q/ S/ H; L7 }3 B  [" K7 ~9 t5 _$ D- B+ R8 n
  "dappchainPrivateKey": "",2 o0 r1 Q+ x& u+ `5 X2 t- Q

% M! _$ P, `+ k  "plasmaAddress": "",  m% K3 R* Y' s/ ?
. S9 S! H9 D$ A# S, R6 M. X5 b: f
  "startBlock": "",% U" }: H) V& M) ?* V6 v7 F( v
: s! G9 |  y0 [. x
  "ethUrl": "",5 L2 ~( Q! V+ O! Z+ m: ]
: \# ~% @) Z8 g  I& g1 r" O5 s6 f. v
  "ethEventsUrl": "",8 K" Y0 S& w  R" u; l' ?/ P
( ~  b+ v: d  ]3 y2 N5 U2 e8 e
  "dappchainUrl": "",  v' K$ \: G  c4 k: h* U# {

, f9 B  N* e/ n5 y% C  "contractName": "",$ j2 i; P) w+ `! c/ A  N9 t$ T

) C4 T& r' T" o. f6 e  "dbPath": ""# q. ]% a8 ^* D+ S$ z" y
1 }- P( U( |& F& U. Y' R$ a
}
- d/ C+ Z( a% W+ b7 D* i! m4 [1 P) T' S, ^+ J# ~& W1 A* D
我们来分析一下每一行的意思。/ n1 b+ r- o! `

& s3 o1 y+ [/ JethPrivateKey: 和你的以太坊帐户关联的私钥。, F& W% k. I. B- l  C6 z
* _. a. o! c# Q: J1 L8 v
dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
. \  b/ d; a' ^9 G& e! y
  }% V6 t: u0 g* o3 TplasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
: G* b/ A( Q/ Q' b' @/ b) t; @4 H$ s$ u/ G" ]. B
startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。8 _6 W5 ~1 j4 k/ q

' X6 e3 i7 w1 H0 X. S' U! ueth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
$ d' c9 t" X3 @& o: Y
4 d1 ^% a" ^! x# B7 N, tethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。; l  \, D) d# i. P0 }$ `* x
% f/ w9 ^; e8 \0 e% m5 m
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
. o) h( q& @7 C9 q# B
/ A/ p: j6 u+ J# Z0 ccontractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。
. Q1 ~6 t, R  u2 i: j7 p' ~0 m8 F% _2 t7 v7 S1 D
dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
$ f2 W' \( D# ^) M( H9 n% p+ a0 @/ e2 P+ v; F) I
使用 CLI 进行转移* I5 l) S9 t& W- L4 s8 X, Z
+ u) E) c& q  e. n# Z! E: K
当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:
# {' F: [9 q0 J* J& y' X& B' G0 w$ r2 c0 ?: |$ b
$ plasma-cli --config config.json: ?( c0 t% }1 c8 ^% y

. `2 m5 S/ J! Q  Y7 Z2 h& R你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。
& p1 b) J  l; P# g3 N5 w* i5 i' n1 B" Y
如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。
7 q8 k& K8 G: D' F/ j/ `2 w- M" m. u, S) w2 x" I. Y: D
注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。# `6 p2 T+ b- \+ B) T/ r
. v9 r3 D; {2 ]
$ depositETH 1000000000000000* ?& t( @- L( Z$ }/ Y

) J# s/ J. ?# [1 d大概需要30秒来确认事务,你最后应该会看到类似这样:
1 [# |4 K! S: s# K, g9 C
8 [) H# g, j6 X1 a请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。
0 I, I8 }# I( r- A2 V6 Y, ^- H' y3 E" O8 y
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
# q. {5 a" c% n4 e2 Q
4 R4 R, A* w& v# c如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。( }/ c& ]; O* D- r- _3 b% b
0 d; g7 }+ x3 B) G4 G% @- ]9 q
要把你的币转移给另一个人,你可以使用:
, k" W% c2 |; o" c4 S0 p: U
2 _- b& W  u7 z( J6 X3 u' z. Htransfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。1 H1 }$ j' S& P4 V; Y  O: t

3 \( d  v* c- `  D" J这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
( z4 j1 ]2 \" U- S( [9 B; F7 _$ |% D! T: d  }# }0 c2 G* Y
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。
, N# c' B9 F5 v3 h% ~, o8 H! L" K- m1 \" m' v: |' M: \6 q
退出并最终获得一枚币5 \$ L+ s4 x- w9 L. @! n: G! V0 K

/ l& f* p7 r+ ^+ b首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。8 R+ B" K- X$ D, F! J; i) K% {1 ^
" r& ^5 o+ [) O6 M* e4 y: g
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
5 E; m8 }. x2 l3 o
  J: \8 _- ~0 \' F  M5 W5 P3 e就是这么简单!6 ^  y9 }0 c+ g3 P7 q" t# y
: D3 ]3 w7 @/ d% h" o: m4 [) v6 j
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。. I# U  g  R0 U* s7 k4 l! h% C/ }
/ |5 T0 v6 o. z7 H
Loom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5