Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma
! i) @$ S  ^5 qPlasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
- U1 C2 D$ t; H5 ^: r% q+ F& }6 y6 n
在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。6 N8 z8 z# d6 W9 {* M
* C" a8 ]; `0 U" m/ Q5 V
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。
  t+ T9 w! k) b  k; R  B. [0 o2 L) J8 J. j

8 m. Z3 w, [; S7 |) R! p2 ?
" Z# @, ~; r5 i- R3 V% [如何在Qtum上创建Plasma MVP
) \$ \7 `$ [9 ]' R+ D- s
5 Z( l8 J! ?' }2 e( P8 U" @Qtum Plasma MVP 的实现基于以下技术:
2 I6 p. A8 V, S6 |( Z8 g  UMinimum Viable Plasma7 T) f$ a) ?$ v. O; ]+ H3 D
Omisego Plasma MVP' v' A3 O, L5 n# k- d
( K1 X* B5 z7 M/ i+ W. ?! \
1、首先检查你的Python版本:; ]/ c! X0 i2 I2 J! q7 t; P# D
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。/ A$ |& [' F+ U1 W% d- Y

. s6 m, k7 [/ D* M) I2、安装Python5 \" J3 a' W9 p: A8 O$ I' [
python setup.py install4 V6 n2 r, U( U# Q4 C) w+ s
3、运行Qtum Plasma MVP6 N" S; z# `9 M, X0 Y. _
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
  i5 J, |2 c+ R4 i5 Q1 K& M9 Pdocker run --rm \1 I* x0 a, u  J$ A$ ~; w
--name qtumportal \
4 Y, y5 L+ x5 E, \-v`pwd`:/ dapp \
3 L( i, D. D! r) G6 t% C. C( }-p 3889:3889 \
9 n7 e# o" l) ^$ N-p 8545:23889 \
# w# C4 }5 @0 x, t) `( idcb9 / qtumportal0 \( m4 l8 i7 T6 M" V/ s) L
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。3 @- J( `" {- s& U0 ]8 V
7 z9 F) e, y4 S
4、接下来,设置别名以访问qtum-cli工具:7 d9 p2 j1 u% _7 {% `
alias qcli='docker exec -it qtumportal qcli'7 V1 t% g% T: o- y  }

