Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma' O+ u3 b  s+ I( Y. I
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。" V& y" u2 v5 C3 j* n

/ `7 n) f  E: z" g. T3 G在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
8 {. m7 p% ]8 s  S" i3 C: X
0 ^3 u& G% K  y' E7 s! V* nPlasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。
$ Y4 x* m* I/ G6 \8 j. W$ \4 d. h% E+ @6 u

9 R) E* @5 L. B: G4 I
; f) _& ?0 u6 a4 w8 H如何在Qtum上创建Plasma MVP, S( c1 H2 F( a% V

8 Q% `" ^, s( J, KQtum Plasma MVP 的实现基于以下技术:
+ n% @# n2 a6 o7 @3 o; F' |* o- ZMinimum Viable Plasma
2 D1 U* E, A1 Z9 _* z) j. Z- }* L4 ROmisego Plasma MVP
# X) D* T% M  G; B0 F  Z2 w# u$ Y# u! z' Y9 g* K
1、首先检查你的Python版本:$ J" m0 n/ `& _0 u* B/ E8 B
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
: I- r- D5 _2 C* E( \2 D  D/ W; R  A3 x3 T, L# B( ?5 w
2、安装Python; `7 Q; n) Q" h
python setup.py install* m* z' k4 a$ p7 r0 i
3、运行Qtum Plasma MVP5 |: F% C5 K% w
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。+ i9 O$ C" p) X4 S& E# b+ v
docker run --rm \+ }% O, }* V+ s9 J; u4 l2 D- v
--name qtumportal \0 Z& J, A9 @  L9 _. o' s( U2 E. }9 A
-v`pwd`:/ dapp \2 L$ I& f& F% ~! F  J' m/ v# X
-p 3889:3889 \) F4 b, h/ I8 K4 C
-p 8545:23889 \
" I0 W9 V  }9 f2 N( K) `7 L: O6 Pdcb9 / qtumportal
' @* o6 G# L6 T其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。
; T8 u5 j5 y1 w; s  v; L, h- v: [# C( g3 m- G! o
4、接下来,设置别名以访问qtum-cli工具:  a( i2 M8 j8 ]$ W7 S  {) |
alias qcli='docker exec -it qtumportal qcli'
6 N1 e- \# B! r" j- D+ ~( [' d& x) M
5、生成600个区块作为测试的初始余额:# g3 S8 l( u# T0 L* E; h. u$ ~
qcli generate 600
, v5 w; b% B8 y( e. I3 I! o2 g/ S3 L, X" ~
6、设置 Qtum Plasma需要遵循以下步骤:
6 U. o  C0 P; T, e% X创建两个Plasma用户
% X( |- w$ _$ x: L在QTUM上部署根合约' K& T& {" R& y6 X0 t8 e: P: U2 O
注册Plasma用户
' V& a/ V- Y. h$ ]: g+ C运行子链/ T6 e1 n: E3 q6 u0 b6 B7 q" L

0 U/ I8 V8 h0 v4 n7、创建用户
& S; O0 O& w6 q' b你需要准备的事:导入私钥和账户充值
" ~& ]* X. T9 t- _! p其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。0 O5 r7 n: ~3 f, q
# Private Key2 I; a+ D" r- u+ q
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
. `) ?/ O! D8 H( b6 e# QTUM Address Hex7 j$ I* B1 n; D* \" f- x$ ~
0x7926223070547D2D15b2eF5e7383E541c338FfE97 g# ?$ f& l% R# R, S
# QTUM Address Base58
# \$ ?5 @, G/ i4 q3 W" F5 H. O0 NqUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
' O" g- Q$ `  a- B. j, J% N- ]1 q3 H# ETH Address
% I# T  ~4 w" K& U( |$ w: B0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47! K  Z0 F! i0 X; Q+ g
6 J( Y5 B# Q  }8 I
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。2 b1 ^9 I/ a7 }4 J1 T

5 P: \1 ^4 k) X+ J9 `* q第二个用户的私钥(没有管理员权限的普通用户):
) w# U6 F( @0 @8 A7 [" e  H# Private Key
1 O9 U" {# G8 z& U8 X5 j- r7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
; M" \+ D3 o$ e3 X1 I4 C# QTUM Address Hex2 U! p' v) S4 C1 G: ]
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D9 D& `, q) ~9 {9 f
# QTUM Address Base58; {2 _# n& }0 C2 v
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf7 ^* }2 u/ L" I- Z  l/ Q
# ETH Address: R  f1 W. L5 f7 q! C
0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF, U$ C# i" y8 n* l" @0 U" \
导入这些密钥,并为每个帐户充值500 QTUM:
, H" \; {) h  `# Admin Userqcli importprivkey \
* t! l- E8 q1 @; R. {/ OcMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk3 A  y/ {; L' I
docker exec -it qtumportal \
9 B- W6 r, k6 R. y0 }. E2 u7 _solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \0 T8 W; [6 D' Q
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ  I4 k$ c7 ]" Y4 l) a: {' A5 N
docker exec -it qtumportal \$ G. j9 o, W& X# O5 M( E1 e0 z
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000
. H( @( W  {0 v8 e0 D8 u& B" |
% Z$ o, H% ]; X. Z5 m8 Z9 ]5 n' f部署根链以及注册账户& q; {2 ^( |9 B" c0 C1 w* ^
我们将用管理员用户来创建合约:
. d  F" U/ j( q; S7 [) ]make root-chain, w9 `% {/ D- ^& X2 N
: o& g* E, Y  X6 d- }6 `
如果成功,合约地址将写入文件plasma_core / contract_addr.py:  j' X; I2 u% |. k0 m+ H! |
cat plasma_core/contract_addr.py
0 @/ v2 L, S5 JADDR="0x2208595067499452580F54668104Ffb1b8755d79"
7 K( R8 I$ s3 C  c$ C# z0 r原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
8 R( I8 I; n0 Q
/ M3 D" u; s+ b6 x2 v) v注册这两个用户:
% m+ O( e/ x4 L& ~. momg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
" K& K9 S: T4 @) w3 s2 n0 d9 comg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
- n2 n8 e1 [% G2 p; D7 Q) V8 t& ?4 t$ }$ G  M: _/ I* W. g0 Z
运行子链与充值账户
4 O4 C! c8 g* z6 J9 h根链现在准备好了。让我们启动子链,一个Python服务器:! ~2 k' Z$ F+ |5 @" r3 ]4 M
make child-chain
5 d1 E  A( E- e& a7 p% Z. X  ]! d2 g, e/ a9 _
用户充值至Plasma链中:2 b. d% W* @2 l# s3 y
我们使用第一个用户(管理员)将100 QTUM存入根链:, m; b, {* v8 N7 u
omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9
8 x! l/ `" h! J$ o) y1 |! ^/ oDeposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE93 r' k# X( Z. K& O
3 L2 S  k% u$ W6 K7 _. @& V
当根链确认存款时,应该看到来自子链的以下日志输出:
/ A+ \+ [/ n$ Tapply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})" b/ d9 ?  v5 ^$ O

