Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Loom Network 正在构建一个基础设施平台,以帮助以太坊扩展达到真实世界用例,这是第一个正式上线的以太坊扩展解决方案。
1 A, x& X3 b" N* [1 R  f- s
! G) I+ Q) x; {  b" ELoom 让开发者通过部署到高吞吐量的以太坊侧链来运行大型应用程序,同时保持以太网主网的安全优势。
- D$ a( g& e# E! W& a# ]) C' G& `8 P' ?3 ~, I- g& S
在之前的一篇文章里,我们讨论了使用转移网关将资产从Loom转移到以太坊主网。在本文中,我们将谈谈另一种实现方法:Plasma Cash。- A# J& ?9 \' @' H+ x+ f3 H% {

" X$ A! h# M( \; `8 M* @简单地说,Plasma Cash 让用户可以将他们的数字资产从以太坊主网安全地转移到侧链,而无需信任侧链。你转移到侧链的每个资产都会分配到一个唯一的序列号,并有它自己的事务历史记录。& s0 \! S6 `# M% Y- d+ K

' G7 a9 }& }4 D  d: P8 A+ ?Loom 已经构建了一个名为 PlasmaChain 的共享侧链,使用了转移网关和 Plasma Cash 两种功能。! g2 b1 ^7 c7 ?) \5 O4 u

5 i6 w; y* ]0 ]- M! x让我们先快速回顾下转移网关,然后看看 Plasma Cash 有何不同,最后再深入了解 Loom 最近发布的 Plasma Cash 命令行界面。8 M6 f& l0 V/ I6 q6 ^) S# v. T

6 ]' {# Y' X2 w2 U回顾转移网关
: U, @1 N5 d2 P3 r2 m7 \& W
+ x$ t0 u* l" n/ E+ i( h5 j转移网关利用任意的 oracle 来在链之间转移资产。也就是说,如果没有人发起的话,链之间是不会发生交互的。
$ @' R6 p7 e0 s0 T) k3 p
5 I" U* P' K, FCharlie 可以在以太坊主网上购买一张卡牌,然后将其存入以太坊主网的转移网关合约。这会触发 Oracle(服务器)监听该合约,以便在 PlasmaChain(或其他 Loom 侧链)上为相应的资产发出所有权变更请求。* T, a1 Z. _% Y% \

: Q3 X9 f1 }; ^然后Charlie就能去 PlasmaChain 上提取该资产了。这个代币只能要么在以太坊主网、要么在 PlasmaChain 上“存在”。要在这两个链之间移动,需要通过将所有权转移到转移网关合约来“销毁”发送链上的那个代币。
- `$ `0 U9 n- K9 H1 G2 k/ N2 Z4 ~/ F& Y
Plasma Cash 有何不同?
" X/ F9 y( l6 B0 C- \! E' p# A! S! o  L; v" I
Plasma Cash 的原理略有不同。 Loom 侧链使用 Plasma Cash 定期向以太坊主网报告梅克尔证明(Merkle proofs)作为“检查点”。1 E. U& U# e# `$ @

+ `- T6 `) v" g- jPlasma Cash 实现的工作原理是拥有一个存在于以太坊主网的以太坊 Plasma 合约(EPC)和一个同以太坊主网合约进行通信的 Loom Plasma 合约(LPC)。; {0 O  L- ?& M' g' d0 F! ]

% u; |/ G4 M+ D/ ?) |& B用户一开始有一个以太坊主网上的代币。然后他们将其 Deposit(存入)EPC,它会发出一个事件。此事件由侧链 oracle 接收,然后继续用包含存入资产的单个事务在侧链上创建一个区块 —— 单个事务使“退出”(或提取)过程更容易。
1 L4 u  a) w1 a5 T
: C6 w% c9 r, w, j. |* t1 U; d该事务将在 PlasmaChain上为用户提供一个 Plasma Cash 代币,代表其存入的资产。 用户可以以任何方式在侧链上自由地交易和使用该代币,包括将其转移给其他用户。% |0 c6 P* T* u# Q: D1 G9 o( g* x& p$ K

