智能合约语言(eDSL)—— 并行化方案 2

2024-05-25 04:28

本文主要是介绍智能合约语言(eDSL)—— 并行化方案 2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        这个并行算法最初其实是在aptos上实现的,aptos上使用的是move虚拟机,后来我把它移植到我们链上了,但是wasm虚拟机。还是费了不少事情。

        目前evm并行也比较火,像monad,sei等。经过调研发现,其实evm的并行,还是occ的路子,和aptos的方案也差不多,都是在这之上进行各种优化,比较链结果和vm都不一样。所以现在又准备再次移植,把他移植到evm上,不过这次打算把并行做成一个通用的模块,这样不管你用的什么虚拟机,你的交易格式有啥不一样的,存储有啥区别的,简单的修改,就可以顺利的将并行模块加入到自己的链上,直接使用,不需要像我之前那么麻烦。

      为了做成通用的模型,所以我们先对虚拟机进行抽象。

虚拟机抽象

        在区块链中,所有的虚拟机都是类似的,用来执行合约,更新链上的状态;不论是move,wasm还是evm,都是一样的,是一个黑盒子。你输入交易,它返回读写集和结果;

        需要抽象的部分,虚拟机就是输入与输出,这一部分每个vm都是不一样的;所有的虚拟机,大概可以认为是输入交易以及链的上下文;输出就是交易的结果,包括是否成功,以及改变的状态。这些数据我们不会变化,为了规范,可能就是使用trait来进行定义。

        除了这些原始数据之外,还需要添加一个缓存模块,用来缓存整个区块处理过程中,所有交易涉及到的读写集;这个缓存模块下边会介绍到。

      另外vm还需要进行一些修改,VM在需要读写数据的时候,需要先读取缓存模块,如果没有再从数据中读取,写入数据也是先写入缓存模块,等整个块都处理完了,没有问题,才写入数据库。

缓存模型

全局缓存

多版本存储

        并行处理区块交易的过程中,每一笔交易,每一次执行(incarnation),写入的数据集合。每一笔交易,每一次执行(incarnation),的读取也是优先从这里读取。相当于保存了当前链世界状态的一个子集,由于处理过程中,有验证阶段,可能会导致某些交易多次执行,所以在未处理完区块之前,数据还是不稳定的。

数据结构如下:

key:map<txid,map<incarnation , value>>

块交易读写集

块中所有的交易的读写集数组,每个交易都会分开记录,用于验证。

局部缓存

交易读集合

每一笔交易,读集合;

交易写集合

每一笔交易,写集合,交易处理完成之后,会更新到全局缓存之中,等整个区块处理完成之后,在写入数据库中。

为什么需要缓存

        为什么需要它,这就和我们并行处理的调度有关系了,当我们并行的处理一个块的交易时,这些交易就是一个整体,他们既有独立的部分,又有关联的部分;独立的部分就是每个交易需要处理的内容不一样,有的可能是nft,有的可能是质押,或者dex等;但是所有的交易都需要修改世界状态,而且还会因为修改世界状态的先后,产生依赖关系,需要我们就需要记录每笔交易的与世界状态交互的记录,以此作为依据,及时的调整我们的调度策略。

这篇关于智能合约语言(eDSL)—— 并行化方案 2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1000479

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr