Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma) e4 m% [- r7 C, Q0 z6 v  F
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。/ y2 d% x+ K% E) y! X6 Z
6 h% ?0 Y" G8 T+ r  P
在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。3 |9 M" n. U! G* a7 J6 r1 z0 S* [

" E& Z/ T# J  U- }Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。  l$ r" S3 E' Z" C
* T1 f: i9 ?$ C

) \% U( `3 e+ C1 D0 T$ r4 G8 @" h! H1 H) J% N0 w
如何在Qtum上创建Plasma MVP
# t. Q& ^& H" A) W) X# ~7 o2 t* o
5 H8 `- i) V5 QQtum Plasma MVP 的实现基于以下技术:
, ?9 h: n/ N, V0 [- r0 ?# dMinimum Viable Plasma
6 g, v) N0 k3 j  w9 X% mOmisego Plasma MVP. B1 b8 Z) m, O3 [! j7 _3 i
# u- V, {7 Y$ a5 l7 S9 _2 ~
1、首先检查你的Python版本:2 Y1 }2 z+ w" i2 }1 a$ p7 z+ J
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
, w- W  a7 }. M1 Y
% D+ {% o" u- ]9 ]9 _* v% ~- U2、安装Python
( B1 D3 M5 v- |, ^python setup.py install
% v/ r# p+ z+ x3 \3、运行Qtum Plasma MVP$ K' h* p& B5 {6 A2 @0 r
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。$ p5 _/ o1 `) S
docker run --rm \1 O7 y" q- y+ k. j4 h  h
--name qtumportal \6 e" K/ u* P6 q7 U6 R
-v`pwd`:/ dapp \
/ e! w- N6 D0 G) O: u9 Z-p 3889:3889 \
; ]6 e# X2 T# v! ?7 n" B  N" _-p 8545:23889 \; X+ L: }/ A* A9 b% o- D
dcb9 / qtumportal8 }4 q( z1 ~% {# D' `0 i
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。8 C- j5 p. v( S: d3 O- {, X$ X

$ g, s+ ]# m8 f) M% }4、接下来,设置别名以访问qtum-cli工具:
. c$ G+ I8 k# X* C# K3 n( ralias qcli='docker exec -it qtumportal qcli'' O. D) I: {& S+ u1 M

7 V+ i! u- O# q( M% s5、生成600个区块作为测试的初始余额:
' K& D( C* f- [) m; kqcli generate 6009 L$ I9 w+ J; v1 J

2 G3 j) @/ `3 s7 V( N6、设置 Qtum Plasma需要遵循以下步骤:
# k$ M* f# w' h' t创建两个Plasma用户
0 \1 N  Q# j( D6 M- L3 |! Z在QTUM上部署根合约
6 I: U4 d2 {0 ?9 r注册Plasma用户: l! x* _* N3 V
运行子链
) x) Y3 T/ ?0 w; x2 z$ n0 I, Y% m- N8 j  O
7、创建用户
& j4 @, m0 M9 ], r2 O% O* K你需要准备的事:导入私钥和账户充值
1 h4 R- {/ F$ Q' R7 `其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。
% o) D8 j" M! D* n1 F# Private Key) |; K$ c( Q8 Y; W1 |6 d0 f
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35- k9 f3 C1 P/ m6 G/ t
# QTUM Address Hex
2 {, [0 V  w" }$ z0x7926223070547D2D15b2eF5e7383E541c338FfE9
4 v; R: @- X3 \, c3 ?) ~# QTUM Address Base58; [) j: W. {9 O/ ?
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW8 ~- L5 k7 K7 h* m6 [
# ETH Address
6 }& H5 i3 U' _# e" {" k0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47& w9 ?9 F  A0 U' @! {
5 q% j) h+ Y" |  @
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。# v5 `1 z: o/ C1 F: y4 b
9 N% z1 m- \7 w) C, X: A3 ^2 e  B' m$ g
第二个用户的私钥(没有管理员权限的普通用户):
& |, c% s$ j2 Z8 B7 k# Private Key
. |# B: o! B, U% c, e+ W; Z* a7 u9 z7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e/ `) o. x4 `) M- O
# QTUM Address Hex/ ]; e8 B# F/ |1 o* }. V' Q
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D, x6 z* {8 C; X5 K5 q9 ?
# QTUM Address Base58( N; y" g: D1 E( M+ p% a
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
- y( R) B, k2 w' k1 f2 @+ {# M# ETH Address
7 U, z, Z0 h$ y0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF
. p: O+ J- ~- q- \2 |5 ?3 f3 A) J导入这些密钥,并为每个帐户充值500 QTUM:5 B  u& p) Y* Z1 e6 \# ?
# Admin Userqcli importprivkey \" s. M5 b; G4 w
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk0 n0 b1 u! w. z" z
docker exec -it qtumportal \
! i8 b$ M1 M) F% I2 u  \5 D, Fsolar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
7 _- a  Z) h& fcRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ5 E' T9 K: x, Z8 C# E/ u
docker exec -it qtumportal \
# F% L& g- h+ `& x) u1 `, `solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000
. n2 S- _0 S8 o- _. Z
3 X( O: K4 o  Z0 X$ _部署根链以及注册账户. c+ ~, l) y4 Y, ]& y* P
我们将用管理员用户来创建合约:6 f1 r) M0 z+ g1 a' c+ I
make root-chain5 n- \! p, Z8 w1 Y5 z
- o0 Q2 h; W+ s
如果成功,合约地址将写入文件plasma_core / contract_addr.py:4 l# _+ t: u1 ~4 E  o" ^
cat plasma_core/contract_addr.py
+ c6 w6 H0 i6 J; Y8 ZADDR="0x2208595067499452580F54668104Ffb1b8755d79"
7 }( w) B( @* l$ d. ?1 J原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
# |4 D, j1 E! [$ `- `* B4 V: u! ~$ L; C1 A& c, X; T- g$ n/ a) z% U2 Z
注册这两个用户:! B& c* \% q0 ?  i
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35% ?: k, |; s) D
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
- Y! E: A  T; l( p3 n" p% |+ c; j5 U1 H
运行子链与充值账户
" E( `0 Y2 L- f# K: D+ Q9 j根链现在准备好了。让我们启动子链,一个Python服务器:
+ I  T) ^" `6 W/ H, I. gmake child-chain
* k: o7 Z. E+ I. e& _3 e1 c, \. r# ^
用户充值至Plasma链中:
! [+ b* x8 t" U* m- b我们使用第一个用户(管理员)将100 QTUM存入根链:
% ]7 O& x3 \" y: Tomg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9! j' A1 ^" X4 a: u
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
2 O6 ^1 W6 Y' z( {( F" X: a8 F$ o! g- D% |- f1 L
当根链确认存款时,应该看到来自子链的以下日志输出:
, ?. w7 a) p* e5 j6 E7 g& l" Q' japply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})6 ?7 R! Y3 v" u  y9 O, o7 V. M

