Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Minimal Viable Plasma
2 ]3 N, \4 u9 j& |Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
. r3 l3 e# Z2 v6 g$ o& x8 r; @4 ^( Q# q7 R
在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
/ j# e2 p4 Z- O, e' R1 k7 Q8 d: i$ ?3 ^( f/ X+ |! Z
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。) p( B( `% W4 |( E4 ^  }
$ q: x$ o5 U6 s* X

! B2 u" @! B) I4 }- H
/ S4 D3 q' g. i& p$ x如何在Qtum上创建Plasma MVP
3 v. ]: v- H" v7 }. V
# g/ t! a& E+ T# r) _Qtum Plasma MVP 的实现基于以下技术:! ]6 }8 X/ U/ i/ h; u
Minimum Viable Plasma
" |, V; a2 ^( I7 XOmisego Plasma MVP0 f: b/ g9 `7 s1 ?3 w

; n/ z( H2 |7 [8 S% B1、首先检查你的Python版本:
: W* l  z1 u( W0 }请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。  c6 ?, g/ y( V3 n- w- Z% r# W
" V6 Z* N, T5 m7 _
2、安装Python
3 W! G% P9 d) x, y9 @6 rpython setup.py install5 a/ e( ?  m1 X  S7 e
3、运行Qtum Plasma MVP
' u0 z1 y7 u2 ~- o准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。% A; j' R, u  V1 |. V7 ^- e
docker run --rm \
/ o3 f1 X0 s- `5 c' X8 p9 F--name qtumportal \
5 Z9 o- ?2 a9 E6 h& A-v`pwd`:/ dapp \
! ]7 h- ?3 H1 J) J1 Y6 s-p 3889:3889 \! Z! R- r0 M! Y
-p 8545:23889 \
& w* B! z* ~5 _% I2 Rdcb9 / qtumportal
  B6 V' i, N8 c! @其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。
4 ?$ S" B3 {+ P2 d* f% H
2 e# L! b, ~8 g8 C6 U4、接下来,设置别名以访问qtum-cli工具:5 \# r. q; }1 @, {% P5 `  R8 d. K
alias qcli='docker exec -it qtumportal qcli', x+ `3 Y& R% x& H
; P* ~( d( p6 Y7 `8 {! Y+ _
5、生成600个区块作为测试的初始余额:: L7 F( C+ q1 U" O1 s5 o, g8 \
qcli generate 600$ |  ]8 T& P$ H6 R3 ^2 v, c% t# N

$ J  V1 ]* T$ J7 E6、设置 Qtum Plasma需要遵循以下步骤:
# }/ j5 b4 W# t- r2 s- n/ M创建两个Plasma用户  H  D9 k, S; J  d
在QTUM上部署根合约
' U) C9 Z( ~' S$ ~, i% ~注册Plasma用户) n+ H9 a% R" ^! F8 h1 j* R
运行子链
8 @7 v# s4 X6 [/ e) o* v; k$ k% y- c: i. |. O2 z; a. E
7、创建用户0 m+ m% P- i$ ?2 [
你需要准备的事:导入私钥和账户充值" L; d+ b: Y9 j6 ^  `
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。8 O6 o2 ?5 C5 f+ h* t* W. r
# Private Key
) O  {9 P8 Z+ e00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35' j" L9 K' {7 y& z! I% Q
# QTUM Address Hex
% A5 I6 i: z9 R0x7926223070547D2D15b2eF5e7383E541c338FfE9
$ Y" x; f; w% G" c0 ~. d6 q) }# QTUM Address Base58
7 e, U' U7 M' Y/ vqUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
9 h$ b1 N# M6 t# X5 m# ETH Address
& L( K6 k' Y- @+ G7 h9 x2 K0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47: ^; a2 {$ L2 s9 j
6 T/ B% p9 O- R
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。/ ]5 j& G+ Q; P. Z3 H( P

* i+ b- G. ?& ^% U/ u3 c第二个用户的私钥(没有管理员权限的普通用户):
! B+ M9 s7 m: {. G& q8 V( t: H. ]# Private Key
" }3 I8 h& p6 ~8 B- u0 [, S' Q7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
$ U2 u6 d& e( z- G# QTUM Address Hex# }& r2 l% U8 u3 q- k& X6 R. ?! j
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D5 C4 [7 P/ X! \: i% u
# QTUM Address Base58, Y& Y8 m: Q$ X9 w1 c/ U3 j
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
- u; f2 o' r1 A3 }& d# ETH Address
! O1 s8 N1 ?, e+ s0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF& D, B' {% X( T; T& ~; g2 h) y
导入这些密钥,并为每个帐户充值500 QTUM:
: t! H7 b0 g# g8 t4 x- E9 W* n# Admin Userqcli importprivkey \8 N; i8 S9 @. Y2 C1 S
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk
& L/ W: C/ a, qdocker exec -it qtumportal \- l" P, E8 J3 H4 }" P
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
& H0 K+ U+ C6 f' e$ ?" G" ?cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ! _# x+ T. n2 c+ V. P8 Q: {! P. ?
docker exec -it qtumportal \
3 [, u: D  O+ W# T3 o+ Dsolar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000
% W8 w9 V2 V! U; A! O- f! K  n) u
部署根链以及注册账户
; j3 j. @4 p: E8 M7 p9 S我们将用管理员用户来创建合约:
& C2 p3 H" L; U& E" ^make root-chain/ x$ i' m9 X) r5 @
0 f, Z4 S# n- z
如果成功,合约地址将写入文件plasma_core / contract_addr.py:
/ ]3 s) b/ t1 t; L  j7 Z) Dcat plasma_core/contract_addr.py' R0 M) W, l* B7 u' _  s  }$ b
ADDR="0x2208595067499452580F54668104Ffb1b8755d79"7 e3 D4 I" T) {$ N' {
原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
8 N  b. e) T/ _+ Z/ j! A; G# H  C# i  \& |% Z5 {' W
注册这两个用户:
9 d) m0 F( i7 Nomg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
: `0 A; i1 o3 V$ @6 n. J8 B3 U) M& Comg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
5 |7 c1 Y5 e6 F# j
: j5 E3 q' l6 s/ x6 p$ Y运行子链与充值账户
3 K- y. Z  E: [8 x- ?0 j* i* f* s, c7 z根链现在准备好了。让我们启动子链,一个Python服务器:1 V9 L. w" |/ ^+ y+ m( |, j
make child-chain3 u* [3 N1 `/ r  @& x- R
8 E: I! d) u- p, N# W" S3 N
用户充值至Plasma链中:
: P) C& }3 T% @# C; G+ P我们使用第一个用户(管理员)将100 QTUM存入根链:
3 @7 P  B" j1 Eomg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9. X+ O/ e; J- o, _  b
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
3 s& i$ y8 v8 z& e5 R5 d# F; x# m+ f7 r  `9 ^
当根链确认存款时,应该看到来自子链的以下日志输出:" N* P8 `8 d) y2 m: l. I1 u. b
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})4 n, L7 _: S- V5 ~# p1 s
+ a! j" p5 p" Z. d9 s& H
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。1 p) I" m6 [8 D9 h
& B5 ]& O. I- I4 q
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
3 c# ~& A' N' E% p" G0 z9 comg sendtx \ `# vin 1 (blknum, txindex, oindex)` \5 _7 m! W# A) j* [5 l" b
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \; R' G* R. [- ^2 Y) J2 v
0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \9 `; x4 }# l3 i
0x0 \ `# vout 1` \* K- w# E( E7 ]& [
0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \1 r  i8 v' B$ J  J! ~9 b+ |
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \9 y: j& P% L7 ?
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35) Q. B+ G2 C9 J

