Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma
! S, g9 ?! Y( W& ^Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。9 z% m! u- x; m3 m

" O( A) [! d3 V: }7 ?0 [; ?在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。4 e- D! i6 R$ ^  @- c+ `5 Z

. o( U% i, t# T3 Y% h- O3 nPlasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。0 O8 j/ x2 O3 p' H; _' y6 K
; I: N3 S8 Y9 N# h' ~' j
4 k) T0 _2 q) m  Z% j6 R

5 g" B2 S' y1 f3 y* l( i! j, N+ |4 s" q如何在Qtum上创建Plasma MVP
" O7 T! j" \! v; G: N# S+ a! }4 _: R! c) v( K0 f4 c
Qtum Plasma MVP 的实现基于以下技术:1 R. S  p: w6 h2 G9 W
Minimum Viable Plasma  i7 s* r) r- @4 {
Omisego Plasma MVP
, ]  x' \+ B  a) @; d
! W! z$ u( [) |, P% a1、首先检查你的Python版本:
5 @) B; n4 _. c请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
7 K/ `) `* H+ b$ {& ~& x7 ~$ ]4 q) _+ }& r( E: x
2、安装Python' F! b5 \5 h1 B  h' K
python setup.py install
3 \+ ?: T: }# F' [% F& v) S3、运行Qtum Plasma MVP' m3 a4 Q9 g. o1 Y& i
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
7 P% K. A+ P. I2 w" g/ Tdocker run --rm \0 v9 }% L* l. U6 t% i) |6 c9 }) K
--name qtumportal \
  R/ w* h# s4 x. w$ e- n-v`pwd`:/ dapp \
