Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。1 Q% l  A  x  ~; v( p; d0 I3 d3 ?

: X8 h: Z7 L& ^2 x  h" WLoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。* y+ A) s9 `# v! Q& E& t

) w* ~: g! d" ^7 ^0 J8 ]在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。3 }. o8 r% s9 P' X2 V* g

8 x9 f9 l8 ?# }2 V简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。# L3 o6 s7 W* s: h; L1 ~. j
8 n( E5 Z0 j2 }( J$ G* K. }! {2 ~' R
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。
" k5 c; L6 w$ c# U! c% Y, P
# n* M) a  p3 H3 b让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。! U+ i: O" ^/ z. t% [5 [
/ H9 ]& R3 V. B) B3 N+ L. L
回顾转移网关
( D) b+ o# M9 T  s5 C6 e# a+ n
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
6 E( ^! W' N7 {5 b! V7 L' v  B, S* O7 K7 @
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。
9 d6 @7 m- A: e9 {1 U# E! ^. n* g0 U' U% Z
然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。# }- }9 j# b7 b+ n; V7 G( e

+ {4 ~7 Z: M% |9 P3 H. e3 T/ A. ?! Y& yPlasma Cash 有何不同?+ ?' Q+ n/ |, C
- U% Y% C+ K, p" q7 s- Q
Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
( O7 b2 ^$ N9 g' ]' G# f7 s2 R) h3 o: n" _% M2 D1 M/ i
Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。2 U9 b3 H- `: G# v2 b0 |
; p4 R% P8 L/ `, o* z
用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
2 e  q4 y$ M( X/ V5 @$ D0 q) G# F& P$ \! r- z  Z
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。& S) ~4 s7 c) [" ^3 K" Z0 s

2 K$ S- r* n- i6 }) X$ j  j3 R# bPlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。3 }8 c) i' X8 i* X$ L: A' Z. a
& S9 f+ P, ~6 e$ H/ a3 L# c% Y
梅克尔证明检查点7 W5 ?% d8 J: M0 G* E. @

& S  e$ Q& ?8 c$ R5 G4 ~, }Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
  a2 W/ y( R8 w8 u! X& u2 G1 q7 A3 o3 M& l# r' E- }7 ~9 u
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
" v  S! ^( m0 U- `! u! Z% ]
- Z- n6 f1 V2 P1 p: K% _2 v想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。2 P) c- G) d7 T

9 y5 n- K: u- B8 F4 e  G% f) Z节约时间和空间5 k( z* _0 @+ v4 u0 I) _) C0 \8 e
4 u- Y8 ~* _1 c7 {3 d1 Z
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
" Z5 \. U( i6 J: k0 F2 K$ p2 m  v7 h: n5 c/ o5 c# J
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。7 v3 h; t# {, I# F% F
- a1 W# t2 T# d/ P
梅克尔树示例
8 O: ^; _4 k0 H' W6 f! D; {1 l# V& i
例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
" X  E* j7 }7 {2 U
  T* o3 j) D8 o+ D7 I: `& r因此,这个示例中最终的梅克尔根哈希就如下所示:
, q% q' x. q  T8 O/ B/ R* Y. Z! k  N2 M! C, Y4 d
Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
. Q& w' x# ]0 }/ }% O1 e
3 `  o4 |& U5 v, ?0 K由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。: s7 ~' O7 K  L* d: ]

" I6 i" O! c1 K% P; ]; f例如:
  O% p$ x( N: z- M. ]7 m# Q2 [) I9 U( U% J
验证事务K是否包含在该区块中8 L+ ^" m$ w7 ^4 e. h# H

