Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma/ G4 h, t4 Q& j
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
" e* A7 u+ p- z4 i
2 y$ `2 D+ D5 A6 k3 m在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
. K3 }$ D( V( A0 G! m1 w: B; O: ]' o5 z/ G) a( |0 Z% `
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。0 m. e# f1 R: J8 _

' \9 r, Z# ~0 U$ |) d% `& B- G
! n4 K9 Y; R/ ]/ J  r* L: u( B. v  b: B" `+ r
如何在Qtum上创建Plasma MVP
7 N8 M- L/ ~4 d/ H
4 ^3 f0 e9 p( v4 p, C) ~Qtum Plasma MVP 的实现基于以下技术:
- {: L8 @1 w7 KMinimum Viable Plasma
2 N/ {; G: Z) [Omisego Plasma MVP
3 n. {* q) k9 V5 p* d4 Q
; l7 l& Q' `, W0 V1、首先检查你的Python版本:2 p5 z* J' P" [2 f3 @
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
5 t. E$ D" h2 d" ^! X1 t% _
$ m- U/ |  \5 V) E! c7 s! |: O  L2、安装Python
- x& }8 e6 v7 ~) r" ^; j3 Hpython setup.py install9 C/ d- N( c; \5 R8 @/ a- U/ s7 d
3、运行Qtum Plasma MVP! p; ]3 P4 s* b) T7 @
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。+ T' g) N( h' f' b! f
docker run --rm \! u3 r- m6 C3 P' ^# f2 T4 T
--name qtumportal \
) V0 p8 u; A6 v8 w-v`pwd`:/ dapp \
4 ~. L+ V$ t% {) y% w-p 3889:3889 \& Q, a% K3 Y7 N5 i0 L7 U
-p 8545:23889 \
. y& R& h  O/ {dcb9 / qtumportal. S; c# u9 C  d* b
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。
) I8 x* O/ A1 q2 v% X/ Q
1 Y/ x1 `' i7 r. N4、接下来,设置别名以访问qtum-cli工具:( {" v' H/ F+ C
alias qcli='docker exec -it qtumportal qcli'
) a" E. n! N/ X2 s6 }: N# Q! k
# W& Q# X  [  \- }. |5、生成600个区块作为测试的初始余额:
( l# Z3 z9 U. M5 E5 Y" Qqcli generate 600
* U# [# r5 r) {0 w( t/ E0 ?4 m' q0 ?& u" S* g+ }. ^- ?5 K! C' |& G
6、设置 Qtum Plasma需要遵循以下步骤:6 [. ?' u6 w; H( @) w* ^' B
创建两个Plasma用户0 K: k9 I" M9 e  U
在QTUM上部署根合约
2 Y$ l; [3 k3 E0 M3 H5 G! ^注册Plasma用户
$ e. ?! I) b4 w, O* L1 E运行子链- b1 u) w: p1 o2 E5 _
8 H- g  w! }! _* l" Q
7、创建用户1 @6 a- A8 f! l. x5 U2 o% Q
你需要准备的事:导入私钥和账户充值
" T3 o2 q& ?& E5 W1 a其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。* m' _% C# i; |
# Private Key3 y% R: m' K9 X  n3 w4 G
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35, O" Q9 i. N7 a, t; v7 F/ h
# QTUM Address Hex
- v4 y2 i& `/ T0 g0 k0x7926223070547D2D15b2eF5e7383E541c338FfE9
+ @% S% L" ]' }1 x* E( E# QTUM Address Base58
0 m( w. C1 l; B3 e$ u0 v$ h7 xqUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
7 w9 `) f  I6 C# ETH Address
! Z" Z. u0 l$ F0 n! p, h0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47) P0 J5 F$ r+ U0 F4 M+ b
: k& s9 Q2 i$ ]; N: M6 C' N) i
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。
9 v1 O2 Q' k6 L% @4 {+ @7 B- W3 T! |6 z6 j' R
第二个用户的私钥(没有管理员权限的普通用户):
$ }$ k& s4 Y4 I; e! F% @# Private Key4 T, L1 G9 h7 v/ i
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e0 n9 \6 @3 j; v$ {, r, X
# QTUM Address Hex; C' N. i5 [% u2 u* k' w0 J
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D* b" }/ b  y; e/ J4 o) _! c3 }
# QTUM Address Base58
, S2 C1 G* G% G1 V8 gqLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
8 |( h+ S/ T( _8 s; N, g* F# ETH Address
" _; K' D# x; y" D; U0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF
$ g8 L- M& j2 U导入这些密钥,并为每个帐户充值500 QTUM:
6 L2 i9 t# B8 I9 z# Admin Userqcli importprivkey \
( m* s" n1 U' Y/ A' Y$ IcMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk
6 V8 \: `" K3 P5 Zdocker exec -it qtumportal \# z0 T0 p8 I7 b/ x5 r8 j, t
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \0 d- e4 A& t( e3 Y8 s" b0 _& M' l
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
7 f1 ~- C$ Z5 a1 t' tdocker exec -it qtumportal \; N1 p, Z, U; E
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000; e/ N9 c- ]1 p) Y5 ?

