Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。
' F) p, m. p$ f+ f6 u# l, M' h$ ~
Loom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。
/ [* D! b3 @# D, p/ X0 X$ S& x$ d  ~0 i# U! \0 c4 i+ U
在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。
$ O5 L- A% Y2 L4 z. z* I: d' A$ W" H" a( U5 q
简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。" |* R9 Y5 X! |8 G2 o  g8 @+ r
, N" m' {. R( |/ p& D) E* x
Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。" U& n1 |, V6 W$ s
/ h) A# k4 l) z
让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。
& I7 g" t  d$ u% F7 J( h! S! R+ G% o. @+ n8 Z; F
回顾转移网关5 b9 g2 Z8 I6 h: q2 ^* K
5 n+ ?2 H4 J* D0 I
转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
, t% x* l4 n# P6 k8 p6 F9 j$ M) \. y9 ~3 L  |
Charlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。
( ?: ?* v- @4 F
/ G1 r$ x- k# Z: z+ `7 O; D然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。" s7 @1 ?4 ~6 N2 L( J/ u0 n
) `* q0 l2 S- X6 t2 i- A: @
Plasma Cash 有何不同?
: C8 P: _3 H" [: j, x4 M$ }# @- ?2 k2 F
Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。
& F1 y2 a9 k/ s+ J. G* I
# F$ d# O3 n* j* r1 {5 `Plasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。
! }' j8 ~; v4 _! y0 H! a/ N& T! e' @/ _6 u8 T) r
用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。7 F: z, ]9 H. L& E

' M" X- x: y  a: a" D* E该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。6 |* p5 V  m) @! Z- D* G+ p3 L
9 h: {" Y7 e/ l3 w4 U! O3 @
PlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。3 D, C) [( H: T8 M% Y

& M9 h( P6 a0 r梅克尔证明检查点$ V: q) d) O0 |8 q8 i

+ h* j' z: b, U2 _( Y; xPlasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。
* ]. M/ i: J* m6 K" N: ]' R3 O% d' g) v( Z% n3 G/ \$ _$ H2 z
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
0 W) i( K# E9 Q6 w2 }: v, p
$ y( p5 \0 V# y3 m8 E- u( @" \) g想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。6 S- w2 \4 Y; I; p- ]/ \8 M

5 P- [3 p$ p6 `+ b1 X节约时间和空间
8 W6 T0 k1 C- G+ X/ e2 P0 S: x& Y
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
0 N2 Z, r+ d: y- C& [
8 N7 o, v$ ^3 @: ~$ Q) Y2 n" \: V一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。
. o4 P: U! _; G8 w8 L
& H# C% X8 T7 B7 ^# N梅克尔树示例
, Z0 \; w+ U* B7 B$ \* }0 @
9 s! |6 J; w, ~  a例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
1 ]( ~9 Q& b7 L" p- `5 Q+ D" I1 \4 K
  u* ^8 ?6 e+ \2 e因此,这个示例中最终的梅克尔根哈希就如下所示:
- Q" b; F9 v/ G( [: v! A# T# @8 x8 v1 T& K/ d6 C4 u
Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) ); j7 x6 j+ E" K) W: z% ~

# s; @9 [5 R: x& W  r由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。
, L" F, V* d, {  F! m! b# F( v0 Z5 O1 Z  c1 Y6 o. @
例如:' i+ Y! O/ H! T4 `" [
2 V# S+ Q! r0 y0 B
验证事务K是否包含在该区块中
1 `6 \/ {8 z3 V' i
) B3 z# F4 w7 m- B" s  Z6 L2 U如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。9 k, I8 n4 ?' v* {

5 g1 `; I- Q" e+ o& @5 B* y梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
+ |# u: ^9 Z1 A
6 K7 W4 b7 ~  F) e9 p- V我们可以在这里看到节约的空间:
" P2 I) c1 r9 B+ {4 Q8 s* |$ N! u+ W) d/ V" _$ }
梅克尔树带来的空间节约- M  c$ `/ h; O
- {. x4 x$ R. M. @
为何如此重要?
, n0 r" Z+ B' H' U. `3 [
; K- {+ M- z$ j! m( X; A! X3 ?! ~" W通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
+ V! R. @" I; w' L+ n/ e3 y2 D- y- @3 I: D8 J
PlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。+ c" g7 X7 W$ t/ M9 C& k" ~/ e
( t6 h1 N# y6 d# N, R
Plasma 退出
  v" y0 ^( S4 `" z  K
/ V4 d3 `; d7 t& N4 Q要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。' E% s2 J" ^  B% @) W2 ]
$ S7 _& v' c6 m0 A( f" W
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
. L3 n3 @1 y0 e  F1 G/ M  ^6 ^+ s! y# N+ {+ m
在此等待期结束之后,该用户的代币将在以太坊主网上可用。7 j7 n1 y& K! O9 n8 N

$ S1 C4 C) K# ZPlasma Cash CLI
" T4 U" K. I3 s$ p2 ~* h* ]& h& m" X0 J. z- M7 }& o& \
好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。
  y" k0 ?  ]5 B: o6 r
/ L; Y' g5 k- z& n  ?* a你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli
; W4 E0 C4 ]& w' U! l7 G) @3 Z5 q) Y% X5 A: o# k
这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:5 p" q. G& i2 v: y& j

0 J* n. |. |+ H' g5 R' l$ npm install -g plasma-cli
  }; ], U0 L* }0 c* T& x2 r! [" b" r# f, e( x: o4 Z
如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。- Q- u$ T) b% z8 o

6 n7 ]$ F$ p2 k* C在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。
; f8 H- Z$ V6 l& h8 H! Y. P9 x3 o8 }, {5 x- S( V  p
一个合适的 json 对象将包含以下字段:
" A! g: C" n) i! N5 S9 [  }+ S( {5 ]  z' a% h" a" h6 X
{8 ]' |% X3 Y% @. f# K* x1 E
; |/ O- n3 h( Z# D# q9 H
  "ethPrivateKey": "",- z( ]& z- x0 ^" j/ M$ W

+ W) A( S, q+ B& i. b# D! J2 v& d  "dappchainPrivateKey": "",
6 J3 t3 y) T; z3 Q3 L! w. z# {3 H
3 H) G- C3 V  j9 _& K$ d  "plasmaAddress": "",( j1 ]7 ^# W- _) f$ j( g; g
4 h$ h) c' P+ B/ l, c7 L
  "startBlock": "",
% h1 @0 L7 i( Q* w' u4 g
2 k9 ^5 I9 Y" `6 Z6 Q" ?  "ethUrl": "",
8 r; W# q1 i$ G+ m( U, d; r; k. s" L/ y, |4 o/ ^, m- e# [3 l
  "ethEventsUrl": "",; g% q+ K+ v* J6 c$ B
' q' F9 k3 L5 L8 ~9 ~
  "dappchainUrl": "",
( S3 r* }1 R$ s/ H- ~
1 }2 Y' v2 R) ?, B5 N  "contractName": "",# z; |$ d2 }( ^/ k0 T! Y

' S, S+ _4 r. w8 U  "dbPath": ""
/ p- g1 g6 t' e& O) R- W/ f- [; E! q& e" p8 C/ v
}# z/ q+ o! B6 C2 }% x  V! _, M
: K- F8 ^' s% S% q2 y" i
我们来分析一下每一行的意思。0 {1 e# Z+ J' o* K4 W* U! s, A! P
" D6 E+ S; d! K& N# U/ O
ethPrivateKey: 和你的以太坊帐户关联的私钥。
7 T; f5 K  ~' o  h
0 q5 k# L! z; ?4 Z  K2 c1 `dappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
3 g8 G# s$ g: @, X) B5 t
/ ?0 l5 A; n, u, ZplasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。) b8 s+ A$ w4 \9 x$ L
) _2 C4 y& D) \; o1 g8 f4 s
startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。
0 B& E8 y' `, r+ K: }& t7 j  x- e' l  D7 y
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。. X8 W- {4 T- R7 g. X8 }9 J. w
: {, f6 U& k+ C/ E$ H& F
ethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。
2 }; M& h0 |% B0 W9 r+ J# K3 Q5 m$ l- G( g
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com
# ?; T" d6 Z; c* F$ y) k9 U0 C# A' e2 Z
contractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。3 T, P/ O4 ~" L. K; f; b$ x8 f( U

