Qtum量子链研究院:Qtum Plasma MVP 技术详解
博客园
发表于 2022-12-3 00:02:12
135
0
0
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。$ t, n. J4 }: w
在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。% h" }# }( Y0 ~7 C1 ], H
如何在Qtum上创建Plasma MVP: K$ @9 U* c) { W, H9 K
Qtum Plasma MVP 的实现基于以下技术:0 I) }/ w# X& a8 T
Minimum Viable Plasma
Omisego Plasma MVP6 \, h- k8 |! ^% `2 r' H$ M
' L5 }* S L, q5 j' [: c+ M$ h
1、首先检查你的Python版本:
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
1 u: A4 y7 U' b( H4 q |
2、安装Python
python setup.py install
3、运行Qtum Plasma MVP, a& C2 g% `5 [% Q; q7 _: f' C
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
docker run --rm \( e, _, g3 |4 D% a- N
--name qtumportal \
-v`pwd`:/ dapp \
-p 3889:3889 \
-p 8545:23889 \" x9 ~" [6 z' F `* b6 Y% m+ f
dcb9 / qtumportal
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。 ?% P8 t7 p% H/ c7 ?# {5 [* N
_0 }" C- f0 M0 `' ^
4、接下来,设置别名以访问qtum-cli工具:
alias qcli='docker exec -it qtumportal qcli'% A# W- N L g; A6 I
+ |+ R4 a# p! @$ q/ F( m% P
5、生成600个区块作为测试的初始余额:+ W& W) b- T5 |( e' q5 D/ n
qcli generate 6009 l4 h1 A. @% ? D) M; k8 e& C0 B
6、设置 Qtum Plasma需要遵循以下步骤:
创建两个Plasma用户
在QTUM上部署根合约
注册Plasma用户0 ~% [* ]% { ^) G- A. g; g
运行子链5 [9 {; r4 p+ P& F+ ~7 u |; x I' N: ]
4 K7 d6 y! Q, R6 K! c5 D2 j6 d
7、创建用户( \( u) _" g# A$ v4 x( E+ P; n6 Q1 w
你需要准备的事:导入私钥和账户充值
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。6 X# u1 i5 K' ~& x ~8 o% J: Q! s
# Private Key& Z* \/ Y. G% Y% N4 j
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f351 e$ c9 L) z4 A8 | o( c, Y/ h* ~* W, t
# QTUM Address Hex
0x7926223070547D2D15b2eF5e7383E541c338FfE9, u7 M, ~1 j! I, i; v: f
# QTUM Address Base58
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
# ETH Address; ?7 j- T5 y+ |+ D+ `/ l1 ]# v, ]
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47; B4 a& m; w& G% N" ?
( o, a5 d. S m
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。: E1 P( T8 O) b8 V; R: [
: M& o7 S o( t9 g' W. `
第二个用户的私钥(没有管理员权限的普通用户):
# Private Key& M6 I5 p; C) y3 z( S# a- h
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
# QTUM Address Hex1 v# _: d0 n9 h8 v' z; U8 ^$ r
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D# e/ X5 l( L# F6 h
# QTUM Address Base58: N5 o$ [$ l% o9 f8 t1 h% G, @
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
# ETH Address
0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF5 }& T9 i w9 q9 `; \& u
导入这些密钥,并为每个帐户充值500 QTUM:; j% w/ d& m% i, y) t" a
# Admin Userqcli importprivkey \
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk$ j4 L, ~ p! ~" |& Y+ s9 H
docker exec -it qtumportal \- I/ C* A( T3 {$ E! K
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
docker exec -it qtumportal \6 r7 \& R. U6 {4 j7 M, g
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 500005 K: O/ e% E: n" J6 y
部署根链以及注册账户
我们将用管理员用户来创建合约:0 Z- S: p# D* t/ b/ C& t
make root-chain9 l, j/ U8 i8 T& P
如果成功,合约地址将写入文件plasma_core / contract_addr.py:5 v. U; {: g8 E9 |
cat plasma_core/contract_addr.py0 [* Q, A. P1 D* l# [3 z7 @
ADDR="0x2208595067499452580F54668104Ffb1b8755d79"
原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。6 b$ z: O$ Y I" D
6 z% j: u; b6 ~
注册这两个用户:
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f359 W( s$ [7 H/ u @
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e, o" [: Y. Q( A4 V$ B
, s7 L ~2 G' |+ y3 F/ N
运行子链与充值账户2 k& w% {: f* E# v- x4 B3 y; q8 k
根链现在准备好了。让我们启动子链,一个Python服务器:
make child-chain
2 x$ ]. O" z8 p8 m+ [9 ]: \
用户充值至Plasma链中:
我们使用第一个用户(管理员)将100 QTUM存入根链:2 t' B7 C9 [- c$ O/ W9 `8 U
omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9! p& s. V: s# `7 y0 B* q
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
当根链确认存款时,应该看到来自子链的以下日志输出:
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})& q1 D8 {4 H( W
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。# x. ?0 Y1 e) |, }
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \0 u. ]1 }6 B1 Z/ L
1 0 0 \ `# vin 2 (blknum, txindex, oindex)` \
0 0 0 \ `# The type of the (ERC20) token. 0x0 is the "native" token, which is ETH or QTUM.` \
0x0 \ `# vout 1` \
0x7926223070547D2D15b2eF5e7383E541c338FfE9 5000000000 \ `# vout 1` \, Q& J- ]0 s! \8 A; I
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \8 L$ a5 D6 V+ q+ T% r2 E% _2 t
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35* z- r" R. v, F" ?# E
/ o. T1 M' E. o" H: A% u" n* z
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:
# submit a block with the admin's signing keyomg submitblock \2 N% Y5 J. ]" H" G
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
4 F* C- U+ Z X8 A
子链应该输出:0 H6 D& Z( g! R/ ^8 U8 p2 T8 z8 a
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
) S; F3 J& P# q
链的撤销/ @; w: k# e! ^- @4 U8 F1 m' z7 W
要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。" A% e* _2 b; s) [
前述的sendtx,区块1000上有两个VOUT。; A1 k+ }; J. E4 ~9 _3 l
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
omg withdraw \
1000 0 0 \" P# X G; I: k% k5 J' U2 m2 h! {
`# Use user1's key to create a confirmation sig` \+ y7 ?' V7 p s& L
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:. W/ x1 S; J( l5 `
sleep 30
在挑战期之后,调用finalize来解决链上的所有有效退出:
omg finalize_exits
我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:* q! b2 {% P) e
bash scripts/getbalance.sh
"balance": 5000000000,0 O2 y* I* Z# T7 @" f
0 X8 r4 w- i% D; `
如果用户2也想退出,则过程类似:+ ?9 I6 `- r k% [! C
& k8 @* u6 T+ E* c& ?
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
成为第一个吐槽的人