赞
踩
现有区块链系统合约运行环境有三种,Native本地调用、虚拟机(字节码解析)、容器技术。Native执行速度快,但与主程序在一个进程,共用网络栈、IPC、存储、内存等,安全性不高;虚拟机沙盒隔离环境,代码编译成字节码,虚拟机解释执行,执行速度受到一定影响,但安全性得到提升,目前虚拟机方式对代码编写有要求,只有固定的函数调用,想要实现图灵完备复杂。容器技术,将智能合约放入容器隔离环境,合约代码任意定义,对于业务逻辑编写更加友好,缺点也比较明显,需要维护合约容器与主程序之间的连接,如果采用rpc通信,数据传输也要花费一部分时间,如果采用本地sock文件,效率还好。
vm-docker-go 是长安链推出的合约引擎的一种,笔者还是把他归类于容器技术
,为什么这么归类,一会我们一起来看。
namespace是Linux内核用来隔离内核资源的方式。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。简单来说,通过namespace隔离出来的进程不知道其他进程的存在,该进程可以随意操作系统资源,而其他namespace下的进程不受任何影响,无任何感知。
隔离能力如下:
其中对CPU、内存等资源隔离通过Cgroup来实现,关于Cgroups的介绍戳这里,不再赘述。
RunC 是一个轻量级的工具,它是用来运行容器的,通过OCI标准来创建、运行容器,Docker通过containerd调用RunC进行容器创建、停止、销毁等。RunC怎么使用戳这里。
RunC是用golang语言开发,代码阅读复杂度不高,有兴趣的可以看看代码。
1)外部需要提供一个文件系统,也就是docker layer层数据,通过docker inspect xxx镜像
可以看到。
2)RunC fork一个进程,叠加Namespace限制并使用Cgroup进行资源隔离。
3)外部传递参数,写入网卡信息等。
4)生成的进程称之为容器
,RunC对容器生命周期进行管理。
RunC详细工作原理:https://www.jianshu.com/p/abfd3a470473
该项目长安链的研发团队还在高速迭代,作者在官网还没有搜索到相关的信息,架构图只能自己画,不能偷懒了。
vm-docker-go 主要工作将交易发送至合约,执行合约逻辑。
合约
:合约逻辑代码,创建后与vm-docker-go维护steam流通信。
process
:fork合约进程,将接收到的交易发送至合约
processBalance
:process
管理者,动态创建process
看完架构图,有哪些疑问?
如果已经创建的合约进程超过maxProcess
,则不再创建process
,交易进入队列等待。
发送至合约的交易执行超时,kill process;当前队列无交易,kill process,实现process动态增删。
process与合约通过Unix domain socket通信,Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,Unix domain socket介绍。
合约通过contract-sdk-go
创建客户端,与process进行steam
流建立、数据交互。fabric与之对应的模块叫做shim
。
合约与外界通信内容包括(版本在迭代,稳定后在详细说明):
1)外部发起交易请求-交易信息。
2)合约发起请求-合约执行状态查询、地址查询、其他合约调用等。
思考:
process能否使用RunC进行替换?
- process fork合约进程的思路,与RunC是一致的,但RunC需要提前准备好文件系统,但RunC经过Docker的实践检验,安全性、稳定性比较高。
- 长安链研发同学也提到性能问题,使用RunC确实比较重,性能如何需要测试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。