Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。
  v7 h& b! m6 E) [3 d) T7 F5 ~  i0 G* g, |  ]8 [' L2 k
Loom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。! {6 E. _9 F& w' Z* o. q
7 h/ ^; ?" R* P0 ]$ F9 M
在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。
, x6 H# `% e/ R8 J- O/ o! `) t5 a2 O
简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。
& l+ |, U% [. i( L! a4 n+ J( X) y8 @# ]
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。! L7 S2 X; w$ N4 z$ }7 F* @7 n
& G0 T4 |' A+ |- d9 A( b( d' T
让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。$ F% I2 |- m) C7 B* k) E

: O& U: V7 P5 e2 w! [回顾转移网关
* {* T6 W6 x' z! |" C& V  X" T' U2 v
( _! N1 w  i6 o; ~; W$ W) N* n0 s转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。4 p* y3 r! v) N# ]7 c
, x( e9 T4 l! O6 D
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。
# \1 h$ ?9 p& O7 C* g# q; g7 \
$ i/ r$ |" y  {/ K' p5 A/ w+ C然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。
' S6 H/ w# A" ?+ ]% e; Y* J6 a. |, [5 z1 F  N
Plasma Cash 有何不同?- N( s6 W$ k- e5 E3 V

0 X8 R/ e6 _1 z3 P9 q! ^Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
( ^' B6 N) z# h: g$ d$ b2 c
( I4 d$ `# F5 w3 `" E' ~Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。7 a+ d( j& h- _. D! F. s
% p/ O6 R) H5 ?7 S; B7 f# E
用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。4 X) P& x  W/ e* W
% E6 D& C2 T& Y5 e) E2 m4 w6 X
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
" Q7 M5 A* c) P, A7 f) H/ v: \( c5 ?. t  z# Q& F  f
PlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。
  p+ J) o' Q' i! c9 K0 d- r+ j/ r, f0 b' ^5 @5 H$ `0 ]% j1 L
梅克尔证明检查点4 q! A) F5 A- L0 i
) @) c3 M2 I+ j
Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。6 p( Z1 {" [" T. P+ i8 m
1 {. n: H9 G' q6 f6 Q/ Y
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
; \% \, c/ w4 \) c4 R8 a
# n* I# `; }; ]& `# r0 f$ P/ {想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
. u  ]7 C& T& T
1 g$ ?4 O7 @/ _! m! e节约时间和空间
6 O4 [" v. B: a3 W5 n  k" v2 }# O9 ~! |$ p2 a3 ]# F
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
# S9 `0 h  e, c  h6 {+ D2 m/ K7 |; R1 C
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
# u- n; W$ e0 j2 T2 C
  L/ T# v; p6 X梅克尔树示例, o# s" t4 T0 i) l

/ F. D4 ~4 M: z. M9 ~, {: m2 i  u1 N例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。; c! R5 j" R* S0 @# @
' {" S4 o5 `0 s! Y! m7 t
因此,这个示例中最终的梅克尔根哈希就如下所示:
# w+ R# O8 `1 D( w
8 S: }* r' v' A  o* Y$ GHash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )1 _1 {7 C: A# C, l( C4 Z0 R' c' N

  p; L/ a' H! ]! l6 S5 w由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。
! Y3 b* H, C1 o" x/ u
; [9 }' L3 }# E# [- m/ R. i! y例如:, q- l/ I6 J) S5 j6 A
& y  r8 c) Y2 B4 S
验证事务K是否包含在该区块中1 e3 i& c+ g, T% j6 b: |8 g: j

