Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Qtum x86 虚拟机技术简介

9爱乐9
135 0 0
什么是虚拟机?+ p. {6 h2 G8 D8 D

/ c+ \7 J+ k, {6 ^1 {" v/ f# \虚拟机是指通过软件模拟、具备完整硬件系统功能并运行在独立隔离环境下的完整计算机系统。比如虚拟化物理机 VMware、Java 虚拟机等。而 Qtum 虚拟机则是建立在Qtum 区块链上的代码运行环境,其主要作用是处理 Qtum 系统内的智能合约。: a% c& s: \# R4 l
- u6 c% Y) o  M; u2 C
简单来说,虚拟机是一个完全独立的沙盒,合约代码可对外完全隔离并在虚拟机内部运行。由于虚拟机分散储存在每个节点的计算机上,所以希望创建智能合约的公司可使用类似 JavaScript 和 Python 等编程语言创建运行程序;同时 Qtum 虚拟机又能与主网的其余部分隔离,运行时不影响主链的操作。
1 R0 Y8 j) B0 g6 L( b
# n4 j1 U  j. g# kQtum 已兼容 EVM,为何还需要 x86VM?
( v' y. h" r7 z6 Q- |2 t1 z' }0 F: m' W+ ^4 T# o( u6 @, M
虽然 EVM(以太坊虚拟机)是当下最流行的智能合约虚拟机,但正如绝大多数新生事物一样(比如 Javascript),它存在诸多缺点。并且由于它的设计比较非主流,很难有主流的编程语言能够移植到 EVM 上。这种设计可以说对于近50年来的大多数编程范例来说都不太友好,例如:- O( j7 a' Z3 W. x; [  Q
1 k. q+ ~/ m7 S) M- Q
编程语言局限性(Solidity)
" z5 n7 p" ~8 {+ v( K0 g9 \缺少标准库( S5 X  T/ ]  b/ p! b9 J
256bit 整数,大部分处理器不能原生支持,运行效率降低
1 Q# F6 ?& L+ q$ `' `, QGas 模型不合理,难以估计 Gas 消耗
" o/ H/ X! h3 {8 w$ O0 v生成的 bytecode 较大,浪费区块存储资源
) \8 f9 y; `# |9 m4 `- I! M  P难以测试和调试
+ D" W: h% t/ u2 \3 s8 i$ [  z3 `& {  q5 ^7 z0 R9 f7 P
正因为 EVM 存在诸多缺陷,Qtum 决定开发自己的虚拟机。x86 虚拟机兼容了被工业界充分验证过的 x86 指令集,对基于 x86 架构之上的所有技术和基础设施都有很好的兼容性。Qtum-x86 的基本特性包括:
1 h' n  d6 _7 N1 [3 G! E# I' C% Y# J
支持多种主流编程语言: C/C++/Go/Rust 等等
; g0 O" F( m$ ~3 N, t7 {丰富的标准库,提高开发效率" y: o; U4 j3 F* o# a' t
更加优化的Gas模型 : 为标准库函数设定合理的 gas 模型,可以准确估计 gas 消耗
4 k$ O0 ^+ L4 ~" V( T" n  `解锁 AAL 的强大功能 :支持合约的 P2SH 交易,segwit 交易等2 X9 E3 Q7 c# v/ J; H5 S
冯·诺依曼结构,加强版的智能合约 :代码即数据,多任务协作,支持中断和恢复2 H9 L) g. p$ _" f& h' P" q
第一类预言机 :无需运行合约即可获得某些合约数据
3 e5 }8 R& j7 x% {7 {3 `区块链动态分析 :更全面地分析区块链状态
7 c  G" ^4 b* _2 L( v& M选择性数据存储 :节省宝贵的区块链上资源
) t* @2 N3 {8 q' ~% T4 A清晰的依赖关系树 :有可能并行运行智能合约,降低 gas 费用5 Y' d9 l  x$ C* _- E- L6 s; h+ Z# \! M

3 E" m( R- \1 |+ ]5 EQtum-x86 虚拟机将支持丰富的编程语言,操作系统与虚拟机解耦,旨在将智能合约开发推向主流。
3 Z  z9 }+ X" \8 m- x简介6 F% g$ [! i) Q. [# y9 L; c

7 b5 d. O( A' `本系列连载文档主要讲述 Qtum x86 虚拟机,x86 虚拟机的开发工作在开发进程中,该文档仍是学习了解 Qtum x86 虚拟机重要参考,本篇为连载系列的第一篇,后续也将陆续更新。. K, \& T" v. }7 X! C
什么是 Qtum-x865 \, a5 X: x& M5 a5 y
* j) P, t2 T. Y- `. V
Qtum-x86 是 Qtum 正在开发的最新产品原型,包含了 x86 虚拟机。用户可以用 C 语言编写智能合约,未来将支持更多编程语言。目前这个原型只是一个预览版,合约接口和最终发布版可能会略有不同。
4 F8 z9 }: t$ m! R/ X3 D
. U1 }8 |1 O) T& U2 h6 V( T该版本的 Qtum 目前有以下几项限制:
, b( U6 e0 G  r& c& B1 \必须从 Docker 中使用或从源代码编译
3 E) \% ^+ E/ R  h) _: B  q不支持以太坊虚拟机合约功能9 W  Q  s+ i. @8 J, g
不支持测试网络和主网,只支持 regtest* B7 s  R5 s, M7 \: i% ]' n& p7 D$ p
出现孤块及分叉将无法正常工作
# j4 w3 Q! k3 |6 U: yx86 合约只支持命令行 RPC 接口,虽然理论上 GUI 仍可用
+ Q9 ?6 Q( `6 k2 p* n, E( q1 q' }/ K# I8 q9 t1 m
01
& k, J; p4 R3 G: \5 P工具链设置
$ {. @8 V: j. \6 P5 q6 u4 w7 `& P1 H* R" J
由于代码经常需要更改,目前暂不提供编译好的 Qtum-x86 二进制文件。
& g( |7 _  R3 P. f" [
0 I& ~/ I2 ~  \因此,工具链和 Qtum -x86 本身必须从源代码进行编译。dockerfile 可以极大地简化构建过程,否则构建过程会非常复杂,需要根据不同操作系统安装。% Q" Y* {2 o7 c3 N

% @; Q9 @( X" Q6 YDocker 文件和一些实用程序可以从以下网址下载:  f: g! B; T: R- s8 [' g4 ]
https://github.com/qtumproject/qtum-docker/tree/master/proto-x86
$ ^) Z/ s/ [9 a) s/ N, H. z& z: X+ H  x0 q9 N* _: N
构建 docker 镜像的步骤如下:
5 P8 f$ N( ]; C; ddocker build -t qtumx86 -f Dockerfile / s8 H  u0 K* V- S  c( @& L! v
) M- P* ]' r1 ~+ h
大多数计算机上需要花费几个小时,因为它需要编译整个工具链,若要从头构建镜像(如更新版本等),请使用 --no-cache 操作指令:
) X5 `. Z0 C' ~) Cdocker build -t qtumx86 -f Dockerfile . --no-cache
+ R* N- ^; \9 ]; ~) v% `5 }* U' A( ~8 s
一旦镜像构建完毕,接下来的使用就会比较简单了。为了简化操作,我们提供了一些辅助bash函数,它们将在本文档中被使用到,但并不是必须的。helpers.sh文件如下:% C/ M2 {" `+ l/ `( [3 q
#!/bin/bash
# n' M0 d! ~1 ?7 N/ w( Afunction qx86start() {
" z  u- ~' U( s, K    docker run --rm -v "${PWD}:/root/bind" --name qx86 -d qtumx86 qtum/src/qtumd -regtest -logevents
, v7 b/ E7 ~+ F# U8 i& P# U% K}
, }8 W: a' e3 {% Eexport -f qx86start7 S, u& }( d9 ^; l
2 u! Y9 E3 \: K& _. I3 q2 V
function qx86stop() {
' ^9 o& j; }* Y5 ~    docker stop qx86  D' q7 s2 R/ Z7 e& d
}
( z- l4 i, \6 s* O/ ~  iexport -f qx86stop
7 X. Q( i$ {6 t8 U9 d& z 7 |2 H" c; ?7 o( _- P; B- x: i
alias qx86cli='docker exec qx86 qcli'% n2 F" D+ l. p% F  ]4 G  ^4 Q# ~
# |! J/ R" I. F/ ~, A8 n8 W7 W
function qx86deploy() {! J4 ]( i8 x* @3 \; M& U- @' A  |
    docker exec -t qx86 deploy_contract `hexdump -e \"%x\" $1`
( b; S2 n- P: q$ h* _9 h}
6 H' p& i2 [) Q4 E" p. Iexport -f qx86deploy/ p3 [; P0 f) r$ L6 n3 S# E+ i
* k2 e9 E8 g: K" E
function qx86tb() {
% j1 m6 G2 b/ a    docker run --rm -v "${PWD}:/root/bind" qtumx86 x86tb
0 g& L- Z: N. ]" D}
/ b" z* V, [% Q9 g2 jexport -f qx86tb  w' t5 f% ?1 P/ Z

$ Q4 E% ?" z+ {2 Q' @" gfunction qx86make() {
% ^6 ^5 Z2 U4 ~- a    docker run --rm -v "${PWD}:/root/bind" qtumx86 qmake "$@"
# Q3 `) M& M3 V& G+ O$ O% Y}
: ^* g! \+ U1 f2 |4 w9 @export -f qx86make/ A: P$ }( d4 [! ~$ y+ J, G0 H
3 z; g5 Y  u3 R( `1 K+ @# d5 Y
开发者可以在当前的 bash 会话中使用该文件,只需执行:
% D- \0 G6 S$ ~$ [source helpers.sh
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

9爱乐9 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1