Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。- }( Q& D+ W4 i( S+ J

4 Q1 o; T9 |( ]. X/ h/ ?Loom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。2 I7 U3 ?7 Q$ W+ I0 p  |$ F

1 i; G) V$ d; B4 h, \4 S在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。6 o2 S, u/ s6 E

- i5 y: f; F( S" E0 @简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。% A" w' f/ B. s) w" V) I! ?& C
" _- z! S1 [8 L7 _; U& A
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。0 S/ F2 U" I% Q; o$ z0 a

! Z7 e2 E' W7 K+ o! F5 f. K让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。* P7 Y) t! q: I

' O# C: h$ C: E9 W* G; R" q+ J: ]回顾转移网关
, M6 n+ T+ t# U/ U) T' t2 ^) F1 t& v8 H9 _
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
5 t+ l5 p9 v! O
9 ^2 N. p% w& a+ K/ qCharlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。" v8 H1 s& J: ?! \
" C# v' K* V. q" Q( x  N, ~
然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。
2 w: D: L' ^* }, ~' Q( ^- ~$ R2 `* j  g* h& J( y; R
Plasma Cash 有何不同?# ~2 C. \9 H9 f2 K! ~
4 d. K- |/ b- [- }& _
Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
/ v9 }; b# H( \
# \$ d( z+ ~# ~! \3 gPlasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。
' o4 V( M8 M- C* i0 A
5 ~+ q! ]% A! e$ C用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
3 I& A3 ?& f1 _; U2 a$ O. w. q. _3 ?* `  ^) D& N
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
; u( C* v$ q* O3 \) |: X* x, j* c
0 u" z, ~$ X" ~# b8 a. ~/ B9 ePlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。
# p. H6 m# V! ]! c2 @0 n: E& @$ ]3 h# M& s1 d
梅克尔证明检查点
8 S6 v: W; {% P- N$ Z( D' [7 S8 @5 c# d  a  T- x" G9 W3 J
Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
6 h8 K/ ~' R; m7 w! u' J- z5 H) l" z5 e! E) a- U2 D8 \9 q
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?& B4 b2 m  x; I

4 F+ A, P. ^. N  f! C8 g5 E: E, @1 [想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。& W7 d$ }4 k! _) t" l" k1 [

2 s4 H3 M( N$ b4 Q3 I& A3 l% S, M节约时间和空间7 R( ?* O/ @8 K3 d8 h4 [- R( b
6 g. Y. P" d6 |; q
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
6 Z, _0 m9 t' x/ Q5 W" [3 |' B/ @# f' u: |3 m8 }0 Y
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。. D& i9 S* x; B$ |8 A

4 S- |$ t; J; V4 s6 r梅克尔树示例
0 T. R. K8 p) j' `: Z: @0 l; s. }! w0 b2 @8 k. a
例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
1 T8 V2 }4 E' D3 K7 A' p; o8 x6 `! }0 s9 @* r
因此,这个示例中最终的梅克尔根哈希就如下所示:
  _  G1 Q" v( S* F' _4 ?+ w' I% I
Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
  n6 S2 j" L, E& ~
4 [3 T+ G" p# ?/ h" ?由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。3 ?5 M% |7 i; r6 o3 r

" a# w: l0 v; x! E$ T例如:
  ?7 }  _' _  z, W/ ^- U; s5 z8 w
5 U$ q: ?- B+ s7 v验证事务K是否包含在该区块中( j* }; @. Y3 Y

) i) a$ t! P7 [8 f- I5 l$ _- v如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。
/ x4 c1 y$ F$ p7 t3 M  y; v: E- a6 t4 H" q
梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
! P! `: s3 C2 t- \1 m. c
% W( c7 z8 f' ~4 [- m* W4 ?" J我们可以在这里看到节约的空间:1 G: N0 N% a( s; G) P- f

5 v( Z2 M9 P5 ~! `& F4 Q! a% v梅克尔树带来的空间节约
  j: a6 o7 j0 ^' }+ g/ u: M- O9 Y, h: c8 _
为何如此重要?! Y# E+ K+ E" ^# A
2 j+ L( g# @# D, g
通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。5 ~' T# s  T  d* V) P- ?" ]) t/ S

6 H) F- A- j) L. x+ h# p8 vPlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。5 S8 I  a. H) S& Z

! J/ V5 I; l: B6 ~2 {Plasma 退出/ c$ t+ ^2 `$ d, [6 Z& X

4 U( |7 _6 o# X8 e' M+ Q% C6 z1 ^3 p要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。' j* g4 D$ o' V# L

( P0 K9 ~* [/ |: F( ?  `2 O然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
0 }' u2 N  [- X# m
. [: b+ |. n7 |/ y) A: {% ~" T在此等待期结束之后,该用户的代币将在以太坊主网上可用。# `! E& c3 r; \- `

5 X+ k; m7 s) H( p5 G; `+ ?1 zPlasma Cash CLI: _2 i7 R" m3 H! S- X8 A- N
1 g: B/ p' j' f4 }/ Q# c" d9 g
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。- w" |; {! A3 ~0 b/ C7 W' D

# h. D: S# M3 s: U) m2 F# a# ?你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli
$ R% `2 D  b4 `, f' _9 R2 ^' j: T" ~% M' j% {# q
这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:
: ]) v) ]9 C/ {. ^. X( x+ y+ K# P
& }6 ^' w8 F% m1 T. i, `7 ~$ npm install -g plasma-cli
/ v" ~* D* }) ~3 n- v0 x: K9 q2 m" h; d* ?
如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。4 G/ n: h2 K; e; S

7 z- M) x3 R8 w/ D' |' V$ U: H. ?/ u在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。4 Q) o2 L4 U8 d3 s( Y( b9 p6 K' f
9 Z8 b: ]! Z$ J- t. I% v' I$ o
一个合适的 json 对象将包含以下字段:
) T' Q' {' s* D6 e& E
- |0 g, v5 E, V) ?- g- k* j+ \{
$ p8 c/ }) j9 Y" B, ~5 B  f( i8 Z- I/ Q! _7 `% p$ U3 _3 \) G- \
  "ethPrivateKey": "",
; O' x1 x/ V$ ?$ r" t& Z6 W8 C- u1 {2 E! y( b+ L7 }8 }
  "dappchainPrivateKey": "",
$ z/ R0 x9 ]9 y" V% }' x& K# t% L8 Q
8 P* h) z  C, h3 }% b- R" n6 v) l$ |# o2 l  "plasmaAddress": "",
3 t! i& T; o  O9 O% X: S2 y) p8 R7 ]) X9 _* B
  "startBlock": "",0 W6 Q5 ?. ]9 V& O
