Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma7 l- n2 \3 d/ Q; l. y) K
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
& b/ O* J6 ]4 c# M9 [7 t! h( v" d6 F8 A
在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
  l( n0 L3 Q# l, k5 E
$ K6 k# U3 e- Y- H5 B+ y$ XPlasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。
* Y$ T; `6 {# @, V; k7 Z% A! U* j  ]( V8 c: j! {- A* _: I

4 S. X" m6 h, C+ z" P7 f; n1 d( l" d! i. m8 b
如何在Qtum上创建Plasma MVP
( j( k/ q, y! q, P: I1 J, i2 i& A  a6 {- c# s( L5 J$ E3 \
Qtum Plasma MVP 的实现基于以下技术:" E4 @! T8 O* S( b5 r% k  U
Minimum Viable Plasma
: G& l6 k8 y# [( P8 U" o! e( y: S7 UOmisego Plasma MVP
5 y) V9 ?+ u  E' F) T
. \  q% ^& U  V0 x0 V9 M1、首先检查你的Python版本:7 n# r( x5 N2 i/ t( Z' H/ t
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
; M5 U: d/ q" _  g" z+ J$ ~8 q
% R2 a$ m. Z) L2、安装Python2 k7 p3 ~( E+ u, r
python setup.py install' g: G. K' p) Z' a9 D3 C
3、运行Qtum Plasma MVP9 o7 H' |: `0 P6 c* t# ~
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
& V; N/ f* A2 p* b, M% ~3 ~docker run --rm \; T) |$ B" k" Z3 c6 r
--name qtumportal \: k# V( W6 i2 P! W; _/ R
-v`pwd`:/ dapp \" a+ P8 a( m: r7 k% d! f
-p 3889:3889 \8 O3 u: y7 F' C' x
-p 8545:23889 \& J1 I+ M1 C+ K: I+ {3 W: r9 r
dcb9 / qtumportal6 I3 b$ d- E/ E
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。  l3 L/ ]( X9 E# g
; E' M! q* `# N  L" U
4、接下来,设置别名以访问qtum-cli工具:
% a2 d# \2 A+ \alias qcli='docker exec -it qtumportal qcli'- y. {8 P$ P9 b% {: J

" A2 u# n( d9 T: D, j+ F5、生成600个区块作为测试的初始余额:
% [9 }. o6 Q, ?1 Bqcli generate 600
* F* O* D  `6 f2 {& U" V/ \0 N0 t3 E5 |0 a) m
6、设置 Qtum Plasma需要遵循以下步骤:
5 h& s& p( u: T2 T! v% I) q+ j创建两个Plasma用户8 v9 j6 i7 V  v7 J" u& N: o
在QTUM上部署根合约
" ~/ j  |& M0 k% I注册Plasma用户) V4 I; J( C- p7 _( d8 h# s
运行子链
' O9 G0 N9 z- D7 |3 o
6 }' b! l, T. {/ w, J4 H* A7、创建用户% t# E. F) x1 n
你需要准备的事:导入私钥和账户充值% Y1 d6 d3 a- a3 @# X
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。  E# d0 E; q! m
# Private Key
. c. _) B7 ~  n! D00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
7 n6 N2 O5 W7 r# QTUM Address Hex, E6 U$ U# r7 J6 h
0x7926223070547D2D15b2eF5e7383E541c338FfE9
# D3 ^7 K2 M# r+ _& ?, T5 [6 q2 @# QTUM Address Base58" p/ i4 R. e+ S8 C" G
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
, y5 x. E0 Z2 d6 d# ETH Address
( k% e/ n8 K+ a# S3 m1 h0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47/ v5 S' |, H; p& }+ b
  p1 ^+ F4 b) n0 v. o7 ]+ H
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。: Y- D! ^: E& o; {1 \* Y3 R# l# W

% n. ~& l& o' ^: k第二个用户的私钥(没有管理员权限的普通用户):5 r; \  F0 L" l1 P( t& p- O  Z: z
# Private Key
6 i1 Q+ x0 e& ]& m9 n7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
7 s1 _+ `( N* x4 F* ?# QTUM Address Hex0 W7 R& E1 Z+ ^* y2 p7 G: y; s
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D& W& w+ n7 L- f1 u
# QTUM Address Base58
9 g: V, s# Q" S) q6 [qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf8 l( }# v; `8 }8 W2 M% a# p
# ETH Address
" [5 [% p# \# C2 Z$ H0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF9 b! _7 G' ?$ [! z- p/ e
导入这些密钥,并为每个帐户充值500 QTUM:
* N  c- ]. h, }/ f. w) G3 c# Admin Userqcli importprivkey \
4 S/ @9 q; R: c- N  IcMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk2 q) F8 e: D0 E& N
docker exec -it qtumportal \* _3 E+ b7 N2 a* b
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \( k2 w3 h# `/ B
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
5 A5 F- G" K: K7 [' r% p/ s7 v7 G) ddocker exec -it qtumportal \
# k$ h' q, K6 R* Z5 zsolar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000
  X; g3 V3 {) F6 z2 K& R) @. `( ~3 P* T* g; x# f& ?
部署根链以及注册账户
7 _: r7 s* I1 |  l! H2 k我们将用管理员用户来创建合约:0 J( C5 ~- k8 k; y7 T' q6 g3 N/ g
make root-chain
) C5 }" S5 K: x& _8 w6 I
) {* F8 q1 O* I! k# S( [如果成功,合约地址将写入文件plasma_core / contract_addr.py:
- a; P2 L/ R3 [7 scat plasma_core/contract_addr.py
* B% n2 ~. Q$ H0 ^0 @9 qADDR="0x2208595067499452580F54668104Ffb1b8755d79"
, K6 G, P: m" h" `8 `# c2 D原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。: K# H5 ^  r" }. n) B  E

; @: C0 s, u/ ~0 J6 s. V2 D" U; C注册这两个用户:# p1 ~" k3 L0 ?4 ?  a' @& i
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f352 q: ~, Z- k* M, A
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
6 t- V! z% ~! H
; g0 v# H, i. B7 ~5 M5 g+ O- s运行子链与充值账户
" V, U0 i5 n/ B; Q3 }) G根链现在准备好了。让我们启动子链,一个Python服务器:
& |: i( R& r8 v. D, I$ f  bmake child-chain& ~8 J' `$ S! F4 _% ?2 m0 O0 j
6 p$ ?, S' e/ v) }- n
用户充值至Plasma链中:
  Z6 Y* n* Q  Y) N, ]: V8 n. Z我们使用第一个用户(管理员)将100 QTUM存入根链:
