Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。% V, [; K# A/ N, s% S' t1 Q+ X
! u( a2 m" z7 K5 Y
Loom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。
  B$ x6 O- C5 ?- v) E$ U. }9 r/ S8 c# m# A4 z7 a
在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。) G; a; B! P% w& F

% H/ G  F4 w& @7 a1 e1 F简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。
2 d4 Z- J  d/ C1 v+ X( r! f; }$ m% U$ S. o- }- A8 P- j, r
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。
# W' v: Y4 x$ v' W: `
% w( V5 j; J0 N8 [% v3 @* Y让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
7 \* a- L1 K# P4 i7 V3 O
  q' e/ \- E. x, c" \1 l* O1 i回顾转移网关
) M- U. Z+ |( n4 J- m$ R; Y( M2 {6 l/ M
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
4 m* J- Y( Z8 I0 \% `0 h* J
" ?9 n! q+ j& n( kCharlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。
( x  W- q* ~- |: x
% U5 J& k; s. n& p" F2 C+ @然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。
2 o9 Z% p5 g2 s1 N# ?) c  X! w3 V) Y# [# c& F0 k
Plasma Cash 有何不同?# w' y1 N( W' X1 U7 }4 T6 H- B* R& E

8 X- y0 C: F7 c. ^( \% a' ^Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
: x( }4 A" E* X! w6 x) N  @3 Z" F! W: J' ^
Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。8 E# n* t- _8 e# \) B

! [8 X  s" {9 q. r9 a用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
: y  o( I! `, d  W- K7 t# R" U6 Z  ^# }( w
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
: t7 O3 M% \: h$ l; b
1 `: k" n. ?% }0 gPlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。" N7 [5 z7 |8 [" i) y" i8 T

7 z5 N) e' Q! ]- l) R4 j. w( G梅克尔证明检查点
& n; f& ^6 F3 L* }% U- n
0 U3 [( n$ K. yPlasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。# Z  p5 m( {' @7 Y. j+ W: S3 z2 u

, S9 t6 d$ i% m+ R" L在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
' S8 W4 v! _# B" T! {1 [/ h/ g3 d3 v2 m# K
想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
, a3 t( M2 b: K! R, F6 b, z6 i
4 {& l0 g# l' P+ P节约时间和空间8 U& F1 O4 c' @# I0 W+ x( N6 W

8 d; }! a" \& R$ H! v为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。3 n. F4 U! C8 Y0 N- t( Z7 {
" P. ^  f  `( P" I8 Q2 [: i
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
" `: a# G. f9 a9 P( E; M8 x; F5 `: ?' m8 A/ l$ j3 k
梅克尔树示例
: x2 D9 m: L+ _* l0 \8 e& b) g, H9 T/ M& b: e2 k
例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
; _9 Q1 i* X6 ^- U0 w2 D$ a$ j0 h# A
因此,这个示例中最终的梅克尔根哈希就如下所示:5 s4 Y) D' m) ^) L

8 i! g- ]+ c* @% w% l) f- g5 V; p9 UHash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) ). y; {" G: {" S! A1 U7 o, X

3 D$ A9 |- O& f0 N1 [8 b& _由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。. @4 I7 g( w. M, X! k9 T' I
' K4 Q# u* S+ e3 |. q
例如:
: T: A2 v4 p- P3 `" @) G2 v  j) D- Z/ t1 i1 q
验证事务K是否包含在该区块中, [7 M; `" w3 z% z7 a! a
# q- H5 K8 G7 o" d: s
如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。! M3 O; H; L# D! a2 z# @9 f8 b
+ N, j! s) k- S. f
梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。" P3 V# t" }- w$ l

6 {$ `; `0 w, D( v6 G我们可以在这里看到节约的空间:
! I0 Q1 j: X/ M. k" s$ {# a+ t4 Z- G$ \; q2 o2 y. O( O
梅克尔树带来的空间节约
6 h3 T+ m$ t$ W0 M8 n5 z! P8 z( T: @3 R" k3 z, ?. Y- R
为何如此重要?4 n, `) ~+ L2 j8 u0 n. u8 A

' D- h! `& s/ z" X# |3 G, O通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
: s- ]. k+ i* b$ X. ]5 D
9 Y' X2 t8 w! ~# C$ ?, V2 tPlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。5 I7 p, `7 m; y: _5 E; j
+ Z" t3 w8 `' Y* t  f/ C5 S
Plasma 退出
; w$ Z& z% @/ ]6 S" a* S3 \; A$ ^) ?2 S; {* B- j
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。' }4 l) t4 R& @& M: ]
' i- V2 {: Y6 K# V* e# W" e% E
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。1 O8 R* k5 N- g4 b0 A! f
( J* H" E$ v  D' M, {& X6 @2 p
在此等待期结束之后,该用户的代币将在以太坊主网上可用。' R! ~' G0 E# B" k

) F( v( m1 I: `5 EPlasma Cash CLI
. u6 p/ X6 M( q7 P! d4 M9 n% n; V4 k  Y* u' [
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。, G$ O7 F3 w0 \- d
9 J) ~8 f+ f) }
你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli$ {! ~6 q8 `! U' m

6 M' G6 l' L; o4 X这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:
* s5 V( d. P1 r0 c. P8 M! X6 z: K+ D' I
$ npm install -g plasma-cli% H! C4 O9 ^. G% y* \

# o" }8 L5 ?2 J如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。4 l# ?2 u4 m8 [# P

% Y& ^+ R/ P; w% `在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。* `2 g, ~# h) ]3 w2 K  ]

& }. ?1 X1 ~$ P6 |* n4 ?1 U: Y一个合适的 json 对象将包含以下字段:/ z! B- s3 m6 p3 t3 o) P# k
! z' s$ V0 ~4 ?' L8 _1 g" E6 `( d
{
) X* Z6 N+ X2 z, a- c( F0 s
( o" y" u" p0 B. ?3 q+ a  "ethPrivateKey": "",
0 L1 S' x# c( R$ D8 |
  x! G! \) C" \/ R# }  "dappchainPrivateKey": "",
5 p: H6 b# \% V  H; i+ e" n: l8 `
  "plasmaAddress": "",* A; u: R$ ]4 z4 f% C8 d' {

( ~/ e9 Z) w) Y9 R! `( h0 r9 w  "startBlock": "",
; {9 w2 i& C* S7 H2 \  G/ J
4 [0 B0 l/ ]+ p  "ethUrl": "",
+ k: p/ D. h* K8 H: x) [. Z2 Z' t# O" j- y
  "ethEventsUrl": "",, e  z$ _3 T" F

6 n# `# t4 }! p7 @  "dappchainUrl": "",
& R5 ~. L0 x! x) m0 C; Y
7 e7 w- l6 K( z. B- |  "contractName": "",
3 `8 X1 T  _4 n
0 B/ G& d! }, \, J  "dbPath": ""
8 `4 E: g9 E: c$ W1 h0 y+ U1 ]) Z; E
}
: P7 d# N- d# U& {: Q4 o: d& d9 B. _! o9 q1 F% o+ i
我们来分析一下每一行的意思。
5 `- l  {; P/ s# Q& C: t7 _2 @: T4 f0 O1 k7 ~- _0 G3 Q
ethPrivateKey: 和你的以太坊帐户关联的私钥。
1 n7 ~* D4 b3 c9 r9 b5 h/ ~" T+ ~+ M& l* O, D  o
dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
7 s( u8 n, Y! b5 |  P, g* h1 ?& z2 c: g0 s- y
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。# g+ _, s8 ?8 ]0 D

1 j: ?1 L! E% f  N! m( {& GstartBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。. [7 f' f( @/ m0 X9 @

6 v' W' _0 E5 K  Zeth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
' h6 _+ Z- m# A  q) f; Y
; \4 C) ^8 N' u, B. pethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
. f% C9 W* G3 @) u
$ J! A5 F( ^* X, ]dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
/ H  P0 v1 ^6 X  B7 J- i' K1 z: o7 L+ a, P( ^2 c7 W1 i
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。: @. [& B8 `) F9 C# d) \. p