" U. M5 k3 V4 t
  "ethUrl": "",
2 m( E! o8 g& f0 F+ u
4 v8 s7 n+ G2 p( e2 [! p  "ethEventsUrl": "",
$ L) o, Q# T; S7 P2 [, d6 F$ H* L- ~* @( K. C- T$ p
  "dappchainUrl": "",7 k! A! B! {6 q: [/ X- Q  G% Q
: V& t- |8 f0 s/ O# M0 E, p
  "contractName": "",+ K9 Y8 S2 \! c! Z5 [5 N
' I# K5 g" ]. f2 @
  "dbPath": ""
4 F8 K: o5 w) o( \3 x
- |/ @, v1 `; J$ I- z}
# G& `5 F  F. y5 a
5 |- F' a, e: n! M0 |* }# {我们来分析一下每一行的意思。
3 z$ O" N+ W' z' m* J/ a0 \6 x/ |- [- P
ethPrivateKey: 和你的以太坊帐户关联的私钥。  i& L9 h5 P/ I; ^3 v$ L

6 W6 b: u2 J5 \) G& X8 [dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
" h* b. A) b- N8 _! k7 T$ ]# ]6 \* t; A
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
' Z2 V6 L/ B% `& d2 J
, x0 l5 b. d9 J: kstartBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。
9 d5 j5 z5 L1 F. n* e
2 D3 Z3 b- b8 Xeth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。, F6 ]0 U& ~  Z! N* S* w$ p0 {1 X
% u5 c9 c% o% s# _2 b9 i# D# e
ethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。4 ], K5 u, |  P; |: w# x& C4 T
; w; e5 }8 D( W% v8 Y. j: ^1 ?  L
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com3 R( ]% x1 G9 d3 h8 P" x. \
* k/ N; e% \2 }/ a* [; ^
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。' K& ~6 p1 x- T8 Y

/ P8 y7 X, v* W( z9 ^# ]dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
5 n+ {/ C9 V/ q# z* `# H
: I) M+ u, _0 t$ E1 I( n使用 CLI 进行转移
6 s: c; O4 C% a7 o' Q$ k" v
2 A0 W! h; U$ j! q; q8 z当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:
& m1 A% D* y. M% i6 @6 `1 f5 F, {
/ l: t0 ~" u; |2 H. H$ plasma-cli --config config.json) v- Y% @) {! k: p  ?5 ~: M
( \: y# M9 T& {: m
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。, s- f- k. r. h% W! a2 I
& J+ T( }0 Q  X3 _  M; e& R
如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。
* |: w2 J: d7 `3 {
; c3 g7 v8 x9 a4 J注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。
- ^) B" P3 l5 q- ^* ]
4 V0 @( S9 G  L& U8 f$ depositETH 1000000000000000
5 ^/ \2 T2 A* _2 c8 d3 Z; O
0 y* O& c2 t( e0 @8 G大概需要30秒来确认事务,你最后应该会看到类似这样:
. ^! ]' S3 h& |3 g/ o9 C
8 p" u  n6 h+ @* ^4 D请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。1 h4 Y' H' G. d) j

! o% |% y7 z$ b/ H6 J, T由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。# \# @" u6 B- k0 t+ Q
/ x0 a4 l0 {& W2 Y9 _9 D
如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
" d4 O5 P9 r4 c' u) t4 N, X, A9 T$ h" Z/ H7 N0 C
要把你的币转移给另一个人,你可以使用:0 S) I8 g: X" l, S' x) r6 R

4 r; @' P9 u& o. y5 r* Xtransfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。- A) ]4 Z& r7 z8 R; m
  M$ s1 w' D( W
这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。
$ S  ~" s/ j# ]5 J1 `& t5 K
" k) o( f- u& j% b要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。+ C2 `# z) Y* a) O; p! g

+ N: E4 \7 O8 @5 k退出并最终获得一枚币
5 T" i6 ?( g  `
; C8 O) O! w+ u6 ~" L) e3 E9 r首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
1 v; z" I" T, j$ w
" U; ~3 W# {" Q; U; A  a$ x  `& I质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
. Y2 b  U$ l; i0 C5 ]% G$ \- f. l$ F7 D' W
就是这么简单!6 w  P2 x: F- \" W* n& ^
. v4 J% V& B* z$ Z( M$ L$ z
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。
) L  `1 S$ r0 o& }) ?; u' e4 h2 q) m4 X) h" w2 r  K  G. R+ v! L' L, F
Loom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5