& R8 K3 f% x6 k9 j% r; E7 H-p 3889:3889 \
! T# h3 \3 b; c( }-p 8545:23889 \
5 Z' Y* @$ e6 l4 k, w5 W4 d: G6 `dcb9 / qtumportal
% ^6 B! J, [6 R$ B其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。
9 d8 p; i1 y& e* s, H0 d% K
) k5 L; V0 s7 _" A8 b3 d) I. r4、接下来,设置别名以访问qtum-cli工具:5 s* a1 m! F/ D+ v# r: H! K  R
alias qcli='docker exec -it qtumportal qcli'
/ c& {9 m7 i" `/ J0 M7 c
# I6 }, l7 U7 R1 k  ~( v5、生成600个区块作为测试的初始余额:
% R+ c; @: Y4 a8 _: a- Lqcli generate 600
  w: K6 L. `: \# H+ f
+ ?2 D) j( k3 [6 O% s( i6、设置 Qtum Plasma需要遵循以下步骤:/ x- U4 E; c! U4 I& T/ C3 G
创建两个Plasma用户  D% a% ~  @  h2 z5 I# l
在QTUM上部署根合约
6 P' f8 f6 J0 u/ ?1 g, [注册Plasma用户
" F1 Z) h- ]. e  m运行子链3 B2 T, V+ [3 T

$ J0 W0 z. e% [- Y' \6 @* [7、创建用户
! I0 C2 g( e5 N3 ^% Q& c3 |你需要准备的事:导入私钥和账户充值: i! r" f5 r+ }# F. O! y$ `
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。
4 m% T- z4 T! {# G& {# Private Key5 i1 a" z7 C7 R4 I: S8 d
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35% R) D3 e1 J9 D3 b2 Q1 A' i
# QTUM Address Hex
3 w' v# S1 ^- }+ x0x7926223070547D2D15b2eF5e7383E541c338FfE9! s! f8 N- b1 u* ^
# QTUM Address Base58: O' u( d/ A% b
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW+ T0 B$ n' r, z3 b  D0 H
# ETH Address6 `4 p5 O. H) T7 x, t
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47
, o# V" u; A4 j; b7 X) M1 A/ k- V7 o
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。
( D: d! k: }  k' z- g$ _3 m, X7 g! ?1 Z  _- j, E/ Q% |. O$ J) T/ Z+ U
第二个用户的私钥(没有管理员权限的普通用户):
- u5 }- h( J" A' @" s* j8 z# Private Key+ T3 f( t- C- N5 `( j
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
' u( Q, p' V# T1 d6 G9 J- Q# QTUM Address Hex
0 s2 o# I$ G) z8 d0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D
& K* M% s. t4 V7 p# QTUM Address Base588 g  X2 B  l) c6 w# k- J! \6 j6 y
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
3 Q( J, A& S# D! T4 S$ e# ETH Address
8 S" ^9 f% @$ B/ l+ x) k* x% Y. a0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF
: e# q& x' r# B导入这些密钥,并为每个帐户充值500 QTUM:. Y3 U% A$ N% u8 o5 ?4 n
# Admin Userqcli importprivkey \) @4 |( M$ S7 U" G* @* K# n2 y
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk
' A- k( Y- g( L  T% P$ Y2 Y) u/ edocker exec -it qtumportal \
9 s( K  d$ @' w% }solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \1 {* v# \  z0 v! C! E' c
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
- I3 B1 h8 @( y" T& T+ d6 U4 udocker exec -it qtumportal \
- l( h8 J3 F% c* w' t& nsolar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000
+ T) B7 C/ b6 E$ [  a
5 a. x: |# x/ P0 |6 ]部署根链以及注册账户* X3 I3 R2 t  G6 @' F" c+ W! ~
我们将用管理员用户来创建合约:
5 _- q1 V. R8 A8 O# d; gmake root-chain
, W7 C- C4 O- n6 a8 K& j% G3 i
0 _+ W# ^$ q# v( w! X2 C, ^# H如果成功,合约地址将写入文件plasma_core / contract_addr.py:- A; a& K9 ?" G) y. [6 M, P9 E3 W
cat plasma_core/contract_addr.py
3 \8 @( G1 {% IADDR="0x2208595067499452580F54668104Ffb1b8755d79"5 n# }4 r7 n' W$ U, j  \; u
原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
2 S5 V4 `/ _% J' N: _6 e, j# t/ I0 Q+ ?9 k" K
注册这两个用户:& ]3 X6 |+ i" F  \! T
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
  [2 o, O: e9 }3 \  Q. domg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
% B3 i8 ]" C" L9 ^+ a- `; k/ [5 k3 \' f; W  H
运行子链与充值账户
* @; ?# V+ u: j- U; O- Z: u1 c根链现在准备好了。让我们启动子链,一个Python服务器:
' g* ]. H0 F5 C8 Mmake child-chain
, _  n. N" z5 B& A- s7 j. I' n, N0 K# N2 Y" p" E  L
用户充值至Plasma链中:  ]1 P  J- z' R0 T
我们使用第一个用户(管理员)将100 QTUM存入根链:
2 ~* Z1 |. D% ~. c( C! Homg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE93 X' k0 {( n# d' I7 d% i5 Z
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9* b7 j! t& f/ ^

  Z( H; q# H+ l( V4 ^当根链确认存款时,应该看到来自子链的以下日志输出:' @% r) u7 N5 M
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})# Y: @( H3 y( ]/ [
9 d3 i& v9 ]; _6 `. Y- Z6 i
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
3 y2 ^/ Z) _# z3 G9 c* b
6 T6 ?3 r# }- z: H; K! ]* T2 `omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。$ d; A- j  B% p- M: |
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \. _) T  r4 ~, h( f' G0 P' K' s
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \. [% W( n  `/ P. `  h
0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \
9 F. i9 d$ R! B" d0x0 \ `# vout 1` \8 ^& `% g1 p/ c. m. f8 n' d3 q
0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \! O+ B: F5 n0 M
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
: a) z! |, }8 q9 t' \# m) I- |00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35+ d8 U6 q6 A/ r; ~# N- y' G6 e

5 G0 z* f+ U2 e交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:4 |+ R$ Z& c6 |6 T3 G: Z
# submit a block with the admin's signing keyomg submitblock \5 L* g' p9 T1 i" k3 f& O
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
* O1 f% N, q/ A9 l- k4 z
, }3 u. j& b: ^& L4 O# o子链应该输出:6 a; f7 T7 X* t! @$ g3 X
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
- l6 i' o* J1 N+ O/ a; f- e9 t
9 J* y' U1 D5 F; \& R* f: N  H
% z: a& A/ W6 v链的撤销$ v( m3 s. L+ I4 ]9 p2 ]3 T6 @

2 y5 j: u. a* p! u' C要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。3 \! M9 H8 C" ]) z/ j) s( V8 a' w
前述的sendtx,区块1000上有两个VOUT。
/ b& V7 S+ y" c4 Z我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
9 w! }6 c. a  Romg withdraw \
, m" w$ _/ r' I4 o& S1 A0 a1 V) `$ n1000 0 0 \
) X  @& H0 u# b" b: {7 G+ o`# Use user1's key to create a confirmation sig` \2 {& ^7 s2 P, P( Q
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
- ?7 _# O% A7 d; D( _一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:( Q0 z" P; X/ n% n: f7 Z
sleep 304 E3 ~7 ?8 \, [5 ]1 p
在挑战期之后,调用finalize来解决链上的所有有效退出:
& ~8 v; X' X$ domg finalize_exits
  x$ L7 H8 U& l& C6 X! c' R% C, H% @7 j我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
. r# Z8 w- \$ W" L' m; b3 B2 ?$ m$ C0 p( y* ~8 b* h6 E# V2 a& q5 X
bash scripts/getbalance.sh' K- H! y8 p, L8 Z+ m4 v
"balance": 5000000000,
% A2 M2 f- m3 t  m! ^8 r% R
1 p1 s: t. q' K4 J8 [; M. M$ v- t如果用户2也想退出,则过程类似:7 e  x( }/ E8 P3 u

3 P: [  Y+ K0 s- V" homg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
8 A  K( m" H; z$ ?  M请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10