- o' Q0 @. v) uPlasmaChain 将通过提交每个区块的梅克尔证明来定期检查以太坊主网上的EPC,以验证代币所有权的变更。
( \# \- ~; D! V/ u% F* B' q0 Q; ]# [+ d6 h  t
梅克尔证明检查点! P" ^2 M; a# E

: D# F' k; F( [$ lPlasma Cash 链(实际上所有的区块链)都使用名为梅克尔树(Merkle Tree)的一个非常好的数据结构,来把有关事务的数据存储在一个区块中。% H/ r! L2 t! O* D+ V
$ x5 Y' M; b( a# x6 g( i' D; K
在比特币或以太坊的区块中,可能存在无数的事务。 那么我们如何验证某个区块中是否包含某个事务呢?
- D& a* E( ~  U1 z# z6 A
# D3 a, H, P! |% {# Q+ I/ P想象一下,你想要显示事务A在第500个区块中。一种方法是让每个人都存储所有区块的原始数据,然后转到第500个区块并读取事务列表,直到找到匹配A的事务。然而,这需要大量的存储资源来维护。; p4 k3 |" j4 {) V4 i  @
% Y8 I7 R: M0 s. C
节约时间和空间
4 S  {) S/ F$ q/ U9 A5 M6 ^+ J& v& ~
为了节约计算时间和存储空间,对于每个区块,我们还生成了该区块事务的梅克尔根(Merkle Root)哈希。这些哈希被用来当作区块的“概要”,并可用于验证。
6 p$ ^* `5 k" Y0 _
- }) y; S- j' d5 X8 c" ]" m- t! w一颗梅克尔树将事务一起进行哈希来代表该区块的梅克尔根 —— 一个固定长度的哈希代表该区块中的所有事务。3 @( N; q. M9 y  y& E6 m4 S* S1 m0 ]$ L
+ |3 y- M: K  b: Q7 c
梅克尔树示例; \5 p3 l/ L% ^4 M
8 X* o5 g7 U& S/ j$ r$ u' s
例如,这颗梅克尔树由四个事务组成,从 A 到 B。每个事务首先进行哈希,分别产生出 Hash(A)、Hash(B) 等等。然后,Hash(A) 和 Hash(B) 一起进行哈希,产生出树的另一层:Hash(Hash(A) + Hash(B))。在树的右侧,事务 C 和 D 也是如此。
2 o2 ]  O+ q. B; G# R$ R. ?
) K6 C& R; y% d" e1 w2 |因此,这个示例中最终的梅克尔根哈希就如下所示:) f. T6 Z9 G: ^1 a

7 C4 k2 Z; s/ {4 L' Y9 }  _Hash( Hash(Hash(A)+Hash(B)) + Hash(Hash©+Hash(D) )
/ ?4 o4 s) S: m8 p( U+ O  s5 @: S% n2 i7 D+ g/ v, Y+ Q
由于这个树的构造是递归的,我们实际上可以使用这个根哈希 连同梅克尔路径 一起来创建一个证明,该证明可用于验证给定区块的任何给定事务。3 n0 k6 c! f  x3 u9 w  ^" p8 h

0 }9 e; r+ A% F- ?( c例如:7 W3 L0 f8 F* T

0 L& q: [1 \  v8 f' d6 `验证事务K是否包含在该区块中, c0 t; |2 ^1 e% x" [
" }; M: s4 ?# R% e) C: r
如果用户想要用一个节点验证事务K是否在这个区块中,那么该节点只需要保留区块梅克尔根的列表。用户将提供(a)事务所在的区块号、(b)事务K、©梅克尔证明。: N2 ]) |! i% N! J  W  q0 `1 L5 {6 w

. x; y2 y) I; x. Y. S8 a& [梅克尔证明由 Hash(K)、Hash(L)、Hash(IJ)、Hash(MNOP) 和 Hash(ABCDEFGH) 组成。节点可以从证明中计算缺失的 Hash(KL)、Hash(IJKL)、Hash(IJKLMNOP),该区块最终产生的根哈希应该与文件上的根哈希匹配。
  c8 Z  O' d9 c9 A1 x
9 ^% _3 K" L! G; ?/ j+ [7 k4 M我们可以在这里看到节约的空间:" [/ N5 ]2 ?4 g& B7 e( _3 _& d

# z& `$ ?- i; o* N. o" p( e梅克尔树带来的空间节约
; h2 U# T  v- z
7 D- i% i5 W5 ^0 J为何如此重要?8 C9 b+ G) }; j  \

