Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma
# j- u7 y( @5 RPlasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
* G" l0 N  ]% F% X- ^9 o3 I1 d
- k6 B! |5 E  S在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
& Q* z3 Z' S' |8 K3 `
  u" P" P; T1 F/ T! ePlasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。6 ]; e6 X1 f" ^1 E3 ]

9 D0 P2 v% a# C  w8 {. \7 F; n
7 s# W% l; Z3 X+ E! ?* K  Z' E" e! W
如何在Qtum上创建Plasma MVP
7 o: I2 Z, ^, [  Y3 _# U' _! W0 e2 R0 ?0 K8 |1 C
Qtum Plasma MVP 的实现基于以下技术:0 e% [: n, b& }
Minimum Viable Plasma
/ q, Y; @9 w1 b0 D: rOmisego Plasma MVP, z) C- a/ E; W2 o

' ?( O( t2 |& N" j' p7 Q3 f1、首先检查你的Python版本:
; q8 W% Y/ O% K" j. R$ f请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。( S6 V: y+ s9 s. o( u- w4 v
4 q2 @9 S2 ?8 P5 h) r
2、安装Python+ T5 r) f5 I! z7 }* i$ g
python setup.py install
/ b- H- O  I$ B. [: U3、运行Qtum Plasma MVP
9 B: d' r) J! `/ {- Z4 ^6 g1 r准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。2 m! E' V' e1 o, |# v
docker run --rm \
% g$ l% y6 i' E# q--name qtumportal \
7 W2 e2 S' ^4 _! N' Z3 B-v`pwd`:/ dapp \
/ U  _8 e/ \7 X( z: @-p 3889:3889 \7 X" |! I& B1 S& C4 G
-p 8545:23889 \
3 C9 ]" n% o6 |  Pdcb9 / qtumportal
8 q  {( l9 F6 g/ `( @其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。
/ q, ~& N: D: u* b6 a+ l2 P" \) ^; W$ u3 s& M& }8 j4 a
4、接下来,设置别名以访问qtum-cli工具:
& @  q8 p" w# J0 b, valias qcli='docker exec -it qtumportal qcli'7 _, r; E9 k) m$ u
0 ~) y1 s! d3 V* w; G+ v
5、生成600个区块作为测试的初始余额:
/ f/ W( q! \- K: Mqcli generate 600
7 Q$ K/ C% d6 \$ k1 {5 G3 X, q. h! T" a' [
6、设置 Qtum Plasma需要遵循以下步骤:
* `! |+ k2 I) m! S4 q0 ?3 O* R创建两个Plasma用户5 U3 u+ _, q( V
在QTUM上部署根合约
$ I8 W) i' O9 V: G- a% [+ l注册Plasma用户  a0 R5 r# W. z, T  J) y) }
运行子链
; K2 `7 t3 _; `+ H7 [/ @
) e- z/ |; ?1 h! G7、创建用户
2 [& G5 R/ E! R* E3 k; J你需要准备的事:导入私钥和账户充值
2 G3 i  H0 M% m5 `8 ~其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。
, U. @5 e5 Q2 [3 U, K% m) S) v; [# Private Key4 i  P+ j* g- B( S9 {7 @
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
. o( v) u! O. X' u# QTUM Address Hex
: O- U# `# W4 ]0 I1 J0x7926223070547D2D15b2eF5e7383E541c338FfE9! w2 B: i8 E3 V  `, `
# QTUM Address Base58- B9 ~# x* g1 O3 d) O& d# h
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW, w/ a% x& d8 e3 D+ C; y
# ETH Address5 h6 D( T9 z! Y8 h! ^+ n3 E+ v! e& c$ b
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47
( x) Y: J1 t  D: D, z1 i# i2 c' L3 \
' S! V$ h' Q. D2 s) B# b0 Y% F7 W请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。
8 J$ U& m* |4 }2 e( l$ g6 y! y$ D! s4 J/ t' g
第二个用户的私钥(没有管理员权限的普通用户):) @3 a+ G$ M, v0 z, A2 z* H
# Private Key
& F% }/ t# a- `- s% t9 q+ f7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e# n9 j& p  R/ H1 K
# QTUM Address Hex/ s! J! g* ]3 ?( M) h. }
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D! E% @! J" m( U, z
# QTUM Address Base58
7 k* M0 X$ h  x2 m$ b; I( aqLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf9 P3 d2 ]3 }1 a- W
# ETH Address
" Z5 i. h& F* i7 J. [, `; p0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF% V, _+ t8 b6 w  Y. X7 Y6 [
导入这些密钥,并为每个帐户充值500 QTUM:
8 V- O5 [& s* {( |0 U$ ^# Admin Userqcli importprivkey \  P. e5 x' L' I2 U/ F1 ^& u1 T
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk
4 t1 ?* P- D7 q1 Mdocker exec -it qtumportal \
9 M  c# F! r& L! m0 W) @solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
% Z6 l  \/ Y# e/ v$ Z5 A2 ^! DcRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
0 H, L$ F$ M; S$ ~# H1 Z5 s$ xdocker exec -it qtumportal \
" K$ c$ n. S& P6 G" F' [solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 500001 ^. s7 J5 U: o

" |6 H1 |; m% `( i' _2 T2 D部署根链以及注册账户/ I9 ^; q% r9 j$ W* @! Q, s
我们将用管理员用户来创建合约:
) p) E* n! \! _4 k0 T6 rmake root-chain1 ]  t! r/ w/ L+ ~# j+ Z* R
+ Z6 T  Z2 D% V
如果成功,合约地址将写入文件plasma_core / contract_addr.py:
" T9 @9 v. ]; T3 x; }: l5 V& Ecat plasma_core/contract_addr.py
# G+ G2 \; K) G2 Z2 GADDR="0x2208595067499452580F54668104Ffb1b8755d79"
6 |; W' s2 i5 U& \; |( ^" O原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
- o6 z) F# }7 y# a3 {, |5 z! V) t9 c, N* a& t4 K: \+ N
注册这两个用户:% x: X" V$ R! E7 ~
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
; j7 A) u: _. j1 P  @omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
$ }% |) Y' `2 ~' x2 `% Q, @) h
+ C2 @% K; G; {$ K( R# s2 h  }运行子链与充值账户3 D& ]+ y- R2 b* ?) `; \* i
根链现在准备好了。让我们启动子链,一个Python服务器:0 o" [' K# g  g' Q& `& H" l0 a; e
make child-chain% @2 R- X0 K: X5 ?8 J
9 B4 K% [# R* ^/ H
用户充值至Plasma链中:! e6 ]6 y7 ]2 i, B3 O4 I
我们使用第一个用户(管理员)将100 QTUM存入根链:
8 a1 n4 Q  h8 f( Iomg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9
5 I! w3 f/ x0 ADeposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
# l# t& ^$ i3 @  U, G
" t8 j' a, c+ l当根链确认存款时,应该看到来自子链的以下日志输出:3 y; T2 h& W/ u
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})
$ y4 W/ h& }/ `% u5 ^' Z% J2 M0 r, Z9 Y$ v1 B
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
  [( a8 T  z6 K5 X5 a
  l" P: i" }0 Gomg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。5 P* _# a- W& K* e0 `
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \! t# V0 J6 H( ]- z# y8 r7 W" n
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
: Q5 k- M% `- w: {# P0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \
$ N- J) t5 F6 H. R' K& @1 l0x0 \ `# vout 1` \
8 F& v4 ]8 W/ ]( S7 c. E0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \0 r- f) ?! J9 ?3 z: D
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
: ~# g1 }: q+ i( s2 T: X) w+ b00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35, K/ \. }  m- N( C7 s4 Y5 k; U