$ y9 J$ G* K- {4 j$ w这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。5 U  y/ d" M  }' ?' G

6 A$ T- Z% s( W( R5 e2 ?* bomg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
& ?; T& {7 Y. j0 [5 z; n8 j) Q$ `omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \  S7 ]9 F8 U- q* v# f/ v
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \9 |5 X3 ^9 L0 P& ~4 {% T8 i
0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \
3 R, u* F+ s1 K; l4 i) R7 O; e* u7 u0x0 \ `# vout 1` \
$ N! V) _* e& @6 r0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \3 H: F$ W0 v3 X
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
0 m: V9 N/ R" S. _& R  @5 |00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
0 r* x* H7 ~7 H4 C+ C) S" ]7 F7 l8 c7 d% H4 M
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:+ W8 A* h( t4 R
# submit a block with the admin's signing keyomg submitblock \* r- V6 e5 R# ^) B
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35' f9 k3 Z+ F4 c# S! b4 J, j
6 T$ Y3 D2 a! T6 z( M. s+ F
子链应该输出:
8 x  @5 D" ]3 X1 c) k! [+ sutxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
; l5 J& h* D' k  P, O2 W3 v" L/ Z9 D5 {" }0 C) ?; ^
& ^$ ~" X$ z* I8 L# N3 K
链的撤销
% G& h/ T/ S( [6 R! o
. a0 O* M, n& C1 d5 z要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。  N! t+ l$ M' e: z; e
前述的sendtx,区块1000上有两个VOUT。+ M9 f  \% D5 }) ^! e
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:& x: ]2 Y* j  K6 B: e0 Z
omg withdraw \  i& {, {' a2 \+ J' D& u$ I
1000 0 0 \
% j2 r5 `+ @$ `- \1 n+ y`# Use user1's key to create a confirmation sig` \
9 ?6 n+ {/ U8 k00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35- \6 Y' }, u1 j" }, i$ e! y0 Y
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:
9 A; u& I% t1 L$ t* Hsleep 30
. x' E; a" @: \1 L0 e" l; W: D- B, ^在挑战期之后,调用finalize来解决链上的所有有效退出:) w* W' L1 d' G: F# F0 Z2 M* d
omg finalize_exits( p6 g/ @% a% C
我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
3 ~3 {/ l; I+ m- J( q
8 u* D" w1 _( ]# ebash scripts/getbalance.sh  U# p" ~6 @: ~0 j1 R
"balance": 5000000000,& r( n5 v3 |: p0 Z
6 [6 i6 B4 p# x; K5 X
如果用户2也想退出,则过程类似:, J, q8 o: P4 m( s# ~' _7 v  E

# Y% N. {; M3 `  p9 d2 ^$ Vomg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
  [; L& E. l2 ^请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10