Qtum量子链研究院:Qtum Plasma MVP 技术详解
博客园
发表于 2022-12-3 00:02:12
47
0
0
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。. ~( W3 M, t) c4 k0 M
1 ^, ?0 J+ r. l" v& ?4 y
在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
7 h2 _/ I7 q7 `( c7 J) D; H; n$ I
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。% W# A% N6 y3 j( }
$ Y8 }4 g2 c3 a- Z% `! \' c1 H
如何在Qtum上创建Plasma MVP
Qtum Plasma MVP 的实现基于以下技术: j6 M4 [" j4 y. k% R/ |8 Y
Minimum Viable Plasma
Omisego Plasma MVP
1、首先检查你的Python版本:9 b5 }+ R H. H0 a( b
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。, f3 m. h; b0 q* `. n
2、安装Python% d: N5 L: |4 `. g
python setup.py install6 Y( ?( T& X2 t* D. G
3、运行Qtum Plasma MVP" o% ^" Y1 g% v6 Z# l
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
docker run --rm \
--name qtumportal \; `( N% p/ [4 S5 l0 a8 X, I! v
-v`pwd`:/ dapp \, p% N+ [# l* m$ o+ L9 \4 r
-p 3889:3889 \
-p 8545:23889 \* T, X! ]1 r E0 u
dcb9 / qtumportal
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。
4、接下来,设置别名以访问qtum-cli工具:5 Z2 d+ L5 k; W( G) B: \+ h
alias qcli='docker exec -it qtumportal qcli'
+ B4 T6 u- l' b* |9 o5 m5 N
5、生成600个区块作为测试的初始余额:# E- a! D+ g+ p
qcli generate 6003 @- I5 I. @2 ]# W
6、设置 Qtum Plasma需要遵循以下步骤:; \' l& Z! j0 u5 O3 l
创建两个Plasma用户
在QTUM上部署根合约
注册Plasma用户
运行子链) Y/ l: Q6 W+ M! R& d6 b
7、创建用户
你需要准备的事:导入私钥和账户充值, ^9 |4 G# H/ h
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。" H7 O- W% J4 U0 I' G; X
# Private Key$ C- T+ c6 P; b% u0 y
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35) o4 Y7 G) g* \: ]
# QTUM Address Hex8 G9 k) D" N3 Y0 S7 Q
0x7926223070547D2D15b2eF5e7383E541c338FfE9
# QTUM Address Base58
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW+ e* ~* g# q" ~
# ETH Address
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47- r1 w* n6 F5 M8 k/ L
. a- u0 D* x. w9 e6 Z
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。8 E9 \' X I6 Y; ~$ |0 A" ^- W4 h
Z+ [+ ?* f- n* R
第二个用户的私钥(没有管理员权限的普通用户):+ t1 ^0 X4 V3 [8 p( N
# Private Key
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e+ B7 [. B( I5 Y: ^
# QTUM Address Hex
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D% V9 |6 s0 U4 V6 x$ L+ l7 q
# QTUM Address Base58# n9 Y- |9 Q- {. l. p; j2 h4 v9 H- i8 u
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf! h1 Z0 ?2 a# \0 F- r6 y- H
# ETH Address! a3 R& V9 o W4 P: V/ i* Y
0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF- q5 s& Q+ N' t; [9 J2 Z; P, N4 d
导入这些密钥,并为每个帐户充值500 QTUM:; v, L- S5 S" q2 I5 g5 a7 Z! R7 }
# Admin Userqcli importprivkey \& t! C: O/ W; i% R3 U; @
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk
docker exec -it qtumportal \+ m( a+ |8 e: A: c2 E' A' k& G
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \3 ?9 n) x8 e9 j! b
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ; H. s0 s9 I3 j G, ^
docker exec -it qtumportal \3 V/ ^# U1 K5 [" a7 g) y. N3 U
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000 `; k% I5 G1 b5 E8 |2 M1 p
部署根链以及注册账户
我们将用管理员用户来创建合约:/ M7 V3 \3 w- w4 x& I( n
make root-chain
如果成功,合约地址将写入文件plasma_core / contract_addr.py:
cat plasma_core/contract_addr.py$ ? L/ E- \5 G! ^2 \8 ^) M: V. M5 w
ADDR="0x2208595067499452580F54668104Ffb1b8755d79", V5 r# \+ z6 G1 R; E7 M+ a
原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
注册这两个用户:( F4 i8 I2 u3 d- L
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
运行子链与充值账户9 v: o) F; x+ q1 _! |
根链现在准备好了。让我们启动子链,一个Python服务器:) Z) U% I3 u- G3 {; p; h9 _, I. S
make child-chain# `- \' P' K3 N- V8 X0 o
用户充值至Plasma链中:& z! b+ R* P4 u
我们使用第一个用户(管理员)将100 QTUM存入根链:- w" b9 c# p: a* @" C
omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE91 `% L- k {2 e: ^5 v) K
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9* ~& ~9 z* h+ i' o) ~' x
% I1 g8 _6 g1 o1 e# E
当根链确认存款时,应该看到来自子链的以下日志输出:
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})( k/ A: H M3 H' b
! E' n6 [6 _' l8 _% @* _% p
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。2 P+ ~+ S' F2 c7 d0 Q* s
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \9 d6 o( Q4 x" _' M
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` \
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 5000000000 \ `# Signing key of sender` \ q ~/ h$ d1 S5 k
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f352 V) y" |) {* u, p+ U. G1 c
$ h$ h/ }+ Y( k* M" j
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:$ u5 B6 q& ^# ^, t/ Y; V2 e
# submit a block with the admin's signing keyomg submitblock \! a S) E( Q, X" ^$ R/ B7 |
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
子链应该输出:
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
" n/ u+ i7 E) ^- W* }+ u
链的撤销5 {5 W8 e; l! ?5 W, p' n" o: l
8 @! \$ c, f! q" t6 D
要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
前述的sendtx,区块1000上有两个VOUT。
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:0 ?" u3 ~* f& C5 B5 \; {, v8 {
omg withdraw \, k& K; c& T" \2 x) k7 W- O
1000 0 0 \1 s+ A' K3 D H
`# Use user1's key to create a confirmation sig` \
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:# T$ S1 b. N) e
sleep 30- _( m" |( R4 _& C
在挑战期之后,调用finalize来解决链上的所有有效退出:
omg finalize_exits
我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
+ Q* l; W7 K5 Y9 ~+ S3 `" L' J' e+ M
bash scripts/getbalance.sh0 O# ]7 D& R; Y, M: [, R# u1 k
"balance": 5000000000,+ @( T, @/ _. h1 R3 n4 j
如果用户2也想退出,则过程类似:1 L, X ]5 b' P9 j5 T5 s
5 C! A4 q% p8 I6 I
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
成为第一个吐槽的人