Minimal Viable Plasma

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的私钥,而是直接接收确认签名。

Qtum量子链研究院:Qtum Plasma MVP 技术详解相关推荐

  1. Qtum量子链研究院:Plasma扩容方案详解(上)

    近段时间著名的比特币投资者Olivier Janssens发布的推特投票中,Vitalik Buterin表达了其对ERC20 CBDC(央行数字货币)的支持.当被问到有关延展能力的问题时,Buter ...

  2. Qtum量子链研究院:Plasma技术详解(下篇)

    Plasma的设计模型有两个主要的分支:Plasma MVP(Minimal Viable Plasma,最小可行的Plasma)和Plasma Cash.Plasma MVP的目标是为最基本的可用的 ...

  3. Qtum研究院 | 公有链发展思考与Qtum量子链的技术革新之路

    ​正文共:11,554字 预计阅读时间:30分钟 文章摘要 简述了比特币与以太坊的发展历程.设计思想.以及目前面临的问题: 阐述了Qtum量子链的设计思路与技术创新点,介绍了Qtum的账户抽象层.共识 ...

  4. Qtum量子链关键技术解读

    即Qtum量子链开发者meetup--深圳站演讲实录 作者:钟文斌 今天我们将就以下几个主要的问题来进行探讨: 1. 为什么要建立Qtum量子链 2. Qtum量子链的技术基础 3. Qtum量子链的 ...

  5. Qtum量子链周报(10月22日-10月28日)

    Qtum量子链 10月22日-10月28日新闻动态回顾 本篇文章会详细回顾Qtum量子链在过去的一周(10月22日- 10月28日)项目动态,新闻回顾后还包含Qtum所有目前技术开发进展,欢迎随时查阅 ...

  6. Qtum量子链与亚马逊AWS中国云服务达成合作

    全球最大的云上技术服务平台亚马逊网络服务(AWS)中国区正式宣布与Qtum量子链合作 昨日,AWS中国区域业务开发主管Simon Wang证实了这一合作关系,并在电子邮箱中向外国媒体CoinDesk说 ...

  7. Qtum量子链创始人帅初:95%的项目在3年后,应该都不在

    "币圈一天,人间一年"每天的凌晨都是新的一年的开始.春节?不存在的.在这个全国人民都在休假的日子,区块链社区"三点钟无眠区块链"一直保持7*24*365全时段活 ...

  8. Qtum量子链x2018国际区块链大会:区块链技术如何真正落地?

    2018国际区块链大会于11月28日至30日在长沙国际会展中心召开,大会以"集智 链新 赋能"为主题,围绕区块链技术及其应用的未来展开业界讨论.本次大会由长沙市人民政府.中国电子学 ...

  9. Qtum量子链应邀出席2019棉兰区块链沙龙进军东南亚市场第一站

    印尼当地时间3月30日,由印尼合规交易所Indodax主办2019棉兰区块链沙龙顺利闭幕,进一步支持了Qtum量子链在印尼市场的拓展,此次Qtum量子链中国首席开发工程师钟文斌应邀担任客座嘉宾出席. ...

最新文章

  1. LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)
  2. Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?
  3. Android:屏幕旋转
  4. 网页版python叫什么-用Python爬网页需要了解什么背景知识?
  5. 处理之后的图像句柄传到显示框_深度学习目标检测与预处理模块
  6. go byte转uint_面试官问我go反射,我怀疑他让我写ORM框架
  7. Java数组、集合的三种遍历方式(包懂)
  8. 常用输入法隐藏的这些神奇功能
  9. 序列代码UVa 111 History Grading (最长公共子序列)
  10. 获取GridView中RowCommand的当前索引行
  11. 处理ionic项目中,输入框的光标不自动定位,键盘不弹出的问题
  12. Linux电源管理系统架构和驱动(1)-Linux电源管理全局架构
  13. LeapFTP访问WinXP上的文件
  14. 菠萝狗四足机器人使用手册
  15. QT 主线程子线程互相传值
  16. html ul怎么去掉内边距,ul默认有内边距
  17. 如何优化传统项目,提高web应用的吞吐量
  18. 关于8583报文详解
  19. jzoj 3456 恭介的法则
  20. 企业微信可以直接转账吗?

热门文章

  1. ASCII Grid
  2. jetson windows_Jetson nano 配置远程桌面
  3. vue集成svg-sprite-loader
  4. 想要进行gene prioritization分析,请看这里!
  5. java poi 读取word_Java poi读取word文档(本篇只能读取text内容)
  6. 7.1 RAID(独立冗余磁盘阵列)
  7. 利用adb 命令回到手机端某个app的页面
  8. 红帽为什么要加入阿里云的朋友圈?
  9. funcode项目笔记
  10. linux 操作excel文件,Linux下输出excel文件