Hi 游客

更多精彩,请登录!

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

2 S1 c5 _: r2 c" R( G" o+ ^$ n, lLoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。
- f% ~7 M8 e2 R; V
3 J" x# N' P' @5 {! M$ @/ }在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。
2 a( G# H& Y. p" J) i4 @5 q$ J% J4 {2 S
简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。: r! r& l3 c2 y6 T
  ?) X' x' Y! t8 @/ @6 Y" n8 w, ^
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。
& |- k9 g* e/ U4 S  {1 ~5 Y9 N7 E4 z2 j# k3 Z8 Y
让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
! Z7 R0 _2 ^- ~+ D" s, P; G* j
1 J3 Y& G, N6 W回顾转移网关
8 ~7 {; H* M, F! ~% S
9 T+ c6 Q9 \* W! g转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
: h+ j! {! H" j# D% p- G) q1 g# |0 y, m/ y: ?! X: a9 Z8 Q5 Y/ \. {
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。/ ^3 M/ Q* k/ A' R3 A; M! M0 s5 t" _
7 d+ U6 Z/ P1 x' O1 l
然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。
' q( g: M$ X" y/ N  I8 a) v
. x( @" a7 [( sPlasma Cash 有何不同?
9 T0 K' W" Q/ {2 F$ o/ j
6 u. M+ C7 ]3 Q  m* p9 JPlasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。6 W6 ]; Q0 X( f% ~/ N& h6 ?  T: u
0 u6 D. q; J5 }/ S
Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。! w6 L9 Q8 u$ u( z2 J2 s* J1 E2 y5 B

( ]( y: Y4 m. v: E2 S5 c& G! e用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
! ]8 x% n7 @2 `% F/ {0 t" n) o7 `) C# r( J+ K  F; k
该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。
+ H- U$ H+ i1 @/ B" |$ o) G% c* e1 |
PlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。$ T: i8 t& x3 b
0 H' c  b4 c+ ]% N) `0 T9 W
梅克尔证明检查点4 V/ E8 c6 r* Z9 P  Y
- M; i& s0 P6 [+ W
Plasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
% e3 k5 u$ K: n3 j4 R' a" i% t3 y
1 Q7 t( ^$ F1 y4 i% R& x在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
' l9 l# t; d; R; P  Q3 ~
% h9 F/ `6 @  D3 Q想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。
. v8 w8 h" Z& e
; @) w, `1 e6 W) g节约时间和空间' p; D" f, K2 U4 R7 `

/ Q/ I) d4 \% ~  W为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。2 n1 q, g! U5 e) F
) t" l" V; a, j9 r
一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
6 X8 k& W! _: ^5 [" ~: P. d: i, Q+ h- \# d% G  k5 \
梅克尔树示例
5 F2 H( b2 s) G. J. p1 ]/ D# {/ @- s/ Z2 u0 {' q
例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
( ]* `6 q8 v1 H7 B) a+ T. v# }- L0 P* [$ F8 _9 f! K
因此,这个示例中最终的梅克尔根哈希就如下所示:
' z4 L) J5 ~, K6 m( {6 ]9 r7 m
  [; u' w' O1 UHash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
' w) W$ e# S& V% C- f* a
4 w. s" \' ]! L7 p& N1 I' W& \$ q由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。
: V& c  |2 P- g( n9 w7 K5 H) L9 q/ O# a/ X3 ]) C3 u
例如:' D0 E7 D. t, g/ e. b

/ r' |7 m$ z5 G" i: ~; Z验证事务K是否包含在该区块中
2 S- ]: A; L" D* H$ O4 D; x
  X0 y5 ^" T5 k- q- }' \; l7 }如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。/ Z, T) W; {; |3 C

0 {. Z4 W! g, Z4 r, ^梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。2 y* z( R4 |7 Y0 H

6 i/ n1 k+ X5 ], @# p我们可以在这里看到节约的空间:
  u# v3 ^( p8 A; c# Z7 \
8 l7 \6 i  Q3 M7 l6 N( v梅克尔树带来的空间节约
/ e6 H; ?8 |+ E% o1 E: e# n, G* O
为何如此重要?5 i; a1 }- g5 {
/ y! W, x4 l( E: k2 K6 z
通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。. w0 A" W8 S$ d6 x+ |5 Q

/ j9 M: F8 g9 S" z) \$ T, E- jPlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。
7 s/ c: t9 U* [, q' l8 F$ m, \8 |4 m, V( x
Plasma 退出
% }( L* }8 u. Z1 W9 N6 T% t
1 I" Y6 a5 G8 X要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。/ J; _: M$ u, d. ?* s. O

! o+ L/ Z& \  a5 l7 P然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
# L' _" N! B5 G! K" @& x2 g; F# p6 k! z7 }: s
在此等待期结束之后,该用户的代币将在以太坊主网上可用。. }. Z/ s2 c: t, @1 X
' `2 t! L  ~0 \' B2 R+ m3 q
Plasma Cash CLI
: V8 B$ n" X+ d% H. ]2 b" u  I1 s1 u! k. m, q
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。
* I7 v9 X, D" c8 |
! d+ c: [) ?9 Z: h7 |$ S你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli) J! m+ `& S7 I0 v3 R
# m) W2 v/ [2 s" r; I( G/ Z) Q
这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:$ Y. e- t  h6 u" P/ T# n
. x) k+ B' b1 D. b+ P; e, Y+ J
$ npm install -g plasma-cli2 L# N7 E' P1 p8 z4 N
* k! X' c* Y2 ^* K: S" Z" g" }3 T
如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。
' x( Z: {* ?5 a  U, B. Q& W$ g
! w( r$ R" t& x  n. l4 l. ?在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。3 [+ n0 C- M. S5 b
# M  U% G% e1 J) M! r4 P' {$ x
一个合适的 json 对象将包含以下字段:
4 e. w. S# c/ w$ b. @2 p3 Q6 p3 p/ g7 D/ ?7 z
{) p0 s5 s: v* ^" q0 A
8 k1 Q% K& Z5 O1 i! u& C
  "ethPrivateKey": "",
, L' Z, S' B; p
( j- _& U7 M0 F, E3 o. T  "dappchainPrivateKey": "",
6 y7 p% l4 `7 c. u) `8 |9 b- Y- Q* V$ L, q1 A
  "plasmaAddress": "",
4 U3 i0 Q9 \% u1 H  W2 K# ^9 q5 h6 o
  "startBlock": "",7 w. m# j1 C; ^' b! d0 b
; q! c9 s$ |( h
  "ethUrl": "",  v6 r3 U8 N( e# t" R1 ?! |* K

2 T: J4 N% W5 x4 E: j4 U5 @; W  "ethEventsUrl": "",
/ b* E$ G) G4 z/ B" x
( I  Z8 l- y* O$ C  M  "dappchainUrl": "",# ~$ h- B& x/ {+ g: k: v
4 v) K  d+ E+ D- n9 P$ h
  "contractName": "",
  D& Z( E% T% z' l1 K  j% [  K# D0 Y" {/ w4 x9 _$ c! Y
  "dbPath": ""8 o0 e( |9 [( A1 J

: n+ _+ G' G9 C2 B& L}
! s& s* M$ J/ w4 u
: f: q/ c/ O9 U5 v/ p* p& A6 X; u- r( Y# y我们来分析一下每一行的意思。5 ]" R( h# `; {: Y7 b& [1 i

4 U; v2 Q1 ~. CethPrivateKey: 和你的以太坊帐户关联的私钥。* a9 x* D5 Z$ l
9 f  L% B# s) w# T$ R
dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
' }- ~4 ]- p- A. F9 C2 v. x+ K
5 ~# i) `: \; z9 F& e9 d* PplasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。9 K3 w) U+ _2 Y$ D( e
( o  l* ^6 ~: k
startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。
) C0 z/ \" e) k) l* E+ C+ |; C/ ~3 j& C8 c% O8 o6 S5 y9 d$ C# Y
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。* B. r9 z  S1 ?! W: P  o$ ], x7 e

+ t% a. ?+ w' {& j4 R% D" pethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
/ |+ a% T% S9 R
' G+ K0 }2 Q) [/ Z, }" I2 fdappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
) I) l+ T7 H9 {$ o2 ]" s# X7 e1 e6 C5 v
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。
# O1 M; E) A1 A6 T# I% |
1 e' L$ l) ^5 [5 i5 D3 _dbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
- @& r2 ?5 x! y& q8 ^5 ?% z2 N+ w5 q
使用 CLI 进行转移
: S( r  c$ Y/ F) y" W. |
. Y: m4 ~. X2 P2 a6 W8 K1 G当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:3 q0 a5 Y  `. j4 E/ Q; Q# L, i
6 F: ]& }! F6 B% x9 E
$ plasma-cli --config config.json7 u' e/ b, M. z

/ @6 {3 I  ?& F& J0 P  w- ^你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。* F8 b+ O! m7 n

- n; O  |8 M( W如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。
8 w# e  }7 ~0 V  j1 y! T! Z1 i  R; X( B
注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。
% {. a: s* R4 v4 y/ {
( f: e0 d- Y, Q; U$ o1 _0 S" `" [$ depositETH 1000000000000000
' ]  o2 p" N3 O
7 z  P% A) g3 `2 v* k* y& _8 @9 m大概需要30秒来确认事务,你最后应该会看到类似这样:
( U$ O4 h' `3 ~" J9 _9 r- P9 |6 _) L2 D" j% z
请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。
" B# _+ N/ e) w' _) d1 H9 y% a$ x7 F# e. W/ ?, b
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
& |/ W9 `' n* @7 T
# N# V: i& V  z& g9 L7 X$ n$ U如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。, w$ W, w6 C9 ^& |! ]! {6 f0 Q

2 Y: S9 r9 a$ R  `+ V1 a要把你的币转移给另一个人,你可以使用:
9 j! W6 _( ]2 O; J2 V$ S- f) }' @2 x. }
transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。
7 B* |+ \% [' g8 K! c3 R
3 M2 n% n( X, D# K, J# {( a这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。5 t4 C% V2 R' k  w6 \
1 i: @3 x. E# J9 c$ ^5 L
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。( v' H% d7 J) D8 L

' l! `1 S% X, J( e( X8 j, Z. p退出并最终获得一枚币
  `  v6 e/ C; s) R; h  e+ s# m9 Z9 j: B% s! x
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。( j$ A$ r* b6 @9 L8 C

+ H& u" \* G# J* s: v: \, P7 L% L3 R质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
* v4 c; L6 V  k! @& T, J& o; \0 N/ x
就是这么简单!
) d( G2 {' b, a! s
9 `2 d5 i& w8 L5 F& B希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。
; [' I, I- X" l4 D  d$ J" o9 n# }4 T- K8 e+ J( d2 y
Loom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5