/ v# @; X; O- K7 \omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE96 e7 i6 j; }- @" k! \
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9% ?, f+ t0 v& W3 k/ h! [, A/ u
4 q" Z! [9 P2 n0 J  l3 G3 H
当根链确认存款时,应该看到来自子链的以下日志输出:
% H+ `! o, _9 |6 ~, ~: V0 {' Japply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})4 Z5 a( ?" w4 r2 ~

  B0 o: Z9 v' r+ i, B: I- O这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
# ~7 n9 L3 ^3 O$ C6 ~. ?2 f$ {
- d$ d; i  w1 R& Qomg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。* O/ O  ^- }7 |9 l- A
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \
" H- F0 [) G- J3 j, A- Z1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
: {; h& Y' [* N" P5 Q0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \
, S6 i5 {/ b0 |% O9 J1 P0x0 \ `# vout 1` \$ v' E* X6 H8 v5 G8 L
0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \
6 e; y) i# h$ E( |# C3 o0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
& ^3 V& S6 ]# c8 p0 U00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35+ E$ z% ?/ F3 w- `
( P" Q) \+ M* l
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:6 _* h* M) c; b' j  x& A' K
# submit a block with the admin's signing keyomg submitblock \, \7 e- k7 K! g8 h
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35; W4 O" w/ `) k3 l2 q

& Z3 ]+ f- p1 g! @子链应该输出:
! o9 F  O- J) J% A1 y) N2 G9 Xutxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
) ?4 d, s& l$ J. D
, w7 L4 @% z, Z: s) o5 S/ [$ v
( e  [: h. k, w: G链的撤销: F1 J2 J0 Z, Y6 R+ M( Z

% w4 ]' b  c! g1 l* m, K, m要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
% {9 t( P  S8 f6 e% g! s$ s8 o前述的sendtx,区块1000上有两个VOUT。
; Z; @( O6 \+ T8 M# R/ y0 I我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:) |0 V% m/ q4 ^
omg withdraw \
9 ]1 I" L1 g! L1000 0 0 \
: v5 D6 P! Q/ ~3 B. c- z`# Use user1's key to create a confirmation sig` \, C% B5 x( {& _5 @) h- F5 a6 {
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35. A  `) M% q$ n1 ~6 m- i/ s6 R5 _
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:9 L) f. Z' f+ ?2 Y" Z# g
sleep 30/ `" |' g( W- Y2 Z( D) c# N7 I
在挑战期之后,调用finalize来解决链上的所有有效退出:
5 s& `  s2 b7 D- K: w1 h  Homg finalize_exits( w. y; j. @: \# `
我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:, ~5 M. F; A+ L& n) n- a3 K$ L0 \
" `/ W1 l  i- t9 ~$ A' {8 l9 M5 r
bash scripts/getbalance.sh6 o# q& [- ~/ R1 J
"balance": 5000000000,, `$ R8 `/ A5 y) }& t
( Q$ t6 B) a6 X  K% B' x3 @
如果用户2也想退出,则过程类似:4 X! `5 H( b7 c( a" _
0 Q0 }9 {9 p$ X) }
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f350 P" \" q) }, y2 O; G6 |: _
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10