& h8 R) B1 ?: S% P! {5、生成600个区块作为测试的初始余额:- t- y  K2 _+ C" V$ E: H) e
qcli generate 600
4 @/ d4 n/ j" c# [! ?! U3 v; Y2 i+ E- T  f- ^
6、设置 Qtum Plasma需要遵循以下步骤:
  t9 [" e- q& S. ~8 b2 ~创建两个Plasma用户
- p" j8 z" x. L' \' H在QTUM上部署根合约
! M! @" c1 k; u, i9 z注册Plasma用户
0 D( I& `, t+ S% O) w+ e1 k运行子链" j: a2 ^' N* v1 S% {: n9 E% X
8 }3 r. N$ e  F3 V0 {
7、创建用户1 F, W2 g: {( ~! h
你需要准备的事:导入私钥和账户充值5 _' X. x. O' ~
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。0 z6 x; h  S; L. W% G  @5 H
# Private Key
- [$ c  D3 a# t* R# u00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35  V+ @5 _: D9 V3 x" i/ k- f; X; Z
# QTUM Address Hex
* f4 Y  \7 [& |( ?- \0x7926223070547D2D15b2eF5e7383E541c338FfE9
& |& E# v- b8 N2 K% T# QTUM Address Base58( m# K7 S  n. S$ F
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW/ o; P/ A" f7 S( c7 V3 j. [+ |
# ETH Address
# t9 ]" k+ k! W' G- \# h0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47
7 W: W( o2 `6 K/ h- K# c) U+ J8 ]" ^, n- s- E
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。# E" o; I- O/ W
0 x: _) I6 X& E/ o
第二个用户的私钥(没有管理员权限的普通用户):+ r; J. T! G: ?! |' R# p
# Private Key* B" n+ I7 z/ \7 v
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
$ ~$ g$ O" O' [4 u: C# QTUM Address Hex: ~1 ?% n+ S' N+ r. b, v
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D
$ a5 L$ s: l5 t# QTUM Address Base58( D' }$ N& e/ y8 }3 e
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf% [, U# s* j+ @& y: D7 s
# ETH Address) a  K) s0 M) c
0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF
& T2 C  x7 ^) A2 ]导入这些密钥,并为每个帐户充值500 QTUM:  ^3 m/ w% ^$ I6 P" |
# Admin Userqcli importprivkey \% o6 e& O& J& U6 f0 N4 g6 l
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk
1 I# ^% w& H9 D  z- Ndocker exec -it qtumportal \
) ]3 z* }) u) h) m' x- Isolar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
4 N( Z4 |$ Z& H' y" n. mcRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
; ?4 Y8 ]) J5 _( ~docker exec -it qtumportal \
3 _. f) t- V' A, Nsolar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000! a: L6 {9 C) B; u
3 I, ]) g/ k9 A$ E$ v( q7 S
部署根链以及注册账户
2 P! u! }: p5 v" h. u* `我们将用管理员用户来创建合约:
, ]  ~8 p: e1 ^' b2 K) d3 @5 T1 V8 nmake root-chain
) d. ^; I( }: U. v( X2 g
0 [+ P3 |# J4 s% j, r如果成功,合约地址将写入文件plasma_core / contract_addr.py:
4 T( R8 p5 u% D( ^cat plasma_core/contract_addr.py
  D% y7 \4 c# E3 ^4 A7 k0 _! z# LADDR="0x2208595067499452580F54668104Ffb1b8755d79"( H( h# `4 p  N
原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。- u" Z9 F- w8 Q! {& d
) M/ H2 Z3 }! a' h
注册这两个用户:
% Y1 ^& k- `2 F3 l) Y3 y; a! E0 lomg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f354 H( o' p% \- M1 Y6 Q1 J
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e" a& {) A8 V( G) D0 V! g
$ ^2 N) C1 N6 p# I, B
运行子链与充值账户
+ d; D9 C$ P8 e0 }* N; d根链现在准备好了。让我们启动子链,一个Python服务器:
/ w% l+ o/ O, [make child-chain- ?/ M, w" {. i8 K
: [: v. g) j  g) K7 U
用户充值至Plasma链中:  j# m& C0 W6 X
我们使用第一个用户(管理员)将100 QTUM存入根链:
/ j3 Q; c' r2 J0 U' X; Somg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE99 o0 G/ Y/ C1 ^7 z& y! U' }! B4 ?7 ~
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
) |3 M' L+ J6 N. H6 O- c9 }( ]* X9 V! y0 n# z
当根链确认存款时,应该看到来自子链的以下日志输出:
+ J0 L7 B6 K2 [# lapply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})9 @  m$ T/ x( S/ A  _# ^7 {

$ H: d# G( u- l0 X$ @& r) m5 Q这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
% y" x6 I- i5 g4 a- ^# B/ d9 `3 O- ?# L6 b% a' D
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
5 V8 V( m* K7 k  T% W0 E* Comg sendtx \ `# vin 1 (blknum, txindex, oindex)` \- H3 n( Z0 r" ~5 J. }  u- C
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \9 o! W! V2 N+ Q7 J$ n
0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \0 h8 r7 c8 d8 b- C
0x0 \ `# vout 1` \$ r" \" _6 l. x* b
0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \
3 {; |+ Z7 W3 w4 @( f3 |' m4 y0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
& p3 O4 }& s. M3 Z* P0 ~& R, [! q00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
4 \* `" |  e) b) J, H  u$ f; K' r) o* A2 j
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:
, F4 H& B+ W) }# submit a block with the admin's signing keyomg submitblock \
9 Y8 a" R0 Z7 _3 a00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35% r2 A# Q- x- [% b

! e0 m( X5 ]' r+ R4 _( M子链应该输出:
: e1 u$ P/ I: X8 ^, S# iutxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
5 t3 `( D* o" q: i2 a  P1 ?: f% c
; R4 p# r) F; b$ D4 b; h
& }9 C! t" A% S/ W, S链的撤销2 x" Y; H3 s$ ?3 Q3 q2 N, V

: ?) J" d: a1 d! K" E& X要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
( T' M4 q3 }  \; m+ W前述的sendtx,区块1000上有两个VOUT。
1 f/ a1 k1 \4 [我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
2 W( \$ i4 g: b+ j7 \' {omg withdraw \% N( G: R7 d' X) i/ R. w: c3 {
1000 0 0 \9 L7 o/ r: _/ w6 Q
`# Use user1's key to create a confirmation sig` \
0 [! Z! I9 C+ R' c' T00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f359 m% q- Y2 N- h, D' F; I
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:
" i) z/ U* t: p6 p5 i0 j8 h5 t7 @sleep 30
' ], o( x6 z; M7 I, T在挑战期之后,调用finalize来解决链上的所有有效退出:& ]# f; o% a1 |- k( o, a) |) H  O
omg finalize_exits
2 E$ U4 A( {7 f- l我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
) ]- U% G& d/ Z1 Y% k* E
7 i% ^* H* l1 K! s( ^! b/ ybash scripts/getbalance.sh
7 z! j; W, |3 S3 Y: V& W"balance": 5000000000,9 \" ]' p7 t7 T+ k( l3 a+ Y

: U' x! _& p7 A如果用户2也想退出,则过程类似:* W. @1 K# e) q( H1 `
. ]" X" A8 H' @4 h
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35/ Z* e) L- G. S
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10