Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。
# g! U9 T; [  ?
' J; P2 g! c/ @, U- wLoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。
: E' Z- X( d' f' V, l
2 d9 B8 }( b' [在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。
$ I, w2 y# _: N0 e, o) ^+ p6 E- B
4 X0 T8 L7 K6 `5 y1 S+ _; M简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。
1 G5 C& P9 S$ {6 t2 Q* M
; }+ ]" R4 k7 B  m3 A4 @Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。
2 e% c9 z7 O% s) f4 C3 w' C+ C' `( l$ \6 k: V
让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
; z/ v  p3 M! O. K% {- }. l- p  o: y, I0 L
回顾转移网关$ x  O7 n. a8 ^: B& A  V' x! C
* S+ f6 Q+ k/ X6 k# c* m" ^
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
( d1 F; x, v* P  N8 u: a3 W# y, k( K( o' s! O
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。9 @0 P' o) a) O

* e2 ~% A# t& O然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。4 P& e  H( l% x" R

& j7 z  [6 W$ M1 ~/ uPlasma Cash 有何不同?- g( c, O9 `0 q
* [; x! |6 B! F
Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
" z. X7 g! j- V$ @: I6 X
6 j1 h+ J, c* t3 b1 R' N' WPlasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。* H+ p3 E2 |9 E

$ c/ t, }4 f! d7 f0 E: M9 k; |. N用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
9 S$ L+ x8 O" k% m" T# y' q) e8 j% A
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。7 @" h. s% @. l( d$ H% [

0 E* `8 e3 P; H2 X( m6 h8 ePlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。0 b1 y1 j. {9 m( P2 s; ^
4 O+ Q- R/ m: E" L
梅克尔证明检查点) m3 a& T$ e0 r2 v# l: T4 s
5 q4 j+ W, L2 `
Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
) V# n! N) P) y5 R, X8 s( ^3 u  \/ @# q' H2 w
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?5 G' {. r) \# o( w" {, G% s; `, E

* R  o: ]2 z/ S. a0 a想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。; n% D6 s& ?9 w: V, C( u+ a
' M8 J  h; M$ s
节约时间和空间5 R+ N. T4 }( B

' U  p. i( s$ F为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。# M' P1 ~' @2 a7 U
; [7 p3 T# @0 w0 P! p" _
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。2 ]- `& J- V" o; l% {
: J  ~/ x/ e9 |2 P1 {- g
梅克尔树示例
% ^) r/ Z, q4 e8 K% D% K
  `: {* g/ h& m, F例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
+ t+ O7 N. [4 I8 [9 q9 y+ }# e. [$ [) n7 ]' u
因此,这个示例中最终的梅克尔根哈希就如下所示:. J. C0 P1 J$ z0 A, a

- O% W3 N  g4 q# t. x6 d6 ]' }' O% gHash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) ), _! S- c& C; P+ [- \

. a# R! e( E" t6 n2 {) e由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。
& T. q& M9 m: n6 W( i6 J% F- p' u. U) Y$ N
例如:! [9 x) G8 M9 D! Y1 y: J* o4 g% q
. Z. o6 y2 l- p8 i. J
验证事务K是否包含在该区块中
) P$ |/ }4 ~! P+ v+ k" `
5 l8 ]/ V4 F0 K0 W$ _如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。& l; [4 z. ?7 }0 @- ?% Z7 Z. L

( y& ^, p# k' j5 A8 Z' [梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
2 v0 {+ A# e0 Q# l. F
1 Z- `! P$ `9 I* H/ k+ P我们可以在这里看到节约的空间:
" t8 m( @9 r0 d
( M% r& q  H5 V0 v4 S梅克尔树带来的空间节约
" F+ h7 ?2 @4 S( R5 N8 ]2 V0 z. G
- V, Q' R% f7 \) s9 f9 Y. O为何如此重要?0 }: ^) `& {: x5 ]9 H

& _. C( K! z; H. X. k通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
9 z2 {, s1 W1 J
2 q. B; h# R6 `9 F- K2 jPlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。
# O/ s' ^! K" b6 `, O* Y2 z$ c) s" G. `
Plasma 退出
, N0 P  _# {7 p: P# _' [7 b" k+ \- {1 K8 f" ?. c
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。6 ]  P/ Z! j$ T/ F% `' M) ?
# ?- p5 l2 b4 G4 x/ ?* x  X9 t
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
/ z4 S6 C3 u4 b$ b3 Y* W1 q
/ U/ G4 Z/ a( Y$ M+ L( W在此等待期结束之后,该用户的代币将在以太坊主网上可用。
" b2 F" X0 N8 \+ D8 u- q2 g& v0 Z# a6 ~- \3 H6 a$ S
Plasma Cash CLI6 y3 F2 Q7 [' V: t( J. P# z

! G% l" I6 ~9 _( ^$ L4 Q2 Q/ H* r好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。
$ L$ C) T' q9 u7 ^5 {8 n# Q% C
3 [& C4 V6 t2 r2 U4 Q% Q你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli8 F- u. E. |$ I- V# W

% o; W' y: h! X4 r+ c这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:) r) M/ |: I; k$ g" P5 r
" r6 r1 g7 U7 |4 _  ^
$ npm install -g plasma-cli
9 N" p. X8 j6 Y& F3 F$ ?+ d0 U3 x7 H. d+ l  U/ C% Q
如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。
0 a: v: H& k" O1 I/ ~! Y: q, z% n9 l6 V+ ~! s
在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。
% C- h0 W) n1 F. \$ l- V. I, i7 l- _, P9 ^4 ?
一个合适的 json 对象将包含以下字段:& v8 n- t2 P! M  u8 z2 m
5 w) |  g5 T+ k& i+ D7 b" H
{
( B% A" l5 {7 V1 b3 W6 C2 x: @( v- y& P6 G! w9 K
  "ethPrivateKey": "",
# G# g8 X3 R6 K: E# \( b0 {  k
  "dappchainPrivateKey": "",. {: o& D: P8 S
$ ]3 r! Y, o% E  f+ X
  "plasmaAddress": "",) [) o7 E- a2 O' Y
# a) w% V2 ^* o4 ~
  "startBlock": "",
5 X, d" Q+ [6 p6 P' L' f. h, ]/ q5 t
  "ethUrl": "",
  F- s6 k. \  A& D$ G" W6 J0 u5 ~: b
: Y. S0 N5 u" T. F9 M1 M  "ethEventsUrl": "",2 M* {/ x& @. j4 `) \* q

' S$ E$ ?' b" K( ]  "dappchainUrl": "",
+ h1 R: n) i& e( V: j- s, V6 s, t
$ L% D; u3 J) B- P2 L5 Z  "contractName": "",$ ]  W6 A6 b6 G5 m8 Q/ A

1 Q* D( K: l6 L  "dbPath": ""
& A  S1 n/ y3 V# J- c  U, a/ B' X6 u' Y
}3 m$ k/ l% L/ X% _4 _) J, d

& f7 j, q! l" W7 a; n" T7 K8 I我们来分析一下每一行的意思。9 s* I0 u- s. y

$ {, q+ {& w4 k8 p' d: m% _6 X) ]1 x" x6 cethPrivateKey: 和你的以太坊帐户关联的私钥。  G- V% }0 {3 H. X. G0 g  Q5 `3 g

5 d% W: z7 L3 r; s1 a: q) [  LdappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
$ L' Z; d3 y# C, y' y6 `. B' M  W8 T1 N% @5 s8 K
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
  c2 Q; m/ E; s- A2 ~
" w: F+ w* Y2 B+ ostartBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。# B  ~, W/ M" Z% f& X) Y1 L
. I* P; g4 K  D0 [; K4 l
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
; o$ c6 J+ s7 H* s6 f5 m4 `7 D
- h% e, k& f0 KethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
/ m5 k; i! l7 r& G1 B& ^, `- m/ u! H9 D( ~' K! T+ P
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com; O# I# V5 p. u! u) @

. |. j  n2 m; T, XcontractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。
, D. t6 A' U. a! A# Z. n! y2 g' k4 z2 ~/ p/ O/ }
dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
2 ?' O4 I  P- }! j4 V& Q
% `/ j  h4 b% ]; |5 }% P0 d使用 CLI 进行转移
: p* S* k8 j6 s9 P+ O+ Z8 k
: w# X5 O- _8 w/ O" x% q当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:( y: r$ C* s! x. l' p# c- `
8 V4 g& M. ?$ Z7 `4 t
$ plasma-cli --config config.json
$ U8 T  u% `& s- `6 V- Q9 ^: ^$ p" _0 F3 [7 v9 W: \! ~8 B
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。8 L8 `3 O  L1 B( S$ e; A8 ?
7 L, }; O1 _5 e) G' ?. V' p
如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。5 K3 S) p6 @6 j' C+ Z- ?) ~
0 Y" a4 l8 y  M2 V3 d' `
注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。
6 m0 F; K  W) E" g# S3 Q3 W( s
( S9 L0 Z2 c' L5 P- ?$ depositETH 1000000000000000
! V" W1 e  s0 h3 H* {9 Z. e% y( q% ?+ D; @
大概需要30秒来确认事务,你最后应该会看到类似这样:
6 c; I8 J8 @) |
5 Z5 h% Q2 D4 i" y8 X: u请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。
" Q2 I2 d/ m8 m; R) {# z; L! ^# o+ g9 e2 E1 ^/ K& o6 X
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
" o4 V* a& y9 g7 C: U+ u- N- E9 D4 w. p9 m8 l; }" R
如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
, U( U; ]' m. j- W' |6 g- B- B# C
$ h) ?6 m$ v" v( z; m% D要把你的币转移给另一个人,你可以使用:
" O1 |: N; I& d% v8 x& Z
: P/ s, a. L0 N0 b: Q0 }transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。9 p3 A9 h9 b' R+ c2 u& h" ^
  o! p  H' E9 _5 W( N9 y# }) @2 |/ q
这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。/ f0 V  s& K. @! Q& {

2 k# c! r( P& E( {- X要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。5 K% F- J3 h5 t' P# Z7 w& b
. M$ q  A% h" f4 ?
退出并最终获得一枚币3 k" e( D1 [& X3 G8 q
7 }  g) w8 [/ k# Z% U
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
& z& J' g, k8 ?4 p* z& A0 C2 c5 Z. y' S$ {( @" f+ T2 F+ I8 ^9 k- v$ e
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。- M) X+ _' j/ }9 }' z
" X  K1 B5 T( `1 [5 H
就是这么简单!
, @. u4 N5 _& n2 a% t2 M4 E, q- P9 b; q* H+ ]. d
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。  i0 Z# B1 s4 E; ]

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

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5