* ^5 ?8 x4 w- K" x- M% b9 R: n通过使用梅克尔根哈希,我们可以将一个区块链“备份”到另一个链上,而无需复制其整个事务数据库。这意味着,在存储方面,我们可以将 PlasmaChain 整个历史的概要保存在以太坊主网上。
" v1 {5 x* ^6 {: Z8 q& }; l- J# c% I
PlasmaChain oracle 定期向EPC提交这些概要 —— 上次概要之后的所有新区块的一组梅克尔根。以太坊主网上的这个智能合约(EPC)可以用来保护 PlasmaChain。( c3 F5 e1 m: O$ k+ R6 M* g

' q% A- ^* u# y( }8 [Plasma 退出
+ h8 Q& c1 R1 `+ h7 l- z; o9 C1 e) J8 V/ k! c& O0 R
要从 PlasmaChain 退出其代币,用户可以直接与以太坊主网上的 EPC 交互,提交梅克尔证明来显示他们是代币的当前所有者。
5 ?1 C. l5 g- W# w( x& D7 x2 c' N0 m/ X5 P6 w3 Z% M/ Y
然后,他们进入“挑战等待期”,在此期间,任何人都可以提供证据,证明这个试图提取代币的人不是这些代币的有效所有者。
. h% G! T( c3 Y6 s8 e4 r- {# Z
, m( O; l" C: d# ^4 T在此等待期结束之后,该用户的代币将在以太坊主网上可用。
0 M$ v  S: S% h$ F% i
* d! s0 U2 a& G" K! @6 D9 c6 BPlasma Cash CLI+ p4 p- w% A2 k

0 `9 I4 ]0 o5 q7 `) S0 d1 r8 x2 S好吧,让我们再深入一点,实际尝试下由 Loom 发布的新的 Plasma Cash CLI。1 `: N( p2 f. ]  v
8 d* _. a6 b, f" S& n
你可以在这里查看源代码:https://github.com/loomnetwork/plasma-cli' i0 x, b7 j) x' ?

