Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma9 P: d. f3 x  y3 y6 b* m  z
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。8 f1 v, y9 ~: A! r

" e* \, Q2 H/ Q$ o# v在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
0 Z3 H1 R9 F4 F( W. ~1 @' b0 |2 M! I( f8 M/ f
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。" }! U! j1 K/ x) H. M4 K
& H0 m0 l# l" B: A% a- m/ L: Z
( o0 h, d1 A7 l7 ]

  b! |) `' @  I/ a$ }% q如何在Qtum上创建Plasma MVP5 H) Z$ F& A7 m* f. y
3 W9 ^% c$ X: v! z* x3 |5 M! R
Qtum Plasma MVP 的实现基于以下技术:& V  }5 X) K# g; ~* x$ \+ r
Minimum Viable Plasma  E8 U5 `4 d" L* L. a
Omisego Plasma MVP
( I1 `/ F: M9 m$ L; z) L3 ~' T0 U. Q' A8 `1 m$ o$ a* T; {0 ^
1、首先检查你的Python版本:
1 P: p8 a0 ^1 n/ Y; c1 j, w$ h' ]请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。/ U6 H0 C! v. {9 ^. |
! p+ y$ @0 q8 j4 s/ e- @: c
2、安装Python
, k. P( I8 S$ \# Upython setup.py install
7 m/ ]7 P$ @3 Y" I# l3、运行Qtum Plasma MVP
' T  |4 u4 y' e8 d4 ^1 k: k准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
' c7 {! Z# U; X. cdocker run --rm \
9 P- d6 Q( ^8 L' Z--name qtumportal \
1 Z. A8 X  }# f-v`pwd`:/ dapp \
0 K5 f" N: L% T( @7 U. Y( X-p 3889:3889 \: H" i: S" u0 s$ {% O; M. _0 p* e
-p 8545:23889 \: b! V& [3 c* H
dcb9 / qtumportal
2 M+ Q- A. \& s' n3 V% J: f其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。  ?3 P# \2 D: [/ {8 i' u6 `

! V3 ^' j9 e" m8 c5 D4、接下来,设置别名以访问qtum-cli工具:0 t3 k' h7 F  N4 g8 T! s. ]6 ]
alias qcli='docker exec -it qtumportal qcli'$ ]7 H6 ?9 u: x. g; c

, c% F% U3 i" m9 b7 n! V  ^5、生成600个区块作为测试的初始余额:: o8 ]- o5 b0 a* ], ^
qcli generate 6009 W) o5 @0 j% ?$ W- |' b
, o% l. y7 V& u) P* a5 C1 K
6、设置 Qtum Plasma需要遵循以下步骤:
" A" r$ ~7 E+ w) N: w0 o创建两个Plasma用户
# n* a& a& N" `4 a在QTUM上部署根合约3 R. b) E/ J+ D3 w$ g6 m$ Y
注册Plasma用户
7 S7 x7 y, z' O6 u3 o& g( U( g运行子链
+ f% ]- H9 n8 i: b* D
5 g( P6 M" v. g. y7、创建用户! G' M  c! E! W6 N2 |
你需要准备的事:导入私钥和账户充值' s4 p% N0 w5 M; V# `
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。: Z9 n7 o/ \9 d& Q; }! k
# Private Key% ]; n8 N& U/ ]+ q- L7 T
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35, N/ J5 E; ?0 Q  @3 T3 K
# QTUM Address Hex2 {7 m; R. X& Q/ G; m" y$ a* ^
0x7926223070547D2D15b2eF5e7383E541c338FfE99 Z' a/ }5 z" ]
# QTUM Address Base58
" x/ d  }& f* _( w4 B0 |4 D: OqUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
4 t, Z- t8 d- @2 u0 {3 \# ETH Address- ]+ B5 z+ x! K
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47* M! s8 e- |- }2 B. W
3 h8 S4 t. k( M1 g- F
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。# \$ x+ t; @8 u. c2 u0 N* H1 c! `
% y% Z$ D. ^* t( g3 [1 x
第二个用户的私钥(没有管理员权限的普通用户):' D$ R7 G9 V7 {4 V7 z% u; U8 [
# Private Key  ~+ t: _% p$ _9 f' G
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
' p6 @3 F$ S1 o* I2 {" f# QTUM Address Hex
* `( R% K% _& W% a0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D
" K& b7 |. s3 g9 M# QTUM Address Base58
+ S+ \) j( p1 b% G3 m3 C! p9 _qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf( R, g7 O! ~4 C, h9 Q* H
# ETH Address
) @! M* Q- c3 `0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF; R: p  W3 f! q, J( ~2 I
导入这些密钥,并为每个帐户充值500 QTUM:+ l. M' c) ?$ ~+ o
# Admin Userqcli importprivkey \
9 X- ?9 R/ e# u7 g" rcMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk2 t: V" u( x( h
docker exec -it qtumportal \% a4 h$ S! ~* ^. r$ O
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \2 T8 o, G! B' X' q
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
0 S& e& S+ `) V: W: ^docker exec -it qtumportal \. S# {7 h; o: |/ G
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 500000 t# w1 J' N+ g( g# V5 G* ~

0 P+ v; J6 g) G2 t# Q$ t! \! V部署根链以及注册账户/ R8 E5 t' K6 T+ t# N
我们将用管理员用户来创建合约:0 O( \1 Z+ T$ l: D& O9 d! o7 `0 `
make root-chain. H2 Z" V/ j, o9 ~, x
1 Z6 \: \9 L- B7 U* ~! K3 V
如果成功,合约地址将写入文件plasma_core / contract_addr.py:
" s; P; v, Y$ k) f& ^9 d# X# Q+ ~cat plasma_core/contract_addr.py
0 P* {  F% X- V/ ]ADDR="0x2208595067499452580F54668104Ffb1b8755d79"
* l: I+ h2 c3 A( o) r1 ~/ T; q原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
7 }( R5 b  S- Y% y" X# Q) w6 J1 e4 a; d4 G4 o8 W! q
注册这两个用户:# ~0 ]. a! |/ b& M- Q% ?
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
  S) b/ X# T: v8 X9 G3 \2 O( jomg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e0 U# U% S1 H7 u

/ w% P* v4 M# J0 F: S运行子链与充值账户
! e) S) O1 ?) m/ c/ Y根链现在准备好了。让我们启动子链,一个Python服务器:
1 q8 L* S. w# {* Zmake child-chain% t2 F# E4 q$ n; L0 f
. ~, w6 _: l# x, A: v0 @( o
用户充值至Plasma链中:9 A9 f, t$ d5 r1 x( C
我们使用第一个用户(管理员)将100 QTUM存入根链:
" Z- ~$ T$ v. w/ {omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9
, ^+ ]  y2 M' l9 G% Z; Q) jDeposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9& K+ V2 C% r4 H
  |7 F: A' C; d4 s* z
当根链确认存款时,应该看到来自子链的以下日志输出:
5 c  j3 k% W8 K6 B! c4 Q, Vapply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})0 u0 D% E' \4 X8 y$ L0 B

5 n+ F. Q5 h5 L& ^' N这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
$ l% R/ P  v/ s( s% f2 n# f) P
9 o$ z* g- X6 [$ S8 oomg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
; o1 @) {( T8 i+ f& c* s7 womg sendtx \ `# vin 1 (blknum, txindex, oindex)` \' v5 A) H+ E3 D
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \8 A/ S! e$ p" n/ v2 b- p
0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \6 O% j8 a0 _$ v! s9 e, X- p
0x0 \ `# vout 1` \4 Q9 J( O1 V  k2 T6 _* [
0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \
+ ?: M# {1 o; c2 i$ g0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \) }' p2 Y6 O& w3 {: j( ^( P
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
* S  |: `8 q# v. Y6 ~: E$ p: W" @3 n
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:
* L8 X& D* F( W- w: y, Z2 H# submit a block with the admin's signing keyomg submitblock \
% T$ g& a4 E* I: N1 _/ k00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
% W! w/ k" k; ]/ ^, d( n
  c2 f& l- P- x6 \: K) y1 p4 x# p子链应该输出:
2 Y5 F9 @  Y) n7 Nutxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa# ^- [. O: N) Y9 f* m3 B

% o# i8 B" ?  t: l' s2 R) u! ?3 f3 O  y* }" ?
链的撤销. l+ c# G0 p  [) `

" T4 d( U1 g3 H4 f" \% C1 P9 R  N要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。* ^2 p7 n* j1 _3 G9 |
前述的sendtx,区块1000上有两个VOUT。% F3 d- V6 @( j
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
2 G7 Z& `. R: n8 Tomg withdraw \2 x" R( V0 x. Y8 m
1000 0 0 \+ m- l8 k! L: H6 k4 A
`# Use user1's key to create a confirmation sig` \
3 c% p* y4 ~% T" t4 V9 T5 b& i00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
/ E4 m: a$ u+ V; [* @, f一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:9 S* \, H( A: m
sleep 30
0 n* U" R' [. v& r% B在挑战期之后,调用finalize来解决链上的所有有效退出:( Q0 n# a3 z  [% Y& W
omg finalize_exits2 y, t1 i# ?( n6 E% F4 ~
我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
( i1 d9 w  u1 s0 O* ^( {0 F% W0 G, U- i
bash scripts/getbalance.sh  @+ s: X# M, s/ u8 j
"balance": 5000000000,
( c, d' |7 [5 e# w2 Z) G/ O, Q; o9 J7 Q
如果用户2也想退出,则过程类似:
+ g3 r2 r: K, I$ E: H/ {2 ]1 J: }
, {9 x; h" J$ m6 b, Iomg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35- L. k3 e! b( k4 v* [8 H% r
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10