1 z/ N) g, I1 {如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。: O- E1 C: g! a( a+ a. q" }% l  s; |

" x( p( |4 k  v  M1 g" e$ Z3 V) D6 L梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
5 Q$ v4 M6 C7 v: ~5 [/ G& g5 ^& s+ z
1 k! i  J/ T! a1 D, O0 w/ k; a我们可以在这里看到节约的空间:1 G- D. M& {2 Q% Y: H% m! H

- E2 S. U+ s  e) V2 ~" N梅克尔树带来的空间节约6 [; j8 i  I& w/ J$ ~8 X! k4 _8 N4 M! i
+ N$ x. E( N. s3 \5 u
为何如此重要?
8 U7 n8 f, k* G  y7 r# C( `- X! O( b  C, \! r& R
通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。" b: P: E2 ^4 z3 z
  Q6 l- T+ F3 ?/ w. B
PlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。3 \  o2 x: B3 M+ O/ @8 Q1 ]
$ l) t! E0 o) Q1 ^1 @$ a$ y$ L
Plasma 退出! I, i9 U4 ]& i) t2 ]
: _" e7 W, r; W1 r( T
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。
, u2 K7 K1 L, R3 q3 r; L9 }
) r4 {  _; T. {/ Q. ?- `7 A! }. F# V然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。) L! y+ w- _/ y& |3 m! F( r1 R5 [

. y' z, o3 @% N; V: ~6 G在此等待期结束之后,该用户的代币将在以太坊主网上可用。" d1 ~* T8 f% `2 M! C9 `
* }7 ]8 Q. `* I) j/ \2 i, c- H
Plasma Cash CLI
2 S8 B! o2 ?. Z! T7 B. m) E  s' f8 W! W7 p
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。# C& P7 ^9 \- r5 k! z* l$ Q+ p
5 i5 ]$ i, z2 S: q
你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli5 y2 c- |! Z! p* K! S
- f$ H; a; j9 w" V$ h* d* [4 b
这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:
' ?9 n/ n, o+ m( O  [" n& \- U: c/ S0 a) ]
$ npm install -g plasma-cli
& S7 S9 d* U* P$ e1 `+ ]" N( ^, Y; e% C1 w% u) x
如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。/ W& W  Q; B) P$ [

" V$ k9 I$ v, B# m1 h9 `! K在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。
" P* s  K4 y& |' u. v
4 o" t& f# O4 F: I$ t一个合适的 json 对象将包含以下字段:4 N& p6 R' ^  x0 o' S! r+ f* r
% k8 o2 C0 O  g- j4 L
{5 q' S! ^, B' s  e: j4 p' Z

$ u0 X/ \' P; a/ ^0 N  "ethPrivateKey": "",, x8 A6 u3 Z  ~* n, P  K

! c7 ?: x2 H2 p  "dappchainPrivateKey": "",9 T& g7 q' E! V6 I7 z7 |3 f
' X( g& f+ h4 f  }+ Z% m) U) W' R
  "plasmaAddress": ""," F+ @" {8 I% X; x. J
  ?3 f) G2 w. `' d
  "startBlock": "",
" o( u: L2 Q9 Z( Y: G$ T
0 S* X  ~6 ]/ Q2 [% l: c8 o8 r/ k  "ethUrl": "",
& y9 F2 A3 C! R7 g- Q% @, c8 I, H9 b9 O# }" E8 T
  "ethEventsUrl": "",5 L2 v: h8 ~% f
8 e5 [7 H$ s- c: i: X, g4 D
  "dappchainUrl": "",1 y/ [+ N* V# e  C: y/ }1 }& h

! J& ^, V, O- i# P  "contractName": "",
+ w5 n# I' }" ^3 z3 [  {* E( Y4 V) @9 h/ |, o6 |
  "dbPath": "": o( h, U4 v9 B: G6 N

  z0 a2 @) k6 H1 l% G}
4 }4 B) d% V& g
- z3 l, d% k; \2 r5 M8 {我们来分析一下每一行的意思。
# k0 E# V: V/ i! \! w
8 k4 i% w+ u. ^; tethPrivateKey: 和你的以太坊帐户关联的私钥。
; W' h. {9 R3 ~$ I4 k1 |
: g2 R& L6 x0 k1 j, AdappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。* N+ A9 y2 k2 _4 Q
, H8 B5 H. F% I( }2 s( w* t, Z' I
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
5 C, `7 P/ ^! G4 v3 U
6 c  F2 Y4 W; o4 u5 x) ^startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。
* W! @5 X4 _6 y6 @0 G2 a- c9 q& ]! z8 c7 U+ M
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
9 @* N9 d( G. h. a; Q9 [$ C5 K. `# T5 I8 W* Y3 V/ E* t+ f4 o2 b3 R" V0 c
ethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
- G& i8 q+ q/ p4 r% Y# k
$ }, R+ g: }* Q5 ?" G5 Q3 PdappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com; t6 G0 e  T% M6 _: G& z
6 i1 C8 K3 f7 ?% y, D/ }+ x$ L5 |: B
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。4 [, \/ L* Y4 s1 a# c3 S8 R7 Y" S
" K- I; _6 W, T, h; g- A' ^
dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。. r  h+ K" k. i& z% \4 [6 d) E( U/ I
* E8 W' R' b& u: d( k/ w
使用 CLI 进行转移
! t2 f* ~& K9 @* |& Y7 _6 b! p: J8 U" p, j1 Y
当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:9 p  s( G* D$ _; [; P1 X

# L; R; f$ {" D2 S; C$ plasma-cli --config config.json
. z/ b* e' y: D3 J6 i3 ~, b& [4 j/ a- ]
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。; d8 c# O* \$ |( w

7 d5 B) b1 i8 L, C8 i. P  w如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。
7 k( b" [9 \4 v+ L/ z: M) P! |" |9 n  m3 A
注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。9 [' N' c# s2 Y' z$ |0 D6 X
( T% Z3 ?  {4 w4 N
$ depositETH 1000000000000000
5 r+ R$ G! ^4 Q) I" g, f5 b: C; k5 p/ A# f
大概需要30秒来确认事务,你最后应该会看到类似这样:8 l6 _! m, N9 Y" I! t9 Y) u3 z
& U" r2 d! e6 C. P6 d& h
请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。  |: C1 O8 H) `
7 r% R; t! O& s4 {2 u7 I
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
$ |$ Z6 C; N+ q0 e# ?
7 E7 `$ n. V) `如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
( G, w2 Q5 q, l- \+ i9 H1 E8 |
, u0 N' o7 x; j, V要把你的币转移给另一个人,你可以使用:
4 }6 L/ ^9 u3 d; }+ T
% e  C8 x0 U1 x8 Itransfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。: G! }+ m$ ~: v: S0 C' v) Z. i

% r3 i" ]: p9 Z/ @2 p$ l这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。2 a' h, J% z8 J9 R

6 }: b( @( ]% y8 \5 z3 j要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。
9 A! y; {& {9 F
" \7 u' k- t' k& q退出并最终获得一枚币1 q% _% Q+ I7 s8 W
: D( }" b, `% s6 g, Q. r7 P
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
$ B  n$ Y/ ~! |/ {1 m0 w" X5 M  x' [& G" m  a( k) Y! r9 k
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。) |% }4 ?1 R8 a' H; K

7 E+ @$ h9 P( U# `6 @/ u9 i5 b: [就是这么简单!$ d' q0 m# A. Y# H9 G0 y
2 O8 z6 }  k7 H9 ^# G8 j; `
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。
9 y0 D: m- [- ?- C  A
5 I0 @. j/ D8 v+ Z& B' @Loom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5