9 O+ D' a/ C6 p- ^这个 CLI 工具以 npm 包的形式提供,因此我们可以使用以下命令安装它:- [6 w. |8 o2 E* Y+ y7 f
) s6 w8 k9 b2 n) J
$ npm install -g plasma-cli
& A" i, K& D4 C; r  _3 U. S9 O
& ]% Z4 ?1 o7 h+ H如果在执行此步骤时遇到问题,你可能需要确保使用的是 Node v10.9.x。& r  ~1 x. j" @
& K  `! w  |6 Q% g" l/ y$ z
在使用 plasma-cli 之前,我们需要用正确的参数创建 config.json 文件。 你可以通过命令行传入所有这些参数来使用这些命令,但我强烈建议将其定义为配置文件以便于使用。- o" b3 w( G, @4 h

" P- f' M' x5 ~0 S5 d; Q一个合适的 json 对象将包含以下字段:  `# [! z5 L" P) T0 v4 {
! n( s2 ^1 \: H! f, f
{! m7 ^' z! B  Y
0 A" H- @6 f: N% P' R
  "ethPrivateKey": "",5 |4 `: ?( i5 \

( Z  O& g* h0 G9 h  "dappchainPrivateKey": "",
/ K$ R/ c* U# s
# ~9 v! e# v: V: c9 ], g, K  "plasmaAddress": "",9 h0 s0 j1 T/ J) b  p" |

7 _" a5 {9 m- ?/ C0 N# b' L. P  "startBlock": "",
$ x5 G+ [, b' D# m& F
- Z% t3 O: p: R7 O+ N  "ethUrl": "",* F+ F$ ]; I1 `: j3 B- ^
/ y! Z8 P4 L5 s% e( S
  "ethEventsUrl": "",) M; w& `/ X0 s$ C1 |  X1 s, D# b
" q5 E7 e! S; j2 L( i% z: t! w
  "dappchainUrl": "",) B( s  I! R8 @2 A# }5 S
2 D7 r5 K8 X8 W$ X3 F/ l8 c* \2 ]/ {
  "contractName": "",+ X& ]. u" z( @
1 o- ^- R8 e- J
  "dbPath": ""
2 l/ g( P, F0 B
5 \7 ^: F, i; C. [! W+ I}9 U* n8 I6 F, B; R# l! p+ {5 g- J
: r; F" W6 J5 T! p/ d( J  O& c
我们来分析一下每一行的意思。* M6 W+ t! U7 f6 e9 Y

/ _" b4 B7 i" W/ o$ zethPrivateKey: 和你的以太坊帐户关联的私钥。- g+ W3 }7 ?& ~7 @# c

5 |/ v1 c8 I# ]" SdappchainPrivateKey: 和你的Loom 侧链(即本例中的 PlasmaChain)账户关联的私钥。
  \3 g: o2 d3 S. _4 M- Z9 C' y8 \& |% ?8 F6 ?9 z( ^, ^$ r
plasmaAddress: 你连接的任何以太坊链上的以太坊 Plasma Cash 合约地址。 如果你连接到 Rinkeby,则 EPC 地址为 0xd028e13a0b37e4b758b003a793cb6f0f6531ba75。3 Q; x& h: P" w" ?6 D0 x8 o
" J% r9 g/ E2 ~, M
startBlock: 部署 EPC 的区块。 这用于事件过滤,因此程序只会查看它之后的区块。  `# \" }/ {1 b" M- H9 F
5 X+ z4 K* y1 p# X& m6 X6 E
eth-url: 以太坊节点的网址。默认情况下,本地以太坊节点的网址是http://localhost:8545。我建议创建一个免费的 Infura.io 帐户以获得一个简单的 API 网址(如 https://rinkeby.infura.io/v3/{YOUR_PROJECT_ID})。
, K+ V* i- w$ A. j+ G- X; ^
: H# Q$ L3 X$ i! v5 J3 dethEventsUrl: 监听以太坊事件的网址。这是 WebSocket (不像 eth-url的 HTTP 网址),它在传输数据方面比多个 HTTP 请求都更为有效,并且总体开销更低。如果你连接到 Rinkeby,请尝试 wss://rinkeby.infura.io/ws。6 a4 P9 ^: O0 V7 }1 e! ~
) s% B0 |1 z- n$ i# V5 s9 M
dappchainUrl: 你要与之交互的 Loom 侧链节点网址。对于 PlasmaChain 测试网(extdev),网址是 http://test-z-asia1.dappchains.com! ?' x$ q$ ~* ?. `4 y, |8 P+ a

3 }% `. s8 b' ncontractName: 这个不是必需的,只会给你正在交互的合约一个名字;plasmacash应该可以的。8 H( `* D( ]0 h# ^1 ?: K0 z" X

8 _7 I" _6 g, V( gdbPath: 这是一个本地存储数据便于访问的路径; 对于这个字段,/tmp/pcashDB.jsob 就够了。
/ ?. ]$ j, j5 ?9 ?6 j4 A3 A! p/ l  K  ^. Z# n9 s
使用 CLI 进行转移
. H4 m, m" }5 B0 @& c: d
- y9 O# v$ f* B. q, Q当你准备好配置文件,我们就可以用以下命令来启动 Plasma Cash CLI工具:
0 h: X( s& V. s1 b& j# T2 I) F
" }4 q( z  X+ i, ?# D/ Z% ^$ plasma-cli --config config.json
0 c, o* T4 h5 L4 D2 B, v2 M7 W& p; ?( ]' e* G6 [4 T5 s
你会收到一个空的提示。很正常,仅仅意味着它初始化了 CLI 工具并准备好接收命令。尝试 help,获取这个新提示符将接受的命令列表。& Q% t. Y0 y6 S1 }9 k& u

