Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma' ~7 H/ t9 b# r, Y+ T
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
' [! J, s6 ~+ z1 g) b0 l
4 R+ E# i9 S7 D" n1 _* T" q- b# Z在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。: W& l) X) f, E' a. n. x3 w
- h0 ?. M* W; Y+ }5 Q& B
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。
' H% p/ `9 B7 x3 j0 v3 \: l
; n4 \5 k3 g( E7 P
. l8 [7 Z: w6 L' L1 x+ p9 l9 Y7 V- U" r3 k* k( V# o% a9 A1 L) {. `3 l2 _" M1 }
如何在Qtum上创建Plasma MVP
( _" b; F1 R, {4 u2 h7 r
' B0 J& a" x: A- n) A5 CQtum Plasma MVP 的实现基于以下技术:
& s2 y8 P8 z) e. rMinimum Viable Plasma
* e' L, h7 p  A7 v3 i' O! pOmisego Plasma MVP" |% z5 r) v9 ^3 [* F2 z% ]8 z
$ ~! o3 W* n0 D4 B+ s8 W( E
1、首先检查你的Python版本:# N. B9 H/ ~+ s' b
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。  W: A9 z3 G& w8 y( z; x

2 s% M9 H1 t9 }7 O; P2、安装Python9 o* ^7 ]/ A: B/ h
python setup.py install
* `3 K' U: P9 G, L) S3、运行Qtum Plasma MVP5 K3 P% N/ N5 P! M2 x- W- z
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
1 ?/ y0 J3 N" h/ O: X- Zdocker run --rm \  n* ^) k. U( D. ?' k2 c* i6 H
--name qtumportal \- H' |% C% n5 a6 l; B5 n! L
-v`pwd`:/ dapp \
. G$ q9 W( U. i9 J, d5 F4 k8 D2 O-p 3889:3889 \) U  L4 m2 f, b/ Q* b2 j
-p 8545:23889 \2 b: O( x/ @" `( p
dcb9 / qtumportal
( ]& e7 f* a) y, I1 N其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。' ?5 z  M" p& M3 |9 s% e# n* F
7 k, d* T; `2 }2 ^& t
4、接下来,设置别名以访问qtum-cli工具:& F8 d4 Z$ ?; ~" X
alias qcli='docker exec -it qtumportal qcli'+ b% p" H# L* w9 x7 |4 ?

+ i( M/ h: A# G/ U3 P9 n) ^! n5、生成600个区块作为测试的初始余额:8 F; [+ B$ Y# W6 r  T# T, A# N
qcli generate 600
. G3 h" B# d8 V/ Y: `4 s; ]5 d# T/ u) P- K. T& G; m! X; r
6、设置 Qtum Plasma需要遵循以下步骤:
6 _% o) L1 \/ R* C创建两个Plasma用户
* s; w1 V0 B9 C" _在QTUM上部署根合约, Y# i& {- w( |) d$ C
注册Plasma用户- M7 p6 Y# h% K$ N% G
运行子链
- w( V& y& T9 B9 B( M2 J7 z- L* c, ^9 D5 Z3 E' F
7、创建用户
7 l/ M8 ^) `* R你需要准备的事:导入私钥和账户充值) i- L* b! p  h5 h% X% a2 B* D# z: w- ~
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。) R# ?# L  q+ U' a. M7 q) U5 v
# Private Key1 [2 e' C( M, M( h/ b
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35% s7 E/ m: N) d1 o8 f5 z
# QTUM Address Hex
% c6 ]7 I$ }6 O) T0 m0x7926223070547D2D15b2eF5e7383E541c338FfE9
2 \" O  o1 _5 X9 K4 i' m/ y# QTUM Address Base581 A2 {6 n, f0 U2 B7 [+ M( z7 f
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
, t% h6 q; U( K0 `/ \& q2 D# ETH Address3 K  Y9 C: z3 l
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47; T0 \# {3 @4 ?" F' g

, ~/ g6 S& c8 I* g9 |6 @% Y7 c请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。. n$ d8 T+ i$ C: l7 \
1 }0 m1 K$ V% p. s
第二个用户的私钥(没有管理员权限的普通用户):" U2 Y9 l1 u1 |- a+ U: d2 k) ^
# Private Key* X. K4 w* U( v0 z' v9 a# s
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e4 K8 [0 A! R  ^2 u6 l
# QTUM Address Hex* e8 S  D$ ^9 I# c, @1 _$ O, R
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D
7 A9 M/ ~- z+ b4 h* {# QTUM Address Base58- o4 H* P# n/ r) x5 x- F: W* {
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
* A0 Y1 R5 B) K& F- |# ETH Address$ e+ h( @4 }% d9 y8 ]: `9 {( y
0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF
9 N8 C2 q" Q9 |; e导入这些密钥,并为每个帐户充值500 QTUM:
. j1 O8 m9 F0 B  _4 b' L3 S9 k/ d# Admin Userqcli importprivkey \. b3 Z: |, h* X8 u
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk6 T+ A& o0 i9 h7 h* g
docker exec -it qtumportal \
5 \0 v8 ^9 L$ b# O6 k* p' M( Psolar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
) a+ z2 ?  v4 X  `- Z5 v* HcRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ9 {2 Q6 ]; [! h, \5 c
docker exec -it qtumportal \6 v; V0 Z- q0 a: ?% q
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000! g4 K7 Z* K7 c5 F2 B

& Z$ g* O9 X6 G9 ?: _部署根链以及注册账户
7 d6 C5 {! W$ n( ~我们将用管理员用户来创建合约:
8 w9 A- b" f8 a" S) `+ W: {make root-chain, n. i; K$ s. h) U