; {2 G' i6 H1 a% _/ X, T交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:1 ?9 c" c: `1 e. J8 q$ C6 Z9 s# U! m
# submit a block with the admin's signing keyomg submitblock \" j$ L0 A. h: {. r* [; r' w% @0 A4 q4 t
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
1 h. ]' u. ]: s( d  I: l5 t' B  b! D& R3 X
子链应该输出:4 b( y( c; u, I  t9 z
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa, U3 m( Y+ Y. q1 [: M. w5 Y: W
" i0 u  S* ~/ S7 A! l7 b  U0 |& h
! w0 P% W& E9 }, }
链的撤销, |- K7 h% m1 Q* A

4 \3 [) B6 C- s. P" \要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
  B8 l4 n, ]! S6 a3 \前述的sendtx,区块1000上有两个VOUT。
2 [3 z' S2 _" H8 o( l) }5 B0 Z: q我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:, `" _: h$ }- j$ p0 Q. i
omg withdraw \
8 i- [& j  {: w1 o' T* w2 |1000 0 0 \
5 z1 U" M, @: y8 L- x! y`# Use user1's key to create a confirmation sig` \
! _& i+ [5 A9 e7 A6 s% {00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35" o! v$ W6 ]7 w5 ?# H$ j
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:  x3 ~; T; q2 U8 E1 L" P) A
sleep 30
& J# ]5 L( Z6 y: P4 o在挑战期之后,调用finalize来解决链上的所有有效退出:
: Z. E. E2 Z  T/ ~7 ~* @omg finalize_exits1 N4 h2 N% P+ j; R9 \* G( Z
我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:/ p9 ]: _* z8 F9 ?! J) `

7 B- R5 D% C0 A9 V7 \2 lbash scripts/getbalance.sh
8 X, }- q/ o- |2 }1 U. c& {1 K"balance": 5000000000,8 K9 [4 E2 b2 K0 E6 D
! H9 m) e- X; [8 r  @# \2 f
如果用户2也想退出,则过程类似:
- p% P7 p+ H5 k( v$ [4 W+ j
! s/ T! g  S6 P1 @, n! g% U% xomg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
* o' S* B  w* B7 d. u% d2 ?请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10