8 Y, z% ^, G+ L  m% g1 p: y( V) r如果我们输入 myCoins ,我们应该看到 [],提醒我们当前没有存入币。我们接着把1000000000000000 Wei(约0.001 ETH)存入合约中,将它变成我们可以在 PlasmaChain 上使用的币。
! D* c" T  l2 W; Z2 X/ b0 V8 Z; t4 A5 h" P4 M
注意:要做到这一步,你的 Rinkeby 账户里需要有ETH;否则,你将得到一个资金不足的错误提示。6 O) \, y/ M6 Z

# M: A  e. o/ {( A  [$ depositETH 1000000000000000
" B8 c2 o/ c0 `- Q
- |5 d/ o, s/ P6 n大概需要30秒来确认事务,你最后应该会看到类似这样:
. A; {( f) s/ ^
6 x9 E: u2 |1 w- ~请注意,这是两个命令的输出:depositETH,然后是 myCoins,我用这两个命令来验证我的币是否正确存入。输出将有许多 [B],它代表以 BigNumber 格式编码的大整数(基于以太坊的交互标准)。其实我们只需要担心第一行,slot: [B] 这个数字是你的币ID,你将使用它来转移或退出币。
- l3 ~2 b  |; J$ N6 o1 Z/ U
( T' D# C( I/ k9 U/ B由于 Plasma Cash 的工作原理,当你把那个 Wei 转换为 Plasma Cash 代币时,该代币代表该 Wei 的整个值,不能进一步分割或组合(此功能正在开发中,将来可用)。因此,现在你有一枚 价值0.001 ETH的币可以使用。你不能在某处使用0.0005 ETH或者将两个0.001 ETH的币组合成一个0.002 ETH的币。必须退出并重新存入才能获得值不同的代币。
  H5 U' y, `- Z- j$ M' R: c5 ^, u- a/ |! e1 t: G
如果你试图转移 ERC20 或 ERC721 代币,过程也是一样的,除了你还需要为代币合约提供地址:depositERC20  或 depositERC721  。 字段将是代币合约的地址。! |4 p: l# G6 b

  C" \, n; l5 x- P8 }# u( K要把你的币转移给另一个人,你可以使用:: K7 ?6 J* k& e4 p0 Q
! k; x& |  V# R% h7 O
transfer  ,在我们的例子中,我们的0.001 ETH币是coinId: 96726d…,如在输出的 slot 字段中所示。- S! w9 |$ f  H* g
2 l3 s1 [9 D' C0 J# h- I
这个币的接收者 —— 在他们的CLI上 —— 然后应该调用 recieve  来确认币的所有权。如果他们不这样做,币仍然会被列为由发件人拥有。! E0 k9 R: F7 R
2 W+ f/ F5 v% A1 ~5 T0 u( Q
要从 Plasma Cash 系统中提取你的币,需要退出并最终获得币。
! n- ]. Y  d# W( q$ r+ {1 ], K/ Y) |2 ?" ~' L& {
退出并最终获得一枚币
: o6 c4 Y, {3 G6 O1 v* C7 `+ {. n/ F; w  S6 O% Y* Z/ `
首先,我们需要调用 exitCoin  来启动退出。客户端将通过向你收取挑战押金来启动退出。在挑战期收到押金,作为制止错误退出的奖励。在此期间,币的“状态”(如果你通过  或 myCoins获得币信息)为1,意味着币处于挑战期。
9 w% Z0 }; H: B, E) ?3 f! G8 @$ E) V' ^7 \8 A
质疑期结束后,我们可以对币进行 finalize ,将其置于状态2,准备取出。然后只需要输入 withdraw  和 withdrawBonds来提取币并返回你押的所有资金。6 S7 ]0 l; a) |+ X' T+ d

. Y3 m' T6 ]- s- M+ R4 C, |' [0 \就是这么简单!" _% ~& j6 P$ g$ }/ I: }6 ?
, L; \  l: s* W1 E! N* ?, K
希望这个通过 Plasma CLI 使用 Plasma Cash 的介绍能对你有用。 如果你遇到任何问题,欢迎加入电报上的 Loom SDK 聊天室,大家会很乐意帮助你的。
7 `6 G! |9 @! c, W, M
, [8 @  k# Y% d0 w/ bLoom Network 是一个为以太坊构建高度可扩展的DPoS侧链的平台,专注于大型游戏和社交应用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一杯浓咖啡 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5