Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma
' F9 s6 D; G, A) R0 ^9 g& F# rPlasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。. _! t; ^. y: B. v

" Q4 N6 l$ n/ d/ k3 Q* M在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
$ \, w' Y% L. T: _2 B" X9 y$ l; n9 @3 q3 j7 |+ k
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。
( V4 k+ N4 v( @2 H6 b* u
$ r1 {% Z( K8 d5 G- S5 N% [
$ y  @+ Y& w* x% P. \2 ^( U2 U/ ]7 Y6 s/ |
如何在Qtum上创建Plasma MVP; u. Z" w* ^# i4 \
; z( p. ?  l( s) [7 D' f
Qtum Plasma MVP 的实现基于以下技术:
/ s2 r- x, d$ p6 b8 R: `* L% a2 O# TMinimum Viable Plasma
5 [8 M" T% \1 wOmisego Plasma MVP
( d' t8 k- Z7 I7 s6 P1 t( j4 ?% @: @7 o" x5 O6 z  B6 [: f
1、首先检查你的Python版本:" V5 ^% {! e4 e9 V9 z4 k
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
7 y$ l& O  S  E7 |  s
* u1 {* |+ O5 R2 e/ a5 q2、安装Python/ F9 G+ Q0 L3 m/ v0 T
python setup.py install+ X& ^5 M+ z1 E6 I! E4 K& C
3、运行Qtum Plasma MVP
3 h( m2 t+ w' j9 Z准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。. ~4 J0 c; C6 y4 N
docker run --rm \
* ]# _3 O6 b6 u2 |( \. s$ y" s+ J--name qtumportal \
& j* ?! B& H! W  b+ N-v`pwd`:/ dapp \
7 ]. Q! V/ O  M; c+ ~-p 3889:3889 \
9 p  Y4 b' ^+ c3 h7 }0 S/ U) R-p 8545:23889 \
& {5 ^$ H( n1 h% cdcb9 / qtumportal& B* t& [7 ]* l0 s* @4 k
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。  V7 y; E! A/ z) C! `  g4 Q
- W2 w. K2 N& |0 @
4、接下来,设置别名以访问qtum-cli工具:
5 r9 r* U) A' \1 i8 [) galias qcli='docker exec -it qtumportal qcli': Z0 c0 q( D, l' {: i% P0 ?
& y$ t/ N/ ^/ m( F
5、生成600个区块作为测试的初始余额:
4 J( ^+ v7 n3 u" S" Aqcli generate 600
( k1 S$ i8 X  }/ _# a; h/ X! A4 N; o* Y" c0 g$ ~
6、设置 Qtum Plasma需要遵循以下步骤:
+ s9 V) L  w& o6 o创建两个Plasma用户
+ @2 ^# i+ Y$ i& j* \在QTUM上部署根合约. C6 x- Q: y8 C- j
注册Plasma用户
% a7 _0 r) t+ y6 y! J5 x4 d运行子链
- f9 a2 ]3 U" o, Z
, i+ d7 S, N. F% h7、创建用户
7 ?9 e2 C; [/ L1 m  W2 B  }% Z0 G" L你需要准备的事:导入私钥和账户充值1 @7 }# S- ?3 w0 _! \+ w) y& y
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。
6 d4 x9 n  B; K) e# Private Key' \$ e0 T( O/ ]5 t9 j
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35; b/ r% H# q+ n9 g9 G5 d
# QTUM Address Hex3 }$ Y5 z5 s/ l; X: ^. M5 ~
0x7926223070547D2D15b2eF5e7383E541c338FfE9
4 w; I- c6 ]" }" T7 j# QTUM Address Base58! Z2 d$ u4 ?9 K' U/ J5 m
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
4 D: G$ q) y* F) A# ETH Address
  b' p" [: {6 M0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47
' u& W  ^% C6 ]+ v5 Q6 x1 e3 S. x2 ]0 u0 m4 |: r; u
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。) F) f/ V4 t3 W, H" [5 |

