Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。
. q9 W, m+ ~: m
  W+ H" I1 t& @2 C$ mLoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。- d4 c. r5 C4 x5 c, ]

9 S! p( h, |6 k( R( g+ Y4 ^5 a在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。& j3 r; r! l* T. a9 h

# y3 H* `+ q3 p- [& d简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。& f3 g7 v' \2 t" [7 |2 `

3 c9 d; h' O. ILoom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。/ \$ \2 w5 P- J: M$ J
% P4 I0 e& m% E( J8 n
让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
* l4 B1 {  v+ q8 H+ d9 f$ ~2 m" z4 p6 E9 b  h- ^1 L
回顾转移网关
9 |$ I* r7 \( j5 F# C9 \
; d& A( r1 |$ s  ]+ b, z- i9 H8 u2 R转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。6 T' e/ r/ o5 f$ L+ c) p6 {, J
1 o: f, w8 l4 m, H6 h* W
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。3 x$ W0 G: w8 F% [% g2 Z( ]9 g

6 V/ i5 `0 O: z! v! E; I然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。( n' a4 n: _; \

1 F5 {# C  H# }5 o3 o. O1 WPlasma Cash 有何不同?$ Q( Q- `! w' F4 X' a& C1 U$ J3 F

' L7 a, o6 {& e; W9 _  U7 P5 t7 r4 UPlasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。% R5 {" D1 D2 k0 O) I( n: a

" p. \) b* F& {+ `Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。
) K$ U& T& I, Z' X4 p/ H  u& R
# a) M# ]( q% \- u% D7 J/ ?$ y$ S用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
( T2 b1 C" s3 U$ V9 u& x7 D( l- c6 \3 A/ L5 H
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
+ a; K/ g( f0 o* }! r
! X8 Y6 w; V) C+ ^" N3 R# F1 jPlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。8 Z* T7 B; f' R

* Z2 i1 f. I" J0 M( R梅克尔证明检查点
7 Q# O) A! s& H+ I! w, _5 A# b! C/ @( ~: S. I) \* e
Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
  V& T5 [+ i, [# {1 [
5 p2 W; t+ _$ W3 E" ^1 w  C, ^7 z8 e在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
, a0 b4 ]0 u$ _* ]# F
. Y% x' n. J) K: z6 x; Q想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
" A% u( P- [9 G' X& j/ a5 Q* x- ~( ]1 T
节约时间和空间
9 x" `! Z( l+ t. u* ^& \; j# w( z( a3 ~/ x
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
' s. F  x6 K5 D9 n$ T8 Z7 \1 B4 l. W  {9 {! i9 h
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
- q- \+ O* k/ |. u* W2 r2 m1 {' T9 d- ?6 m% o( `2 j
梅克尔树示例
5 ^& ]( g) Q4 ?+ k" V
) J+ ~5 i0 R  |& ]( c) K- i4 [例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。. H9 K+ Z  b! W2 m" p- N7 \6 v
- M/ H6 `# k2 {* v- k
因此,这个示例中最终的梅克尔根哈希就如下所示:
# K  l+ Y; w; g) f. g
2 ?6 D$ K1 j" c- D  hHash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
1 P( |1 z. U  P, K# {8 z9 A! c
" H7 w5 {: [8 D/ P! e: f  W由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。
- v; G+ [1 V( w. Y* e0 Y
* E! f/ Y1 m% Z例如:
# `0 G' p# J5 G9 @
1 b( n8 m; S1 p$ J验证事务K是否包含在该区块中$ X& r9 z) d$ f5 Q9 \( }- M

) L7 G' h! G! h4 l9 c" K如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。
: q2 o; s/ [/ ~. h5 v% n+ N' q2 Z4 n* g6 o
梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
: X# g- {# ]$ C: I
9 O+ B  K* o/ }# h: S9 S我们可以在这里看到节约的空间:! X( p$ Q5 b5 m! ?* d3 \* X

, O% Y" k2 }+ r) l梅克尔树带来的空间节约
  H2 z( A8 h3 ]6 g4 n& o+ y
, l' q; p7 Q% E( P% h为何如此重要?; j, r, F; E. Z0 u
- n; a" x# N3 [% B1 a; S
通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。  C! r1 T6 B5 ^& l

/ z- c3 {8 a$ J: i; B6 z! i: R: YPlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。2 u/ _- X. [5 h6 k! a& s  {% D7 m

( W% K9 C6 Y. ~% n) O" m* Z. EPlasma 退出! b+ f  o% ^6 }/ F" K

1 Q  ]9 [( o' D0 W) b; [+ _- t要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。7 w2 |2 \0 [% \! ~5 U$ G
- ?6 ^; X& W4 a  |- ^
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
, n8 G8 y+ U- k: _9 n+ b% H
  ]% m1 A& a; X7 E8 A6 v7 _3 V/ F在此等待期结束之后,该用户的代币将在以太坊主网上可用。
8 U$ O. ^1 K; l: }0 q( c
7 Z% ]: W, T# n- e5 R0 U, FPlasma Cash CLI+ P0 P2 J% R: k
$ _' G3 N; R' v+ l. {) l
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。3 d) I) R9 u, h; g1 m

: r1 M5 ?! L# {) U你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli
' R, r2 d2 p) _3 t  {% N; |% g/ {" n7 ?/ ]7 ]5 Q. F! O, r' |( O
这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:" U. d: k4 P3 w
2 L& ~' S5 z2 M+ e) c
$ npm install -g plasma-cli
: l6 v8 T' y. `  R7 n2 a0 @8 ]- _; [5 K
如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。
6 l7 [2 @9 f6 T( ?  o
" ]( }  T7 t6 A5 D/ O; w在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。
* H4 u+ p7 f3 u5 r2 A5 v) c3 D- @* G
一个合适的 json 对象将包含以下字段:" i& I- d, z9 [

- c0 L9 Q3 d) o" Q) b' }4 r2 I1 K7 u{/ P' @3 X$ C! s

# \7 W+ ^' `0 e5 y  "ethPrivateKey": "",6 B8 V+ D/ M" Y5 i( E

. l: g1 a2 o: S$ p9 s! b6 y# D7 T  @  "dappchainPrivateKey": "",5 b$ \1 J& T" F1 [7 q' ?

8 ^' u/ ]  x: s  "plasmaAddress": "",9 K/ d# l4 v) b9 o( h
; z8 a: e/ E; A
  "startBlock": "",: \  t% x- X( l9 S

# `6 |* E7 @! \  p  "ethUrl": "",* i, s! X% a9 v  i( |

; F, k+ r+ Q4 K( e. F+ ]) d1 H; Y  "ethEventsUrl": "",! B8 O( b2 m" F. Q, a, J* g' {

9 N; K6 h7 e* {2 {* Q. N  "dappchainUrl": "",
8 u6 n$ v9 t! P5 V6 R# D* q
$ s: c* X8 y6 O! x, c5 r  "contractName": "",+ d' e+ D8 l/ w" e
2 ?) E; a' }, }' m# n; E$ D7 I
  "dbPath": ""4 x# c! ?) S$ H) G6 D1 I
, M0 Q, d7 H( f: N
}0 I* n( @2 U  q, X
: w: j1 w4 E. K
我们来分析一下每一行的意思。
, l2 x4 N! h* [3 _. N, M, Y0 m5 p& _; ?. s  G' n$ v7 e3 g, ?' Y; D
ethPrivateKey: 和你的以太坊帐户关联的私钥。
( ~+ t, {2 N; r# |' Z- r" E
' e# L7 K2 ^6 [# k% J" wdappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
4 L! j4 h1 F2 O; p; ]- g1 s) @) k" G- I# j; [* W
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。
+ d& s8 r$ o' |, f$ R$ O' ?/ ^0 L, B  _. @$ m& J* Z
startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。
" B5 }5 U! [5 m' G8 f5 v9 c4 W4 @$ _4 p) R7 x& O
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
1 P: `( }- Z7 s& |+ u: y1 e  B% }6 a& J+ D5 L5 ?; \
ethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
; N1 S2 W5 [$ H; U; u  }3 B. l5 }9 i' W
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com' j8 I  r! o0 K1 ?
% v9 h0 Y& r6 m% a
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。4 I) x5 ^3 N9 ], ?
! p* T% ~8 w' [9 T: G9 k+ @
dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
* L, \1 }8 d* r; `( r; \
8 n7 d8 _8 ]5 f( l# e3 M7 p- ~使用 CLI 进行转移( {' Z5 w7 d$ `$ U3 |5 G

; @% N8 \: @% u- u4 C当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:) v. B! ]% `) y- f
2 r. X0 h2 N; w; A: S
$ plasma-cli --config config.json7 F; p: J7 K& D- V) D0 C' A& e

5 N" z) V3 \% N: [7 V& N2 i你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。6 S' e# P/ e8 c5 U

8 s$ _1 b' m; t& L8 U; C2 w如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。2 {1 ~' }3 z' m% J
' k) _7 I5 G+ k* h+ Q8 Q: H. M
注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。
; j2 K* D& u9 i- s8 E7 N4 u) H& I5 \' l& d8 O: g
$ depositETH 1000000000000000
( C& D2 g) U1 ]% J" \3 b
# C9 K2 \, e; s大概需要30秒来确认事务,你最后应该会看到类似这样:1 l+ o: A5 I" J- v& |2 a& K' m

4 i% j$ z7 r, k! J请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。% W; H0 V8 C& F! l

+ {2 \/ G$ P! M7 W由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。/ o- U; j2 X+ d, o0 d8 M) r0 d
) {/ u% u% I$ ~( F
如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
" h* x# r( J/ X* [: g* O# f/ P" ]4 ^' o9 n$ y; v3 s$ I, `
要把你的币转移给另一个人,你可以使用:% B- m, Z: c% N) c/ k* {! z
/ X: _4 a( @" n
transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。
, e+ q+ p% R& p
6 ~8 J$ _" Q1 Y! a4 c/ e2 @这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。" l+ P0 Y7 k2 D- t) p9 X% u" k
" N& F7 D* m& k* h2 O
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。
7 N7 J2 R/ U2 H% e2 j* B8 J3 C$ t" {) i9 X) H
退出并最终获得一枚币1 F9 N% t7 U! Z+ ^; e
" m# P  D4 `4 d# g4 D
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。& g1 s7 _/ P: |6 a
% p2 `4 \* S' e5 E4 D, m: @
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
# D5 b( k" k$ K/ z+ l- X& ]
  _5 {) ^3 M- H8 }% h就是这么简单!
$ Y9 w; v* a- c0 X' n  z" l
3 C, w8 w. C( I1 W希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。- i6 t! n+ i2 b# O" @/ j

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

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5