8 B, L$ m+ H  K9 M/ W这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。0 Q5 @2 h( v# y! ?& u, a, \
( [$ O0 L3 ?( n8 k) a
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。6 ^7 j# J" T0 M
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \" ~+ H, k2 n$ [5 |0 q: t/ `
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
3 B/ A9 F& D) G8 m* T2 M- g0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \8 t$ h0 |) J# |& V. H3 r" d, G
0x0 \ `# vout 1` \
4 G* D( |8 Q# Y5 x+ h& B0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \! b9 o- M2 L6 W. `. t/ e
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \
) O0 b2 y0 {$ m0 ]8 i00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
) z0 n6 x; p5 ^" g
6 x! v0 h. M% f" K9 G' k交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:9 Z1 W# g) ]4 n' k
# submit a block with the admin's signing keyomg submitblock \
/ x) E% p& @5 S4 t* M00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f355 p- Y" T$ L. \
+ n1 S  y0 Y; f* Z' ^6 }- w
子链应该输出:5 v/ r7 v' z! }  q4 I8 d' K- d; f
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
0 S" D; g* N5 }( l6 M6 q: I1 A3 |) v/ [" l

6 ?# [4 x: `. L, A链的撤销5 N/ R- b5 Z" r' g' _
3 k/ X8 N2 h" }6 ~7 a& B6 o! R+ _
要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
1 b4 h7 U, S! F4 A5 k前述的sendtx,区块1000上有两个VOUT。
: t. ~0 z; q- c5 H7 n我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
! p5 u7 A, ?% Qomg withdraw \' {; b7 f9 i" N# ^
1000 0 0 \/ [- ~2 M$ @5 x7 \! J0 v! Q$ ~& ?
`# Use user1's key to create a confirmation sig` \
  a3 u- X5 h: E0 F00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
' c  S" [; X& @7 @7 z4 D' F' U一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:  G7 \# M( W  i! i5 m. f' t
sleep 30$ j$ O0 f, W9 a
在挑战期之后,调用finalize来解决链上的所有有效退出:( [& I7 H; E: }+ K" ^0 e6 p0 w
omg finalize_exits
, T+ J/ I" V- d2 u1 c' v我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
# V  e2 v5 I* [; u' Z5 e" R1 b
8 W6 u3 P9 r  ?bash scripts/getbalance.sh* ?3 E7 F8 t" `* R
"balance": 5000000000,) t- ~# R) `  F0 U

, D1 n1 J, a$ O2 I( X% d6 _5 {* W如果用户2也想退出,则过程类似:
7 B2 }" {. \% d0 l6 w% A$ w- @3 W, j9 p5 p1 T* l& H
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
$ `! R9 S+ p5 {5 t, `请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10