" B: f, |: o2 n' q3 g部署根链以及注册账户+ D- k6 i9 Y$ I& f! ?
我们将用管理员用户来创建合约:
' l& _1 ^+ e! i0 r" jmake root-chain
# W! Z# `; [3 Q; z2 M
* ~  ~2 _% C  U9 t* O如果成功,合约地址将写入文件plasma_core / contract_addr.py:
/ D- r1 C# J2 u& v0 {cat plasma_core/contract_addr.py5 w1 W4 b% M' P  L0 R
ADDR="0x2208595067499452580F54668104Ffb1b8755d79"
. g) @; x/ y0 A+ E9 }原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。# @3 O; h; _6 d4 m/ Q
& e& ~" @* X) A+ m2 p$ @! [7 c
注册这两个用户:
3 m/ b! u$ u. ?" u1 ]0 p% eomg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
. _4 t) W% U) A% ^# homg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e( o, H) l5 ^* w2 F5 s$ U1 G
6 h1 i# j! m4 P& ^5 q& p6 ]9 H
运行子链与充值账户
$ ^! U. ~$ a4 Z4 c! y! o9 w根链现在准备好了。让我们启动子链,一个Python服务器:" _& D6 ?6 B4 j0 S9 L" o) C% U
make child-chain
* h. w% r  J# _; _0 T7 I) J! a4 J2 o
用户充值至Plasma链中:
6 {) e$ |6 G) Z/ D8 S我们使用第一个用户(管理员)将100 QTUM存入根链:2 }1 z- W+ S$ m1 ~
omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9
+ h$ B/ m+ {5 z' v& [4 n5 UDeposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9: N' M  w2 c' K4 N+ w, U- E1 R$ t

+ b: Y  f/ r; j当根链确认存款时,应该看到来自子链的以下日志输出:
# s" r8 ^5 j6 E6 t4 K8 c$ _, }' mapply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000}): X% L3 C' O5 J4 Q: T  L+ N

5 f( c# [% ?3 k6 h+ C9 o+ X0 _: U这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
0 B0 ^6 I% g" C9 C3 a
5 }7 L# T/ @$ Q6 ]" Z1 g9 y: xomg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
. w6 [" I3 L2 M1 M5 v+ Somg sendtx \ `# vin 1 (blknum, txindex, oindex)` \# _3 p: b% U) Y4 w& A9 ]8 |
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
! i4 h( b3 y( k/ w& |+ X% q0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \7 f) N' L) g" s- g. b
0x0 \ `# vout 1` \
6 O$ `( W( z2 r* X3 J- v0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \
& W& Q  ~) g# ^6 n7 j+ ?0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \. x: D8 q# J! ]5 r3 w/ B2 o
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
$ w  P3 C! ]3 L% S: }
; B9 V! ]) y( s交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:3 }- m+ }( y% h3 s3 G5 f7 Y
# submit a block with the admin's signing keyomg submitblock \
; U1 O1 e  p( J* S* T00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
2 g6 _7 Q! |* p, q7 o/ O
3 S: ^% O8 D4 G+ D0 M子链应该输出:
/ Y+ Z. Q9 c/ E8 Putxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa7 j3 B  V6 N0 ]. g; z! S3 e% {

0 p4 N& d/ D- b2 h" e& B) o0 h3 i) k; h+ u
7 @& k2 H; I/ q- v; N0 ~链的撤销* Z# i' o. B$ N7 I5 Y

8 X5 ^$ K( f/ U8 E要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。  d% \/ y' A3 K
前述的sendtx,区块1000上有两个VOUT。
, A0 c/ Y( @( D9 ~我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:, [' o% x& Y' F* y
omg withdraw \
" x, @8 n2 i3 f8 Z' r& `1000 0 0 \7 Q7 @2 C# W: t; |1 ?6 ^
`# Use user1's key to create a confirmation sig` \! r1 M, Z- @' {0 I, A
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35" `1 p( F" {0 S% m% F2 E, P
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:( D7 Z0 O" F: u4 T
sleep 30* e. f2 o* `* h! J8 U. E# }
在挑战期之后,调用finalize来解决链上的所有有效退出:
3 D% h, ~* I4 A! \. p, yomg finalize_exits
# T8 `1 j9 h) |我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
5 |- f# w" C$ Y& f& r& L8 x$ f: m& F7 x! P( c) f3 w  `
bash scripts/getbalance.sh$ t8 X3 o# {" w* z
"balance": 5000000000,3 G/ _* p# q' @- K; G

& q. j0 ~5 k6 w) @如果用户2也想退出,则过程类似:
; t( c, I- ~* D+ m
. o2 y! Z, ?) K" ?, Nomg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35: U- G. T0 g4 r) i! a# D1 b. f' v
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10