当前位置: 首页 > news >正文

长安链源码学习 vm-docker-go

现有区块链系统合约运行环境有三种,Native本地调用、虚拟机(字节码解析)、容器技术。Native执行速度快,但与主程序在一个进程,共用网络栈、IPC、存储、内存等,安全性不高;虚拟机沙盒隔离环境,代码编译成字节码,虚拟机解释执行,执行速度受到一定影响,但安全性得到提升,目前虚拟机方式对代码编写有要求,只有固定的函数调用,想要实现图灵完备复杂。容器技术,将智能合约放入容器隔离环境,合约代码任意定义,对于业务逻辑编写更加友好,缺点也比较明显,需要维护合约容器与主程序之间的连接,如果采用rpc通信,数据传输也要花费一部分时间,如果采用本地sock文件,效率还好。

vm-docker-go 是长安链推出的合约引擎的一种,笔者还是把他归类于容器技术,为什么这么归类,一会我们一起来看。

一、背景知识

1. namespace

namespace是Linux内核用来隔离内核资源的方式。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。简单来说,通过namespace隔离出来的进程不知道其他进程的存在,该进程可以随意操作系统资源,而其他namespace下的进程不受任何影响,无任何感知。

隔离能力如下:
在这里插入图片描述
其中对CPU、内存等资源隔离通过Cgroup来实现,关于Cgroups的介绍戳这里,不再赘述。

2. RunC

RunC 是一个轻量级的工具,它是用来运行容器的,通过OCI标准来创建、运行容器,Docker通过containerd调用RunC进行容器创建、停止、销毁等。RunC怎么使用戳这里。
RunC是用golang语言开发,代码阅读复杂度不高,有兴趣的可以看看代码。

RunC简单原理:

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 主要工作将交易发送至合约,执行合约逻辑。
合约:合约逻辑代码,创建后与vm-docker-go维护steam流通信。
process:fork合约进程,将接收到的交易发送至合约
processBalanceprocess管理者,动态创建process
在这里插入图片描述
看完架构图,有哪些疑问?

1. 并发100笔交易,会fork出多少合约进程?

如果已经创建的合约进程超过maxProcess,则不再创建process,交易进入队列等待。
在这里插入图片描述

2.交易并发下降,fork的合约进程如何回收?

发送至合约的交易执行超时,kill process;当前队列无交易,kill process,实现process动态增删。

3.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进行替换?

  1. process fork合约进程的思路,与RunC是一致的,但RunC需要提前准备好文件系统,但RunC经过Docker的实践检验,安全性、稳定性比较高。
  2. 长安链研发同学也提到性能问题,使用RunC确实比较重,性能如何需要测试。

参考:
https://www.cnblogs.com/sparkdev/p/9365405.html

相关文章:

  • 网课题库接口API—小白专用版本
  • STM32单片机的 Hard-Fault 硬件错误问题追踪与分析
  • 【精品】SpringBoot中整合Redis的简单封装及应用
  • C++ STL --- list的使用
  • 聚焦金融行业未来,博睿数据亮相第五届中国银行CIO峰会
  • 57.【Java 接口】
  • 【SCI期刊调研】
  • 【Dart 入门教程】(一) Dart 简介与安装
  • 十堰小程序开发,免费试用60天
  • 20220923_数据库过程_直销员计算语句
  • Mybatis知识总结一
  • 基于springboot校园疫情防控系统
  • mysql基于WebStorm服装购物网站的设计与实现毕业设计源码281444
  • 最长上升子序列(LIS)
  • 随州小程序开发,免费试用60天
  • 3.7、@ResponseBody 和 @RestController
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • centos安装java运行环境jdk+tomcat
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Javascript Math对象和Date对象常用方法详解
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Linux下的乱码问题
  • opencv python Meanshift 和 Camshift
  • PV统计优化设计
  • vue自定义指令实现v-tap插件
  • 基于 Babel 的 npm 包最小化设置
  • 手机端车牌号码键盘的vue组件
  • 无服务器化是企业 IT 架构的未来吗?
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • !!Dom4j 学习笔记
  • #{} 和 ${}区别
  • #162 (Div. 2)
  • #NOIP 2014# day.1 T2 联合权值
  • #QT(智能家居界面-界面切换)
  • #宝哥教你#查看jquery绑定的事件函数
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)字符分类函数
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)项目管理杂谈-我所期望的新人
  • .NET 中的轻量级线程安全
  • .Net多线程总结
  • .net流程开发平台的一些难点(1)
  • .ui文件相关
  • @Autowired标签与 @Resource标签 的区别
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [Django开源学习 1]django-vue-admin