01

智能合约与虚拟机

智能合约

在区块链中,智能合约扮演着非常重要的角色,用户提交的业务请求,都是通过链上智能合约的执行得到最终结果。有了智能合约,我们就可以根据不同的业务场景,在区块链中实现相应的功能。那么,什么是智能合约呢?我们可以从两个层面来理解智能合约:

1. 对于应用场景:智能合约是一种交易协议,记录了交易条款信息、事件、行为,旨在减少对可信中间人的需求、仲裁和执行成本。

我们可以将交易逻辑抽象成程序,将这段程序存在区块链上,接下来这段程序就可以帮助我们自动处理交易的逻辑,完成现实生活中相关的交易。

2. 对于计算机而言,智能合约是一段编写好的程序,可以实现对链上数据的增,删,查和改。我们都知道,数据在区块链中主要有两部分,一部分是世界状态,它记录了当前各个主体的信息,另一个部分就是交易记录。其中,对于世界状态数据的增,删,查和改就需要智能合约来实现,通过智能合约对世界状态修改的过程,会作为交易的一部分记录起来。

虚拟机

那么,什么是虚拟机呢?虚拟机就是智能合约运行的环境,为智能合约提供计算资源和运行环境。

虚拟机有以下3个特点:

1. 确定性:我们知道,区块链是包含了多个节点,有的节点要组装区块,有的节点要验证区块。他们其实是在各自的环境中运行这些交易。我们需要让同一笔交易在每个节点运行的结果都相同。

这需要在运行的时候,排除随机数、浮点数运算等这种可能带来不确定的因素,以及直接使用外部数据源等。

2. 隔离性:无论执行结果、是否崩溃等,主链不受影响,每个虚拟机都运行在隔离的环境中,确保资源访问安全性,只能修改属于该合约自身的状态记录。也就是说,虚拟机与虚拟机彼此隔离,虚拟机也不会影响主链。

3. 可终止性:能主动停止,使用GAS、指令数、超时时间等标准

02

长安链合约引擎

长安链支持多种智能合约编程语言和虚拟机,为虚拟机提供统一的数据访问和密码算法访问接口。当一批交易通过调度器被发送至虚拟机时,虚拟机将解析交易中的智能合约调用参数,并且在运行时,通过数据访问接口获取运行时必要的数据,最后执行生成交易的读写集、交易执行结果和交易执行的日志信息。交流流程如图1:

图1

长安链目前支持3类虚拟机:

1. EVM虚拟机,是基于以太坊的虚拟机改造,更加适应长安链的虚拟机。它是一种基于栈的虚拟机,在运行期间不能访问网络,文件,即使不同合约之间也是有限的访问权限。

2. WASM类虚拟机,是一种字节码的格式,WASM虚拟机就是可以解释执行wasm字节码的虚拟机,是一种基于栈的指令集合。

3. 容器类虚拟机,作为本文的重点,会在下面进行详细介绍。

这里,我们可以对上面3种虚拟机做一个对比:

安全性

性能

语言友好

开发难度

EVM虚拟机

WASM虚拟机

容器类虚拟机

表1

03

DockerVM

容器类虚拟机,顾名思义,就是利用容器来实现的虚拟机。让我们回顾一下容器是什么:

容器就是将软件打包成标准化单元,以用于开发、交付和部署。容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。容器化软件在任何环境中都能够始终如一地运行。

Docker作为非常成熟的容器技术,拥有以下3个特点:

1. 轻量:在一台机器上运行的多个Docker容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。

2. 标准:Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。

3. 安全:Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

所以,容器的特点很好的契合了虚拟机的要求,在长安链中,我们就使用了Docker来实现容器类虚拟机。

DockerVM架构

接下来,我们正式介绍DockerVM。DockerVM中最重要的组件为Docker Manager,它负责DockerVM与链的通信,交易的调度,管理合约。结构如图2:

图2

以下为各个子模块的介绍:

  • CDM RPC

CDM RPC模块⽤来和节点进⾏本地通信,启动容器时会建⽴链接

  • DMS RPC

DMS RPC模块⽤来和各个合约进程进⾏通信

  • Security Env

Security Env模块⽤来设置容器的环境,包括设置Control Group, IPC等

  • Contract Manager

Contract Manager模块⽤来管理合约的⼆进制⽂件

  • User Controller

User Controller模块⽤来⽣成user结构体,其中包括uid,sock⽂件等;并且可以分配和回收user。

  • Handler Register

