Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma
1 D( m/ {6 z- h4 U( g6 }% WPlasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。$ t, n. J4 }: w

$ S' F  `  y" Q' Z  }( C在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
& M( Q6 _2 o1 M
/ B0 F& ]3 ^! YPlasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。% h" }# }( Y0 ~7 C1 ], H

+ g& l  e0 d! g! ^% a' `
: e; r3 c5 R/ q5 T
9 g# Y2 Y9 r" S: F$ I' Y如何在Qtum上创建Plasma MVP: K$ @9 U* c) {  W, H9 K

8 B3 z; G  e1 I4 C4 S/ TQtum Plasma MVP 的实现基于以下技术:0 I) }/ w# X& a8 T
Minimum Viable Plasma
/ ?  c/ [% ^1 `- ^! j: AOmisego Plasma MVP6 \, h- k8 |! ^% `2 r' H$ M
' L5 }* S  L, q5 j' [: c+ M$ h
1、首先检查你的Python版本:
5 T  M" P) Z; ~6 l+ O5 y请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
% v7 t$ k1 v6 `( U( G! v1 u: A4 y7 U' b( H4 q  |
2、安装Python
2 X" y9 }6 l' h1 o3 ~python setup.py install
3 H( c: [* |/ R; F  C3、运行Qtum Plasma MVP, a& C2 g% `5 [% Q; q7 _: f' C
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
$ w3 H# G/ v! @1 \$ w9 s- Ydocker run --rm \( e, _, g3 |4 D% a- N
--name qtumportal \
, |0 n; q% W. @! I-v`pwd`:/ dapp \
% \* W: s. @1 J( Q( g  L+ l-p 3889:3889 \
) H- R) [1 A) j+ S3 g2 c-p 8545:23889 \" x9 ~" [6 z' F  `* b6 Y% m+ f
dcb9 / qtumportal
# _2 b" Z' B# _$ _其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。  ?% P8 t7 p% H/ c7 ?# {5 [* N
  _0 }" C- f0 M0 `' ^
4、接下来,设置别名以访问qtum-cli工具:
2 h. e% h; Y- y; C3 Talias qcli='docker exec -it qtumportal qcli'% A# W- N  L  g; A6 I
+ |+ R4 a# p! @$ q/ F( m% P
5、生成600个区块作为测试的初始余额:+ W& W) b- T5 |( e' q5 D/ n
qcli generate 6009 l4 h1 A. @% ?  D) M; k8 e& C0 B

8 f- M, X1 }, F2 G" [6、设置 Qtum Plasma需要遵循以下步骤:
( x* b& ?7 R& o1 \$ L' Y9 S1 X) q! g/ i创建两个Plasma用户
3 L( O+ i: b: J" c' `在QTUM上部署根合约
: {) r/ Z$ V! }$ X0 k9 J* ^8 w注册Plasma用户0 ~% [* ]% {  ^) G- A. g; g
运行子链5 [9 {; r4 p+ P& F+ ~7 u  |; x  I' N: ]
4 K7 d6 y! Q, R6 K! c5 D2 j6 d
7、创建用户( \( u) _" g# A$ v4 x( E+ P; n6 Q1 w
你需要准备的事:导入私钥和账户充值
5 P9 L2 {7 x4 r' ^" ]其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。6 X# u1 i5 K' ~& x  ~8 o% J: Q! s
# Private Key& Z* \/ Y. G% Y% N4 j
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f351 e$ c9 L) z4 A8 |  o( c, Y/ h* ~* W, t
# QTUM Address Hex
; f( ?. z, e- i) j& U0x7926223070547D2D15b2eF5e7383E541c338FfE9, u7 M, ~1 j! I, i; v: f
# QTUM Address Base58
/ e- X3 K% Q$ qqUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
$ ~8 ]* m( {. w( U# ETH Address; ?7 j- T5 y+ |+ D+ `/ l1 ]# v, ]
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47; B4 a& m; w& G% N" ?
( o, a5 d. S  m
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。: E1 P( T8 O) b8 V; R: [
: M& o7 S  o( t9 g' W. `
第二个用户的私钥(没有管理员权限的普通用户):
9 Z- e' c7 M! ^2 e# Private Key& M6 I5 p; C) y3 z( S# a- h
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
3 \0 c5 E1 y, G! ~# QTUM Address Hex1 v# _: d0 n9 h8 v' z; U8 ^$ r
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D# e/ X5 l( L# F6 h
# QTUM Address Base58: N5 o$ [$ l% o9 f8 t1 h% G, @
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
5 C1 q6 s1 s% r% T# ETH Address
9 i& C$ L6 C" r6 u0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF5 }& T9 i  w9 q9 `; \& u
导入这些密钥,并为每个帐户充值500 QTUM:; j% w/ d& m% i, y) t" a
# Admin Userqcli importprivkey \
9 c# e: n: j3 _4 _cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk$ j4 L, ~  p! ~" |& Y+ s9 H
docker exec -it qtumportal \- I/ C* A( T3 {$ E! K
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
9 X. r4 V: n# A0 M) S5 PcRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
* b6 O1 g0 o4 v2 c1 J8 ]docker exec -it qtumportal \6 r7 \& R. U6 {4 j7 M, g
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 500005 K: O/ e% E: n" J6 y

$ U; k' ^! i" j部署根链以及注册账户
/ q$ d5 O: R8 P8 F6 f9 D我们将用管理员用户来创建合约:0 Z- S: p# D* t/ b/ C& t
make root-chain9 l, j/ U8 i8 T& P

1 Z) m& S. g: E如果成功,合约地址将写入文件plasma_core / contract_addr.py:5 v. U; {: g8 E9 |
cat plasma_core/contract_addr.py0 [* Q, A. P1 D* l# [3 z7 @
ADDR="0x2208595067499452580F54668104Ffb1b8755d79"
( u3 O& L8 W5 O# l* I. Z! X7 V原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。6 b$ z: O$ Y  I" D
6 z% j: u; b6 ~
注册这两个用户:
. E( z/ e8 o3 b: Q3 C: o' romg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f359 W( s$ [7 H/ u  @
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e, o" [: Y. Q( A4 V$ B
, s7 L  ~2 G' |+ y3 F/ N
运行子链与充值账户2 k& w% {: f* E# v- x4 B3 y; q8 k
根链现在准备好了。让我们启动子链,一个Python服务器:
; t9 t8 ]. y# H! ?( {; wmake child-chain
( y3 h7 h  B8 `! n6 t2 x$ ]. O" z8 p8 m+ [9 ]: \
用户充值至Plasma链中:
7 M! m, Y( `% ?6 F% f/ S. n# X5 F' f我们使用第一个用户(管理员)将100 QTUM存入根链:2 t' B7 C9 [- c$ O/ W9 `8 U
omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9! p& s. V: s# `7 y0 B* q
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
7 _. S8 e% d5 g( U1 y/ i
8 Z; X/ E# i7 e, F' p8 U' A( B当根链确认存款时,应该看到来自子链的以下日志输出:
/ k1 F: D, s$ ^! Oapply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})& q1 D8 {4 H( W

- ~' x* q8 I4 ~这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
9 {" I" Z" Y7 M8 }
% R  S' z% B4 i% C. T7 Pomg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。# x. ?0 Y1 e) |, }
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \0 u. ]1 }6 B1 Z/ L
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
% M+ u  p+ `% k+ k$ H0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \
5 ^2 d7 c, m- U+ Q* _" ]8 ^0x0 \ `# vout 1` \
: q6 K- U  M. w6 A0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \, Q& J- ]0 s! \8 A; I
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \8 L$ a5 D6 V+ q+ T% r2 E% _2 t
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35* z- r" R. v, F" ?# E
/ o. T1 M' E. o" H: A% u" n* z
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:
0 c: s5 i5 K; q  j  Z# submit a block with the admin's signing keyomg submitblock \2 N% Y5 J. ]" H" G
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
6 A" N2 q* s+ {. ?4 F* C- U+ Z  X8 A
子链应该输出:0 H6 D& Z( g! R/ ^8 U8 p2 T8 z8 a
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
' ]0 D! \0 E; K% K9 C* Y" o) S; F3 J& P# q

6 }+ A9 ]0 A8 b9 Z链的撤销/ @; w: k# e! ^- @4 U8 F1 m' z7 W

0 Z' J* Q( |1 a" q( s要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。" A% e* _2 b; s) [
前述的sendtx,区块1000上有两个VOUT。; A1 k+ }; J. E4 ~9 _3 l
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
* D. T# F" ^: `: _( Bomg withdraw \
$ H, d' A/ c. N7 P1000 0 0 \" P# X  G; I: k% k5 J' U2 m2 h! {
`# Use user1's key to create a confirmation sig` \+ y7 ?' V7 p  s& L
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
% |+ S4 s$ |4 E# ~0 ]5 M& s一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:. W/ x1 S; J( l5 `
sleep 30
8 Y# g- i% }; [" Q4 {$ s# z在挑战期之后,调用finalize来解决链上的所有有效退出:
- V$ N: ?0 y. |+ Uomg finalize_exits
/ c7 t- {* G* F3 k( f& y% J我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:* q! b2 {% P) e

3 j; W2 ~5 t5 {4 fbash scripts/getbalance.sh
2 X) d6 N7 j1 V# E"balance": 5000000000,0 O2 y* I* Z# T7 @" f
0 X8 r4 w- i% D; `
如果用户2也想退出,则过程类似:+ ?9 I6 `- r  k% [! C
& k8 @* u6 T+ E* c& ?
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
! s9 |& n0 D2 Z2 ~  T请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10