; W- ~+ D) m3 q, B7 `$ q& H, x, F如果成功,合约地址将写入文件plasma_core / contract_addr.py:
$ Y) j+ J; R' K* u5 Pcat plasma_core/contract_addr.py
9 h  m; s6 L$ y+ \3 j2 X" N& }ADDR="0x2208595067499452580F54668104Ffb1b8755d79"
, M) W$ I  j% B6 U原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
( z) v# t7 B+ o) ]% X% Q4 w" F5 H( s
* B4 U/ T4 u9 p4 F1 c' ~3 k, C注册这两个用户:6 R- ^# }% G% Y. y
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35$ k1 H2 a/ ^7 k9 `
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e3 _- X, \. }- l2 r
; `7 y9 x) E" R+ ~0 h) f9 _; {1 y
运行子链与充值账户0 p" b' e/ P0 @
根链现在准备好了。让我们启动子链,一个Python服务器:; g6 O, y* W3 m8 Z9 n& ^3 ~
make child-chain
/ P2 l5 N; L3 \  e7 P- s& o/ U7 {9 F% u5 ^: E2 X
用户充值至Plasma链中:: t  ?9 V& I- c8 T# L
我们使用第一个用户(管理员)将100 QTUM存入根链:
; R' F: _  D( F4 l/ Oomg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE94 Y9 P4 I4 x2 q/ D
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
& {0 x, W" Y2 P% U7 F$ f
( s$ |. ^/ K# N. X当根链确认存款时,应该看到来自子链的以下日志输出:7 u7 N) f9 T6 j* V+ ?/ n4 B; d
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})
2 F4 p! h& d$ [) O2 {4 a; H& R. H/ K0 O! Q
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。+ P0 ^3 b! c5 i# h2 k0 U- {
: k( F+ g3 W4 a7 l/ |+ j
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。! V0 B1 H1 [: |9 |$ M# t- V. l2 C
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \8 m( V1 ]+ ~3 Q2 y! s7 m
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
: i& u3 j4 ]! N& W1 S2 R6 m' y0 x$ D0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \
2 z. _) T( N" c0x0 \ `# vout 1` \
- m% d& o; `. e7 x; J" j) [' L- O$ j4 b0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \
( ]* R0 W) |+ z& b+ B( L( M0 J0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \' a3 Q; e8 D( A) N  S" P6 |
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
& J3 t. N8 V/ L( j% x
6 O, X6 I/ R: O5 }- n交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:* g: d3 J3 k- B! R# I; v  b9 c+ X: l+ y
# submit a block with the admin's signing keyomg submitblock \
  b; d. v* r# @# ?6 t7 V00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35$ M: ~, F# O+ |$ z6 ]0 M. Q

8 m$ a6 z' {$ T& M7 M: n子链应该输出:
7 b6 H& {! Z4 iutxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
& R8 Z& ~6 d6 i* O! ?1 Q1 Y! p  \' N5 Q8 @2 Q$ A

1 }/ G. f* f) N链的撤销, L; r: V3 t7 f" H+ ~, p& J

# [  r$ s3 ?6 L0 |  @/ s4 h要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。! f# N( d8 @3 m6 k: @
前述的sendtx,区块1000上有两个VOUT。% {) v% b2 a% l2 B+ w+ k! C5 s# R
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
8 ?& e% B! y* Q  `9 u1 L8 womg withdraw \7 [5 S! E. t% M- M5 Y( y
1000 0 0 \
2 G( E1 W; W9 D0 C`# Use user1's key to create a confirmation sig` \# D1 P% g2 f1 e6 m, b
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
2 G) g7 T& U* i6 D3 E一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:
' [# |/ S$ ~7 y4 P; k. {$ B5 N" usleep 304 Q: H! B2 ^+ S5 `: M
在挑战期之后,调用finalize来解决链上的所有有效退出:% p1 i, X9 N7 D0 E2 ~
omg finalize_exits
6 u/ R- x8 Z7 R) Q; P我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
0 R' v# y. q, T) Y( t3 B9 l
7 R2 h' d7 I4 x2 p+ `8 nbash scripts/getbalance.sh  l" |* g3 m! d  B: V/ _/ R
"balance": 5000000000,
1 H! |2 q$ A0 @3 `9 n- k) t+ s4 Q' O, T' j% X
如果用户2也想退出,则过程类似:* M9 w2 o3 p8 Y+ m( {

% e  V5 v) z5 C' _+ x$ O1 Qomg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
- |7 s: H8 q: G. @- R: U请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10