Handler管理Docker Manager和合约进程的通信逻辑;每⼀个合约进程会产⽣⼀个独⽴的 handler 进⾏通信管理。Handler Register控制handler的⽣成,注册,和销毁。

  • Docker Scheduler

Docker Scheduler模块⽤来管理合约进程,在拉起合约进程的时候,会为其准备好合约⼆进制⽂件,分配好可⽤的user,⽣成新的Handler,为进程设置超时时间;在进程结束时,对上述资源进⾏回收

  • Sandbox

Sandbox为合约进程,在合约运⾏的时候,⾸先会与Docker manager进⾏基于unix domain socket的rpc链接,随后进⾏相关消息的传送

DockerVM特点

接下来,我们基于虚拟机3大特点,逐一来介绍DockerVM的实现细节。

隔离性

首先,DockerVM实现了两层隔离:DockerVM与主机的隔离,合约的隔离。

1. DockerVM与主机的隔离

DockerVM采用一个容器运行所有的合约,对于每一个节点,都会启动一个容器,节点与容器通过 unix domain socket 进行本地通信。如果开启 Docker VM ,则在链启动的时候启动容器。如图3。

图3

借助容器的特点,DockerVM与主机很好隔离开。DockerVM里面的运行不会影响到主机或者运行在主机上的链的运行。另外,DockerVM容器里面运行的是ubuntu系统,我们可以在这个系统中做很多有意思的操作,但是这些操作都不会对主机有任何的影响。

采用一个容器的好处:1. 方便管理,DockerVM负责管理所有的合约,包括合约的表现,异常等;2. 节省拉起容器的时间,我们不需要为每一个合约去拉起一个新的容器,从始至终都只有一个容器,它为我们处理所有的事情。

2. 合约的隔离

合约交易都在容器中的一个独立的进程中运行,我们称之为合约沙盒。我们为这个进程赋予独立的Process Namespace, 唯一的User Id 与 Group Id,并且这些进程都被同一个CGroup控制。同时,整个容器关闭了网络功能,所以合约进程拥有以下3个特点(如图4):

1. 文件隔离

2. 网络隔离

3. 进程间隔离

图4

对于合约进程来说,它被启动以后,一直在等待新的交易到来,这些交易都是属于这一个合约的。当这笔交易处理完毕,DockerVM会发送新的交易给它。当一段时间,合约进程没有接受到新的交易时,DockerVM就会关闭这个进程,节省资源。默认的等待时间为10分钟。

确定性

借助合约进程的网络隔离,文件隔离,进程间隔离,智能合约不可以从外部获取数据,只能使用属于本合约的数据。这就保证了交易运行的确定性。

可终止性

对于任一交易,我们需要有能力来终止。DockerVM采用交易超时来实现终止交易。用户可以为DockerVM配置交易超时时间,当这笔交易开始运行的时候,DockerVM开始计时,如果规定时间内没有运行结束,则会停掉合约进程,并且返回超时结果。

DockerVM使用

二进制文件部署

DockerVM采用二进制文件部署。

对于合约部署来说,一般有两种方式:源码部署与二进制文件部署,我们不妨看一下下面的对比:

源码部署

二进制部署

体积小

体积大

在链上编译,时间长

合约部署与调用行为不一致

在链下编译,链上部署快

合约部署与调用行为一致

容易泄露源码

不容易泄露

表2

采用二进制文件部署最大的优势在于省去了链上编译文件的过程,而这个过程是不可控的,对于简单的合约,它的编译时间相对很短,但是对于特别复杂的合约,它的编译时间就会很长。使用二进制部署,就是把编译的过程放在了链下,对于链上,我们直接就可以进行使用。

RECOMMEND

推荐阅读

长安链ChainMaker国密TLS设计与实现

长安链ChainMaker新特性——透明数据加密TDE

长安链自研网络Liquid详解及应用指南

Tips

更多长安链开源项目QA,可登录开源社区、技术文档库查看。

下载源码

https://git.chainmaker.org.cn/chainmaker/chainmaker-go

查阅文档

https://docs.chainmaker.org.cn/

长安链ChainMaker案例征集

http://www.wenjuan.com/s/UZBZJvhFGte/

“长安链ChainMaker”是国内首个自主可控区块链软硬件技术体系,由微芯研究院联合头部企业和高校共同研发,具有全自主、高性能、强隐私、广协作的突出特点。长安链面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案,为长安链生态联盟提供强有力的区块链技术支撑。取名“长安链”,喻意“长治久安、再创辉煌、链接世界“

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