! j+ G+ z7 [% n4 ?! t& Z7 udbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。! Z  G& w1 n8 V& Z4 q

' n9 \1 I, z+ ~! ]使用 CLI 进行转移; l1 e3 N8 u- N, \/ \

: G0 m% x* K! [0 O3 k当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:, [6 y4 Y. }- D8 p
5 t2 f$ t5 r- y: a- F5 @
$ plasma-cli --config config.json: u. W- f* e; P
" i* p9 N4 p" G  g% I# K- v. d
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。
2 N$ n/ l! S5 b$ C) `! n6 ?) d
如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。+ l& e. Y7 O- i/ m/ P" l. [
/ L! p: s( C0 k% x, y% ^
注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。
: t/ J8 \( s1 W9 F; e1 m% u4 F( y  W! [6 \) Y
$ depositETH 1000000000000000
, C) K6 Z: E7 P; Y, W; }- W$ k. S2 d8 ~
大概需要30秒来确认事务,你最后应该会看到类似这样:2 @1 r5 J( L& V' ^2 Y& U+ F6 P! Q0 f

3 B6 g6 R- `5 H7 c4 m: f6 _请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。% L5 j; K' Z. g' B! `. q
' e8 v! @2 L9 P; x0 z
由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
: l5 w8 {( ~. ~4 @
; Q1 N$ r3 Y  \1 a7 A+ H' T) `) S, O* D' A如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。
# _2 z6 E  o/ {: G. i/ k! X% r2 I1 k2 Y, `* y
要把你的币转移给另一个人,你可以使用:
3 N* N/ D5 _) d( O: d9 j( U+ S, X% x& e
transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。
: ?! {/ y) @: H! c2 j$ K8 T' A/ a* C) a* K% O
这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。  T! c3 T$ k( g+ f/ ?) b2 C6 \
. R/ Z  H) J# x
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。! X1 M) M: `5 J8 t

4 f8 i1 e' u2 F) d. \退出并最终获得一枚币( u! N2 }# m( c2 p7 ?

2 t& n0 }+ e$ y+ M首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
! C/ v3 x1 o, M7 i) N( K: _7 a' h5 U0 _
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。
$ F# |6 s) D. @; Z: y( G  g( Q  o  `( P
就是这么简单!! Y, D. v# A( S2 z
; Z1 c! q" N+ o$ O! d5 |& y
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。9 {4 c0 B, H% S
- Z7 C, b" z% N: Q& }
Loom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5