0 l  |, [- a. j第二个用户的私钥(没有管理员权限的普通用户):. N5 H  ]3 e3 h- [$ j" u  u
# Private Key7 m5 _& \  g3 P. k& L( @" p- f
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
  V! d' J# ~$ ^2 s# QTUM Address Hex
) @! u  r5 \* N% a$ n3 o0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D
8 D2 g8 Z# s1 F/ ~- T3 n% s# QTUM Address Base58
4 z/ y+ h6 f/ MqLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf$ F# m# F  p* g" o
# ETH Address
3 [- t, K7 W( h) E) y, q0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF; a+ H/ [/ S) d; t$ R! k
导入这些密钥,并为每个帐户充值500 QTUM:4 N  ?8 U+ ~, R- y" @6 M# J
# Admin Userqcli importprivkey \
. n' B, e8 z# I4 M4 QcMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk: D; R* p( p- F' l7 {$ x! k
docker exec -it qtumportal \' x: }8 U0 U" _+ J" C0 b
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \8 u4 t% z4 J% G4 |0 J
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ! H) n, K8 [6 k: i. R
docker exec -it qtumportal \0 O4 ^; i8 {. Q" H8 Q( C
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000
5 j3 t+ F9 e' k1 F# n. T# n  a! L# b  l+ C- J+ E: F1 B# h% f
部署根链以及注册账户: `. ?; v- ^  h7 i3 U
我们将用管理员用户来创建合约:
+ n& s! Y" ~* ^! h/ w* t( ^: D2 t' i  ~make root-chain9 K; F  e% w- w5 t) R, D8 H/ I

5 `; H- O2 K' ?! W9 X! a2 p如果成功,合约地址将写入文件plasma_core / contract_addr.py:
; w: Y3 x( D) U* N6 t9 tcat plasma_core/contract_addr.py
# U: \1 h# O$ Y4 KADDR="0x2208595067499452580F54668104Ffb1b8755d79"( v/ Y$ a; ?1 W4 z! c
原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。5 M1 W4 O! s7 N" }

) T4 ~( s2 b. g1 M5 W2 j! q注册这两个用户:) R0 Y- j$ [) P7 G; O# v
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f354 w$ d/ }2 ~! ~( a  A
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e& g5 @, z# {5 W( i, Q( {- N0 k: ?

" V. G; d, ]4 _* @4 S7 ]( T% R运行子链与充值账户8 z7 ^" g) B1 E7 A$ @0 S
根链现在准备好了。让我们启动子链,一个Python服务器:
  h% l+ i5 E7 a* d% G, H9 t0 bmake child-chain/ A  b# y. J! J. Q) d* ^* ?

, g# U8 {& d7 i0 H0 i. ]用户充值至Plasma链中:
# I/ a$ @; N( ?3 {我们使用第一个用户(管理员)将100 QTUM存入根链:
# M- {1 R7 P4 v% M' Somg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9
. S. }7 G+ I3 L0 H; f( cDeposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
5 A( X  m0 |2 b+ j: `& o5 Y; z9 O" ]3 c" a9 r, t/ \
当根链确认存款时,应该看到来自子链的以下日志输出:
, y, E5 w, S$ Bapply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})
) ]; D0 V3 I* p$ z3 F6 m, j+ b, P8 L+ ?* F! J% l$ y7 h/ Q( b/ T
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
7 O$ ?. O) ?2 H% R1 V6 Y  W1 p
, t& }+ c# Q/ b2 J4 Aomg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
) b, r- A5 W6 u$ \! ~- E0 g% J' m0 Uomg sendtx \ `# vin 1 (blknum, txindex, oindex)` \* J( M0 A2 ?1 _0 C1 b/ k. @
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \7 C$ J. _# `( i
0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \" P2 T! S; A* E0 J) I
0x0 \ `# vout 1` \) B: h( x9 R- r# ]. I
0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \* p- G' h$ d8 f6 q6 h/ @1 |3 }
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
1 S% K* Q* P: X, Z, ?00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
" C3 e) Y, q# N) u( _! M( ~. \7 K- I: U
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:
& b; }$ U* K8 h  U, Z/ l# I/ b# submit a block with the admin's signing keyomg submitblock \
8 Q; n# f/ q4 R00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f358 Q9 @1 K, m. n: q. C2 K

+ c/ `6 P" W+ _* N子链应该输出:# [; i5 e2 _6 u: g1 l! [
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
) @( |. w: m* T/ U: [3 ~) I& e& V) Y) c3 m/ _0 \# L8 P
+ {' \! ^' u, t" k7 E: G( k
链的撤销0 m) k8 [/ W* A1 c' ?. f

* A' W+ O/ g. l$ d" b" I要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
5 U4 O; ?) G& `, k# h4 o前述的sendtx,区块1000上有两个VOUT。
9 b( Y+ R: S! m7 f我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
  l' s) n" L9 I$ l* R  R4 k% zomg withdraw \
/ l& B+ i' y5 w1000 0 0 \
7 W! y: n& a+ ~4 i1 O. q`# Use user1's key to create a confirmation sig` \
( @4 ]* g4 s7 H) Z; t# g) Y4 Z0 e00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
2 Y0 i6 T/ m: l2 ]8 r, N一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:4 \" Q4 ~7 r. y* u# W1 }9 a
sleep 30
6 S, H2 S: f0 B  E. I3 r在挑战期之后,调用finalize来解决链上的所有有效退出:4 g% Q" M# A" T6 @
omg finalize_exits
5 K& h4 |4 e8 q0 S我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:/ C6 n7 r9 S, n, ~5 l) S
' a0 n% G/ \; R) Y
bash scripts/getbalance.sh
8 f8 q) p1 D( T- @"balance": 5000000000,+ N( |. i6 V& G& B' W' J# p

2 _: G6 f. g5 p如果用户2也想退出,则过程类似:4 u8 F/ M" ~2 ^+ [" ~  S4 e
9 X8 T  `" M! W9 S
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
5 [) @, N: f; d5 p请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10