+ X. ~1 S( _- G  S9 C5 P  i5 ~如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。- O# \; [% C' S1 z
- J3 }2 U/ P6 W* b
梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。9 _& H; C1 I& p# D: T
$ N: h- ~) ?3 G" f0 \
我们可以在这里看到节约的空间:
3 o/ s0 u3 ?1 O5 K9 b8 j' c
! y+ m# i9 y/ N* j3 z3 W梅克尔树带来的空间节约
) Z( U6 o. d% T) x  C& o7 P7 \3 M
% l; X; y) ?2 g+ i& [4 M为何如此重要?
6 `. P4 s" s6 n8 ]* m1 ^
! I1 W3 `) J/ W( O% F6 J5 J通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
& ^, d( E1 w& N( |/ F& Z  i2 h1 T1 f$ n7 j6 c5 C
PlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。; ]8 s! N& e/ U7 U; ]
1 D! ?" s! P# v  t$ w9 y
Plasma 退出
* D8 ^# t. X* m9 }- a+ d$ F* b, N6 k. ^/ w4 R& {* {- p* |+ S9 T( ^
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。
: w1 x' O3 l  ]+ S1 Z: a3 l+ \2 q5 n' O5 t1 F1 s
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。4 c, G% y1 I0 Y! K0 ~; ^
" ~8 o# r% u( L* }
在此等待期结束之后,该用户的代币将在以太坊主网上可用。
0 T) Q) {" c; J$ O1 D$ T$ w5 P8 @  K& Q
Plasma Cash CLI
6 ^4 X! m( r- I. G& S* Z
. F' Z# T1 ^, }  A  |. H好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。
; c$ r1 K+ ~/ R0 n" }! R6 L
( r, q" v  J! h你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli7 O  O2 o, |' G" k( }& p  J
. s- F, Q/ u  T! n5 ^
这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:
- B4 ^0 I7 d8 B2 ?0 c
4 f7 J7 W# I7 U1 F5 k$ npm install -g plasma-cli4 ~; j4 q7 ]( y

7 w* h# o# O# `: A如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。1 M6 Y" v! l: e8 ?& I
: T" a( F" |$ ~; l( i
在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。3 s: l  _3 [- Z8 b: z9 k( _! k

+ C1 S8 K) q; `2 B) a) N& c一个合适的 json 对象将包含以下字段:
. `0 K* C. J8 V% F+ q
+ B5 e/ |. u6 I' ?6 d0 ~- J{
. ?$ U+ z1 S4 h: B0 M/ u  o, G: F8 u$ a+ v
  "ethPrivateKey": "",- H6 L+ o$ r9 ]. [$ Q
+ [. \# ]1 T" q4 O9 W" J0 X
  "dappchainPrivateKey": "",
+ U! a3 c8 k/ A, Q# E% M
) ~" C% @2 e+ d* q4 ?4 r  "plasmaAddress": "",! H8 M+ L* Z3 e! d' ^3 O- S
: e0 J. x; M3 G$ E# [
  "startBlock": "",
& R0 p# c$ t0 I, ^$ \) Z1 a+ ^. v- [7 c! n, c( u
  "ethUrl": "",3 x" e; o5 {: D# C% L
( }' B# g1 u" @* b! n) H* G  |
  "ethEventsUrl": "",
) F' s4 ^4 r8 r# A% T& z# }. g2 `. B: G5 A5 q& I" K9 r
  "dappchainUrl": "",
! s/ \& h3 m& b
7 F8 C5 @" p* Z$ G. p+ y  "contractName": "",
+ B$ A4 \5 K- {' `8 H9 h1 R  k+ L0 ]. m' W- ]* \8 K- G# T
  "dbPath": ""
$ N: G4 g& W  ?6 w
5 J( P3 L( q6 D}
' m! M6 Z1 i3 R& G5 s" c8 S# ~3 w! V0 L6 d2 y# J$ g- p( Z
我们来分析一下每一行的意思。
3 z  ^: R" e4 l7 |  ?' ]5 }+ J# M
* S9 ^+ x& s# f6 E2 {& i' O: MethPrivateKey: 和你的以太坊帐户关联的私钥。4 O% }' H: J( U, ^$ d. h; S# N
, c0 U5 p: W7 T$ q; G* U
dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。9 x) R9 N. V- e/ e

: u0 h6 ]7 g6 [9 m! [& q' ?9 fplasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
/ `5 M2 q) ?4 y+ O/ n  i) }- w$ S$ f( M4 G& \1 z/ T0 C# T
startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。$ S: c  n2 }: W& @7 e
9 _# F3 W1 W$ F
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。, A8 i0 q# a6 l  V3 B3 H

5 r/ w, t+ V) |% e4 EethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
) E6 Z0 g4 S9 l8 `$ v& y( Q0 u% {( z. y* d2 _% i0 Y3 `/ }
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com. N" k; ~& q9 p, J( m4 {" Y  C
0 w6 h6 ]+ i; @
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。- C$ P8 G! H+ x( d9 k

0 i5 l8 R  c- O* k: E+ b( |  S' edbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。" s* |8 z+ N4 {& }
/ I0 g; Q1 w) {, ~  d; r
使用 CLI 进行转移
3 P4 }. Q2 h$ O" u8 x% V- ]1 u2 T1 z2 ^& @5 Q; b5 F
当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:
' |  n4 Y1 _7 p, c% h
7 X* X- ^7 a& Y7 ^, b0 N$ [$ plasma-cli --config config.json5 Y9 {7 h( L' T& w2 n3 f
5 ^: s1 D3 P' ?1 U* z9 N2 Z, t+ O, w; Q
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。
4 g: a. T) O! r! G$ C
; ?4 T( H7 L! a( @如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。
( O! @1 |' r5 e( R
! F, |0 f, r2 A注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。% r2 Y, u# H! w$ F% k
3 V8 t2 t) ]3 W$ E
$ depositETH 1000000000000000
6 X7 J0 W' G% P8 i" ?  d- R
+ F+ E" s3 I; ?0 I8 g- k- Q0 a大概需要30秒来确认事务,你最后应该会看到类似这样:& U% S2 c6 n* ?( B3 W  @
6 e8 G# ^. p7 g$ \
请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。
. b. b1 ~" T; n8 V& y, Z- {3 R6 G- F: _7 ?$ G8 z1 P! O# R
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
6 I9 x" Q5 q2 _: z
& }% ^: i% s. P  n8 @! R4 R# t如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
; H0 w# C% x3 D' e6 w! c. G: u0 m7 D/ `9 F
要把你的币转移给另一个人,你可以使用:
* n# @' R  b( Y3 M# ]
1 L5 ~( M! G+ h0 Z2 R! _9 Z6 |* F5 ytransfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。2 Q7 `; Y! p% [; a, I2 j

5 j. W) I& h* z2 ?- g这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
; d# t, k) {/ O8 E) F# {6 _
/ n# |- O# `: s( L( g要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。
4 _4 }5 d( g6 ?5 m8 f7 d0 e9 E' X6 n* ?( m: U+ ?" n" z' H
退出并最终获得一枚币
; o0 e( M, z8 @1 v7 ?/ m( }# w' W+ H- L& z% m  E
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。" A& m& o# f3 e$ W! ~- f
4 c5 b1 Q3 L  g! ?& T; ]8 b
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
- Z  `# x5 h; H) U3 ^! r1 {! p1 Q1 ?( t! i5 x
就是这么简单!! q  e) I  f1 h

) j2 v9 J: E; r- A+ N希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。. x7 Z4 _) {' y( A

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

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5