Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma1 h9 L' `4 a1 ]8 \% g
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
! J* x5 Y2 d' c( }# N+ V4 T7 c
/ i% B$ x% I0 E# O- [. f在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。8 N2 g' H, P' j0 V" x# X; S* ~& J
/ n- }( m( I. T! ?2 y& v) h$ W' j
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。
) K: |8 I5 G  x7 f' ]  B) _1 u4 T$ v6 n0 j* v

) J+ O% P( g3 q& e/ V, `2 F) r* K" k* |: N  K3 n9 D% S7 Q
如何在Qtum上创建Plasma MVP
' }8 l, x* l# F7 ^3 a9 N5 n; l2 K, S
" k& \8 ]3 _( y; x: s4 D* U7 W1 pQtum Plasma MVP 的实现基于以下技术:  T9 ?2 M$ L+ ^
Minimum Viable Plasma) G$ f2 m+ i: B
Omisego Plasma MVP
) d$ a7 e* D9 h( D
, O9 E7 p3 E9 x$ o1、首先检查你的Python版本:
' i: N4 i2 h  ~请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
4 i) \6 Z1 Q/ `% t- F
9 g  b/ K6 ?; t' N7 P% L* L! i2、安装Python5 T2 M% ?4 s# W( ]4 k* C( u0 ]" `
python setup.py install
1 K7 M9 ]; T; v& L5 X" p3、运行Qtum Plasma MVP
8 C1 ]/ r- d5 c1 k准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
7 v4 T3 Y; N: J& x# Ydocker run --rm \
$ A2 T* t2 J8 `$ t--name qtumportal \* b* m( `" ^$ e) O" ^, x
-v`pwd`:/ dapp \) a6 i$ C" o% ~) }4 f. G
-p 3889:3889 \3 d' {  c. E  |( t' M, B$ y
-p 8545:23889 \
% P( S1 A8 N/ f$ a9 Q7 Sdcb9 / qtumportal8 [/ d9 K, B2 X, ]# Y% c, j
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。$ b  y. B4 M. x$ {, l  t' V/ M7 k: ]
, ^$ O: P# ]4 T4 T
4、接下来,设置别名以访问qtum-cli工具:
0 O+ I1 {. X; @1 ?, ^$ I8 Nalias qcli='docker exec -it qtumportal qcli'* `$ E/ h7 \' O: m: }

9 Q& v8 `) o/ O* M  p4 M) \5、生成600个区块作为测试的初始余额:
- m* P& Q; A( @qcli generate 600
- k& l7 m1 B5 d9 s
; h/ G' h/ s1 O! W; X" F# i8 T6、设置 Qtum Plasma需要遵循以下步骤:
, {5 w1 ~  l! v创建两个Plasma用户- G! _  N, [3 e1 B$ V! v
在QTUM上部署根合约
9 g2 A+ a! I7 i+ K注册Plasma用户
0 q$ }8 D$ X; z. H! P6 c/ n运行子链2 A3 y$ Q/ y, v3 m& s5 S0 t, k

( l2 F0 R' S3 G6 e; {3 m3 x7、创建用户& Q% S2 y" I5 E0 B6 I+ v
你需要准备的事:导入私钥和账户充值
: l+ {& H# a8 h2 l5 V: W其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。
1 ^' y. {0 J  B) S& O/ L# Private Key" z% Y1 J/ h3 P
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35/ X! ]$ J0 F4 h  p; l
# QTUM Address Hex
" j: n7 p* O& `0x7926223070547D2D15b2eF5e7383E541c338FfE9
0 d0 I* x& c5 A% ?1 Q! r$ Z: X# QTUM Address Base58- s$ A; ~" ~6 `/ y% Z% q; X
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
$ V8 z% N& J3 [; w1 D5 N# ETH Address( y2 Q- H4 H# _' R9 @; O
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47& L4 U  p+ x+ F# G! ^# K

& b0 D7 x% @3 F6 e( l1 A8 [请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。
) a  y& M* T' }$ m/ p9 ~& }1 C$ N" ~! B
第二个用户的私钥(没有管理员权限的普通用户):
, L; [1 N, W) y# Private Key
( F3 x& @6 B! V' [  {7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e- l. l$ A* T- }: Y
# QTUM Address Hex
$ h& _+ B/ x' V4 {- _9 h0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D
/ w" c. S  j  U% l# QTUM Address Base586 w2 l. ^' d) P' G- Y8 ~% b# d; i
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
* _4 G9 A1 `! T: B! u# ETH Address2 Y5 o/ V6 y5 _$ T7 Z$ }
0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF& {1 U6 l0 `: ~2 O6 ]
导入这些密钥,并为每个帐户充值500 QTUM:
2 v/ z: O* J2 Q! S( w# Admin Userqcli importprivkey \
' t/ t4 S2 O# Z/ wcMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk; h& b0 J" _- ]- D6 E* x* y% d& @' v/ P/ v
docker exec -it qtumportal \
+ ~3 e: x, A" U4 O5 Msolar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \% k  n0 _/ l9 ^! q! I8 T: _
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
9 \: T6 ]1 j+ T) |1 u5 idocker exec -it qtumportal \+ U1 @0 |  Y7 F9 x
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000# \0 P, f+ X. z2 C1 R

0 T  ?: V& }6 N1 Z- V部署根链以及注册账户3 s2 b8 F* i! \; b" P
我们将用管理员用户来创建合约:
* g7 D# Y# h+ s, R3 x4 q6 D9 gmake root-chain
; U! ~: Q5 ], V6 n. g4 [/ ^& @  m# L, r- t, ^" L- S0 E
如果成功,合约地址将写入文件plasma_core / contract_addr.py:
- U* }7 z- k6 E* v9 m2 b4 mcat plasma_core/contract_addr.py
" c6 u2 E8 x+ l: N5 TADDR="0x2208595067499452580F54668104Ffb1b8755d79"
  O! Y% U' [( y, k原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
  T1 t- U" E9 l8 t: a4 A
8 S! t2 X7 u+ ~4 L6 ~注册这两个用户:; W5 |+ J8 ]% Q
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
1 |% P. [" r: m# a9 ?3 o7 j, l# domg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e9 L. B5 W) D$ l5 ~
: L" [. o/ e" v: e6 V: X
运行子链与充值账户# J' W$ n* U! U9 M  k4 D7 S
根链现在准备好了。让我们启动子链,一个Python服务器:" x: A" r. w/ h' `
make child-chain: x! P% N+ `1 A+ |+ D
7 u, o! R- g% F6 M
用户充值至Plasma链中:
6 z4 c( v& V" I' X; t我们使用第一个用户(管理员)将100 QTUM存入根链:0 F' \! z( @( u0 S! `* D& i- h
omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9
; y# J: d) ?5 x1 aDeposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
( F1 \  W5 O6 }. w$ u. M" ]5 y
& T8 ^: v. N4 v; [6 s当根链确认存款时,应该看到来自子链的以下日志输出:# b2 F2 c' q6 p" T
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000}); h3 T$ A2 ]; v: z# w

3 U/ x0 F& U- E4 J这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
3 i3 T# x/ C  ?$ m3 B  b; ?0 ?- Q" F+ X; d4 z
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。7 Y! J, \; R2 ~3 [0 n) T$ ^
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \
/ R6 H) M; ~4 m* s0 ~( @; j$ {1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
8 ^5 |' D) ~5 B7 G4 D( Q- z2 D0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \9 B; H3 ?) C0 o+ C, i0 g
0x0 \ `# vout 1` \
) b  K+ e1 g! X$ r- W! G) V* h0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \/ i8 ?  ?7 h2 X9 I3 |/ f! N  u+ ~! i
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
0 ^% h+ M% c* K' H$ e2 c( m7 P4 F  c00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
- X3 Y) t, A4 ?2 B6 E/ a
2 L4 C4 D4 `. b- ^- t交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:
5 g3 G' J) Y% r% U' L" b# submit a block with the admin's signing keyomg submitblock \, J; u% i' d: y, {
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35* j. T, v9 E2 D+ P9 r+ }
2 B& _+ Y* v; X3 f
子链应该输出:! \; Z6 f5 w) O8 @
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa2 ^$ c5 M2 Y: t& Z, V) `
2 ?+ ]5 F6 {6 `+ x/ m8 p

8 T, {$ P) Y  v链的撤销
! M7 {3 _( {( ~; q% W+ h, s$ g9 ?4 s1 u8 F9 R% _, B1 E
要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
) |& u# p" g, m$ S+ \5 Y+ B! _' e' d前述的sendtx,区块1000上有两个VOUT。  n4 a) y# K2 B4 |
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:9 [; s/ ^  B3 Y
omg withdraw \" o& M% B7 @& _9 z  l1 [& m+ ^
1000 0 0 \
2 ]2 A- I5 o& ?7 W`# Use user1's key to create a confirmation sig` \8 c6 ~7 t- v, w3 }: t
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35$ b" z5 `, O5 I8 C5 @
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:/ X; Q$ Y3 n# k
sleep 301 [6 D1 k0 L! T9 ]3 N: g5 _8 ~+ T7 S
在挑战期之后,调用finalize来解决链上的所有有效退出:
* R0 o* v5 v; h6 T4 x+ u2 Qomg finalize_exits
" P  S- H6 _/ b2 b+ t我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:0 F* r; t4 x8 z" K5 Z/ i
4 p* p! U6 S7 X* B5 L
bash scripts/getbalance.sh
+ |7 N- g( n) r/ x% K% F# u"balance": 5000000000,
# I* P+ A- }2 [6 J# j: m) o$ p$ ~4 d, A/ f, S% w; u
如果用户2也想退出,则过程类似:3 N  s, L2 f% }! d4 P: f
7 i9 o9 O& N$ s* ^" i
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
: U) i5 A0 D# P请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10