Qtum量子链研究院:Qtum Plasma MVP 技术详解
博客园
post on 2022-12-3 00:02:12
20
0
0
Plasma MVP以一种非常简单的方式提供Plasma系统的基本安全特性。
在Plasma MVP中,用户一旦发现任何不法行为就立即退出,用户的退出申请也是按照UTXOs被创建的时间从早到晚的优先级顺序处理。
Plasma区块链中,区块的创建方法有两种:一种是Plasma链的运营者可以创建区块;另一种是任何用户可以向Plasma链中存入一定资产,这种情况下,合约会在Plasma链上新增一个区块,该区块包含一个创建新的UTXO的交易,UTXO和用户存入资金的价值相等。
如何在Qtum上创建Plasma MVP
Qtum Plasma MVP 的实现基于以下技术:
Minimum Viable Plasma
Omisego Plasma MVP
1、首先检查你的Python版本:
请使用Python 3.5或更高版本,但我们建议您使 pyenv,并运行3.6.5版。
2、安装Python
python setup.py install
3、运行Qtum Plasma MVP
准备一个镜像docker,其中包含qtumd以及ETH RPC兼容层。
docker run --rm \
--name qtumportal \
-v`pwd`:/ dapp \
-p 3889:3889 \
-p 8545:23889 \
dcb9 / qtumportal
其中:3889为原始的QTUM RPC,8545为ETH兼容的RPC。
4、接下来,设置别名以访问qtum-cli工具:
alias qcli='docker exec -it qtumportal qcli'
5、生成600个区块作为测试的初始余额:
qcli generate 600
6、设置 Qtum Plasma需要遵循以下步骤:
创建两个Plasma用户
在QTUM上部署根合约
注册Plasma用户
运行子链
7、创建用户
你需要准备的事:导入私钥和账户充值
其中导入的私钥为第一个账户用户所有,此用户还充当管理员,用于部署Plasma合约,以及提交子链区块。
# Private Key
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
# QTUM Address Hex
0x7926223070547D2D15b2eF5e7383E541c338FfE9
# QTUM Address Base58
qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW
# ETH Address
0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47
请注意,同一私钥的ETH和QTUM地址不同,我们需要知道这两者的区别。获取签名时,ecrecover函数返回ETH格式的地址。
第二个用户的私钥(没有管理员权限的普通用户):
# Private Key
7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
# QTUM Address Hex
0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D
# QTUM Address Base58
qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf
# ETH Address
0x0CF28703ECc9C7dB28F3d496e41666445b0A4EAF
导入这些密钥,并为每个帐户充值500 QTUM:
# Admin Userqcli importprivkey \
cMbgxCJrTYUqgcmiC1berh5DFrtY1KeU4PXZ6NZxgenniF1mXCRk
docker exec -it qtumportal \
solar prefund qUbxboqjBRp96j3La8D1RYkyqx5uQbJPoW 50000# Normal Userqcli importprivkey \
cRcG1jizfBzHxfwu68aMjhy78CpnzD9gJYZ5ggDbzfYD3EQfGUDZ
docker exec -it qtumportal \
solar prefund qLn9vqbr2Gx3TsVR9QyTVB5mrMoh4x43Uf 50000
部署根链以及注册账户
我们将用管理员用户来创建合约:
make root-chain
如果成功,合约地址将写入文件plasma_core / contract_addr.py:
cat plasma_core/contract_addr.py
ADDR="0x2208595067499452580F54668104Ffb1b8755d79"
原始的Plasma MVP不需要用户预先注册。但是,由于上面提到的ecrecover问题,智能合约需要将QTUM地址与ETH地址相关联。
注册这两个用户:
omg register 0x7926223070547D2D15b2eF5e7383E541c338FfE9 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
omg register 0x2352be3Db3177F0A07Efbe6DA5857615b8c9901D 7826adc1127b8cf34c47b2c7909904109d7fe404be04838e323082981c51340e
运行子链与充值账户
根链现在准备好了。让我们启动子链,一个Python服务器:
make child-chain
用户充值至Plasma链中:
我们使用第一个用户(管理员)将100 QTUM存入根链:
omg deposit 10000000000 0x7926223070547D2D15b2eF5e7383E541c338FfE9
Deposited 10000000000 to 0x7926223070547D2D15b2eF5e7383E541c338FfE9
当根链确认存款时,应该看到来自子链的以下日志输出:
apply_deposit AttributeDict({'depositor':'0x6Fd56E72373a34bA39Bf4167aF82e7A411BFED47','depositBlock':1,'token':'0x0000000000000000000000000000000000000000','amount':10000000000})
这笔存款在侧链上创建了相应的UTXO,Plasma MVP使用简化的UTXO,因此可以有两个VIN和两个VOUT。
omg sendtx有点不友好,因为它需要很多参数来创建一笔交易。我们将使用存款UTXO作为VIN1,将VIN2留空,并创建两个每个50个QTUM的VOUT,一个给接收方,另一个作为找零给发送方。
omg sendtx \ `# vin 1 (blknum, txindex, oindex)` \
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` \
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
交易发生在Plasma上,管理员需要将子链区块的merkle根提交到根链,以发布Plasma 交易,供所有人查看:
# submit a block with the admin's signing keyomg submitblock \
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
子链应该输出:
utxo_id: 1000000000blknum: 1from: 0x7926223070547D2D15b2eF5e7383E541c338FfE9block.merkle.root: a2540bf5fef7c09ab916fabd3607385eba19468e6a6e09fced27400254b6ac9blen: 32data: 6bd3991cdfe4d2492b262e178370b74ae7c8eeacc7acb052cd5820e62ac548fa
链的撤销
要使用户2从子链中撤销VOUT,用户1必须为该交易中的每个VIN发送一个确认签名。
前述的sendtx,区块1000上有两个VOUT。
我们撤销由1000 0 0(块1000,tx 0,vout 0)指定的VOUT,它属于用户1:
omg withdraw \
1000 0 0 \
`# Use user1's key to create a confirmation sig` \
00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
一旦撤销请求在链上,我们需要等待一个挑战期才能最终确定。在该测试中挑战期设置为30秒,所以只需等待:
sleep 30
在挑战期之后,调用finalize来解决链上的所有有效退出:
omg finalize_exits
我们应该看到,因为转出500 QTUM UTXO,合同余额现在减少了:
bash scripts/getbalance.sh
"balance": 5000000000,
如果用户2也想退出,则过程类似:
omg withdraw 1000 0 1 00821d8c8a3627adc68aa4034fea953b2f5da553fab312db3fa274240bd49f35
请注意,CLI工具仅用于测试目的。通常,用户2不知道用户1的私钥,而是直接接收确认签名。
BitMere.com is Information release platform,just provides information storage space services.
The opinions expressed are solely those of the author,Does not constitute advice, please treat with caution.
The opinions expressed are solely those of the author,Does not constitute advice, please treat with caution.
Write the first review