4 O, t/ i: S- G. Q& U: D1 adbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
7 r! Q# Z- g% `/ G* k# f/ x/ |# M$ ~) p
使用 CLI 进行转移
% z( ?' L' d2 ?% {' A
$ r3 H  J8 `; B6 W; `当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:& ]& n5 B/ S- {

/ N% L  X# j# H( f+ H2 G3 l2 u8 k- l$ plasma-cli --config config.json
+ E: G4 W- m: s" L) X$ i6 P7 e9 f3 |) n2 [  ~3 L( p
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。' Z7 G! s, Y( g1 v0 Y, \7 M+ {

; ~- m7 {  S$ L( p  s" U: I" s如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。
7 v: p2 ^$ `8 T0 O9 Z: f! [
* g. |+ y- z8 ~" k: t注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。( m- I( {$ M( G2 b/ F
" b0 f# F; ~" u  q! l7 @
$ depositETH 1000000000000000
, T& X5 K9 a7 ]' ], r* V
0 p: o  n, V7 ?( H7 f" C大概需要30秒来确认事务,你最后应该会看到类似这样:
1 o6 L3 d" L$ ~8 n. E9 g: Q5 W* p" X4 l6 |- p
请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。
8 ?$ s1 J4 S1 o1 j" \: `7 T0 L8 F' ?9 B* ]6 E4 t" Z
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
% p6 ^1 |- y& f$ W
: |; @6 h, u/ J' |; B5 C& O如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。3 }% j0 m2 x" V. N- {3 g

# q2 `% O; M8 j% b; O要把你的币转移给另一个人,你可以使用:' _* p4 ?, z5 i# e

! d/ `+ W2 k4 ~' x" p) V8 mtransfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。# V7 C' h' |6 g8 H

" a& I2 v8 o3 A) A3 c这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
7 v* t) E' M6 ?4 d6 S
4 v- s; h" O( `要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。
- |$ J4 ]# n, F$ h8 g; ~3 K4 I% d5 s
2 y: A. ]+ |+ D& m5 x% u退出并最终获得一枚币
% g( p/ O; |  n7 h" B
7 C; t7 R4 H( ^, k# `" r+ h7 P首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
/ T" o3 ^1 o5 K0 B
2 q/ f  J; E. v  V质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
4 t" L  v9 Y8 R3 P
: y' r  H( h/ X8 X' ^就是这么简单!
* Q, S4 ~8 y2 e6 W7 w" B" p! S9 }$ Y+ I
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。
' K& F- N1 s4 y( k' k! W* t# s
+ A6 x1 H4 n: V6 h9 H, ?Loom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5