; B- B6 u% Z6 w交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:/ @) ^& {# }; P
# submit a block with the admin's signing keyomg submitblock \9 T1 I0 d/ I2 U0 }& }3 O9 J
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
+ k* F' y2 h% C  z/ p& q+ [$ z% _
* c$ E3 A1 n5 w2 @3 ?2 J' s5 ?& B子链应该输出:
% T1 b2 f, P$ cutxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa: R5 D4 n% q+ r: n% x
1 h0 ]/ b5 T# h7 u& d+ w

- m2 S% _6 I1 O% \0 r7 l$ ?/ N. g链的撤销5 j% z& N  Z0 e+ Z

2 y7 t2 r. j$ C3 O要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
: l5 Y# t/ }) D: C前述的sendtx,区块1000上有两个VOUT。
! ]8 c+ ~: {% ^; O4 k  {我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
: r' T) d1 Y* A+ tomg withdraw \
3 y- J+ G+ O3 i- x6 k: o6 M) |1000 0 0 \
2 O2 S9 O5 X: j& \+ W`# Use user1's key to create a confirmation sig` \
" n, u+ q8 C% q6 U3 F3 o4 u  k  q00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35% b! @! a0 W8 g" {5 ^9 O
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:" Z* p, B  y3 @& m' d: I
sleep 30
  s7 ^4 _0 \4 l, T/ z* C在挑战期之后,调用finalize来解决链上的所有有效退出:, y8 u+ P" j" _: G3 D
omg finalize_exits
. F$ l( X( g- T# i, q, S我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
0 h3 r4 t4 v; G& Q/ P. z  V
, Q  {, Q$ r2 B7 xbash scripts/getbalance.sh
$ i9 J. {4 @9 U6 ^4 y! P"balance": 5000000000,
4 c+ W3 [. _( I( \5 i, b8 R' z* J$ \! Q8 y( L
如果用户2也想退出,则过程类似:
/ M- w$ R9 v- C( H3 a6 O; S+ C+ i3 H2 m/ m( f4 X' |
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f355 O" o4 f& [! w; A9 [. N
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10