长安链并行调度机制(2):DAG构建和从节点执行流程
长安链采用高效的并行调度方式执行交易,了解长安链交易调度、冲突检测和DAG构建流程有助于开发者更好地理解长安链并行调度的运行机制,帮助开发者编写高质量、低冲突的智能合约,更好地构建区块链应用。
上一篇内容我们说明了长安链交易调度、冲突检测流程,本篇内容我们将进一步介绍长安链中DAG构建和从节点执行流程。
一、 概述
前一篇文章介绍了长安链中交易调度和交易冲突检测的流程及机制,确保主节点对所有交易的执行结果都是“正确的”。但是,在交易调度执行过程中,有一些交易是有前后依赖关系的,主节点需要告诉从节点,哪些交易需要按照主节点的执行顺序,等前置交易执行完后才能执行,哪些交易可以并行执行的,这些内容将在本文进行介绍,确保从节点按照主节点的执行顺序对交易进行执行,进而得到一致的世界状态。
二、 DAG构造流程
前一篇文章已经介绍了在交易并行调度和执行过程中,如何保障单笔交易能够正确执行。但是,通过主节点交易冲突检测后,交易的执行顺序将会形成依赖,如前一篇文章中例子所示,tx1经过调度后需要在tx0后面执行。
因此,为了保证其他从节点也能按照同样的顺序对区块中的交易进行执行,最终各个节点形成一致的世界状态,就需要主节点根据交易的读写集为区块中的交易构建DAG(有向无环图),并将DAG放入区块中,等其他从节点收到区块后,直接按照区块中的DAG对交易进行执行,从而保障各个节点对交易执行的有序性。

图2.1 调度后的交易顺序
我们假设主节点调度执行完后,Snapshot的ExecutedTxs中交易的顺序按照上图所示,依次为tx0,tx1,tx2和tx3,下面我们将基于上面这个例子介绍构建DAG的具体流程。
1. 构建读集写集字典、读集写集位置索引

图2.2 按照上述四笔交易构建的读写集字典和读写集位置索引
先介绍这四个结构的含义:
读集字段和写集字典:数据结构是个字典,即map。
● 字典中的键是交易读集或写集中的key;
● 字典中的值是交易编号,这个编号指的是在ExecutedTxs中的索引,从0开始,即0表示tx0,1表示tx1,2表示tx2,3表示tx3;
● 整个字典的含义是这个key被那些交易读或者写了;
读集位置索引和写集位置索引:数据结构是个二维数组。
● 二维数组中行头表示的是交易索引,列头表示的是整个区块中的交易读写或者写集的key;
● 二位数组中的值是在这笔交易之前,读集字典或者写集字典中有前几笔交易引用了该key;
● 二维数组的含义表示的是某笔交易中的key,被读集字典或者写集字典中前几笔交易读过或者写过;
具体构造流程:
按照ExecutedTxs中tx0,tx1,tx2和tx3中的交易顺序,分别根据每笔交易的读写集信息计算上述四个结构中的值。
对读集的处理方式:
1. 先填写readPos,根据readDict判断是否之前有交易的读集引用过该key,如果有则将readDict此key对应的元素个数len写入readPos对应的位置;
2. 再填写writePos,根据writeDict判断是否之前有交易的写集引用过该key,如果有则将writeDict此key对应的元素个数len写入writePos对应的位置;
3. 将此交易索引写入readDict中对应的key处;
对写集的处理方式:
1. 先填写writePos,根据writeDict判断是否之前有交易的写集引用过该key,如果有则将writeDict此key对应的元素个数len写入writePos对应的位置;
2. 再填写readPos,根据readDict判断是否之前有交易的读集引用过该key,如果有则将readDict此key对应的元素个数len写入readPos对应的位置;
3. 将此交易索引写入writeDict中对应的key处;
以其中的tx0和tx1为例,将相关信息填入上述四个结构中的图例如下所示,先填写tx0的信息,再继续填写tx1的信息。

图2.3 tx0的读写集填入上述四个结构流程图

图2.4 tx1的读写集填入上述四个结构流程图
大家感兴趣的话,可以在图2.4基础上继续将tx2和tx3的读写集信息填入上述四个结构,最终将会得到图2.2。填写好构建DAG的物料图后,我们将开始实际构建DAG。
2、 构建DAG

图 2.5 DAG构建流程图
同理,先介绍三个结构的含义:
DAG:数据结构是个字典,即map。
● 字典中的键表示的是交易编号,代表的是交易,这个编号同样指的是在ExecutedTxs中的索引,从0开始,即0表示tx0,1表示tx1,2表示tx2,3表示tx3;
● 字典中的值是交易编号;
● 整个字典的含义是这个这笔交易与哪些交易冲突,只有那些冲突交易都执行完了,这笔交易才能够执行;
累计冲突位图和直接冲突位图:数据结构是个位图,每一个交易都会构建一个累积冲突位图和直接冲突位图
● 累计冲突位图表示的是与本交易累计冲突的交易,累计冲突位图的作用是如果某笔交易B与交易A存在读写和写写冲突,那么交易B将与所有索引在交易A之前且和交易A存在写写冲突的交易都存在冲突,那这样只需要标识出交易B与交易A存在读写冲突即可,注意此处主要利用了写写交易之间本身存在冲突的特性,对于写读冲突则需要全量检测,因为读读交易不存在冲突,但是这些读交易与此笔写交易都存在冲突;
● 直接冲突位图表示的是与本交易直接冲突的交易,用于计算DAG中的字典值;
具体构造流程:
按照ExecutedTxs中tx0,tx1,tx2和tx3中的交易顺序,根据上一步骤构建的图3.2中读集字典、写集字典、读集位置索引和写集位置索引四个结构,通过位图高效地检索出来哪些交易是与该交易是冲突的。
对读集的处理方式:
只需要判断读写冲突,因为读读不存在冲突。
1. 先看读集的key在writeDict中是否被其他交易进行了写操作,如果有的话,则通过writePos明确出来有哪些交易(假设是txn-1, txn, txn+1)在这笔交易之前写过这个key,那些交易都与此交易存在读写冲突;
2. 因为与本交易存在读写冲突的txn-1, txn, txn+1这几笔交易本身存在写写冲突,所以只需要将对应的最后一笔 txn+1的累计冲突位图加入本交易的累计冲突位图,将txn+1这笔交易加入本交易的直接冲突位图即可。因为标识出本交易与txn+1冲突后,本质上也标识出了与txn-1, txn同样存在冲突;
对写集的处理方式:
需要判断写写冲突和写读冲突。
1. 先判断写写冲突,看写集中的key在writeDict中是否被其他交易进行了写操作,如果有的话,则通过writePos明确出来有哪些交易(假设是txn-1, txn, txn+1)在这笔交易之前写过这个key;
2. 同上述读写冲突检测方式一样,因为txn-1, txn, txn+1之间本身存在写写冲突,只需要将对应的最后一笔 txn+1的累计冲突位图加入本交易的累计冲突位图,将txn+1这笔交易加入本交易的直接冲突位图即可;
3. 再判断写读冲突,看写集中的key在readDict中是否被其他交易进行了读操作,如果有的话,则通过readPos明确出来有哪些交易(假设是txn-1, txn, txn+1)在这笔交易之前读过这个key;
4. 这里因为readPos中反应出来的是在这笔交易之前,对此key进行过读的交易,而这些读的交易之间不存在冲突,所以需要将txn-1, txn, txn+1三个交易各自的累计冲突位图加入到本交易的累计冲突位图,将txn-1, txn, txn+1三笔交易加入本交易的直接冲突位图;
最后,对这笔交易的读集和写集都进行处理后,根据直接冲突位图,计算出这笔交易在DAG中对应的冲突交易即可。
下面,以其中的tx0和tx1为例,将相关信息填入上述三个结构中的图例如下所示,先填写tx0的信息,再继续填写tx1的信息。

图 2.6 tx0的DAG计算流程图

图 2.7 tx1的DAG计算流程图
其他另外两笔交易可以按照上述逻辑自行计算其DAG的值,最终将会得到图2.5中的结果。
三、 DAG顺序执行流程
从节点收到区块后,直接按照区块中DAG描述的顺序,对交易执行即可,其执行结果和主节点的执行结果一定是一致的。
具体执行流程是:
● 并行执行不依赖其他交易的交易;
● 其他交易pop掉已经被执行的交易,如交易不再依赖其他交易即可执行;
● 直到所有交易均执行完即可;

图 3.1 从节点交易执行流程
上述例子中,初始tx0不依赖其他交易,可以直接执行;
随后,tx1和tx3 pop掉对tx0的依赖后,tx1可以继续执行;
最后,tx2和tx3 pop掉对tx1的依赖后,tx2和tx3可以并行执行。
四、 延伸思考
我们知道主节点在执行交易时,是调度+执行(先不算DAG构建时间,并且假设n笔交易并行执行是串行执行时间的1/n),从节点只需要按照DAG中的顺序对交易执行即可。那什么情况下从节点单独执行的时间会比主节点调度+执行的时间还长?
答案:写写冲突场景下,主节点并行执行,从节点串行执行。
相关文章:
长安链并行调度机制(2):DAG构建和从节点执行流程
长安链采用高效的并行调度方式执行交易,了解长安链交易调度、冲突检测和DAG构建流程有助于开发者更好地理解长安链并行调度的运行机制,帮助开发者编写高质量、低冲突的智能合约,更好地构建区块链应用。 上一篇内容我们说明了长安链交易调度、…...
leetcode做题笔记110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路一:递归 int height(struct TreeNode* root) {if (root NULL) {return…...
iOS开发Swift-字符串与字符
1.字符串的定义 let someString "some string value"2.多行字符串的定义(""") let quotation """ 有一个人前来买瓜。 "这瓜甜吗?"他问。 """前一个"""前和后一个""&…...
Linux Kernel:syscall之fork与exec
环境: Kernel Version:Linux-5.10 ARCH:ARM64 一:前言 上一节我们提到了进程的产生方式fork,exec与clone,本节将详细分析fork和exec族系统调用的具体实现。通常这些调用不是由应用程序直接发出的,而是通过一个中间层调用,即负责与内核通信的C标准库。从用户状态切换到…...
CentOS 修改MySQL密码
CentOS 修改MySQL密码 1.登录MySQL 2.执行如下命令 update user set passwordpassword(mivbAs7Awc) where userroot;报错如下: Unknown column ‘password’ in ‘field list’ 3.执行如下命令 update user set passwordpassword(mivbAs7Awc) where userroot碰到…...
Android通过setaffinity实现绑核
有时候为了降低App算力占用,会把关键的线程绑定到大核中,下面介绍一种绑核的方式 查看绑核 查看pid :/ # ps -A | grep test u0_a15 25178 405 15950272 176544 do_epoll_wait 0 S com.test.jnites查看线程号 top -H -p 25178 25224 u0_…...
stm32的位带操作
在51单片机中,我们可以使用P2^1来对单片机的某一位进行操作,到了stm32,我们通过位带操作,将寄存器的每一位映射到一个32位的地址。如下是我查资料摘录的一些图片。 映射方式 SRAM: AliasAddr 0x22000000 (A-0X20000000)*8*4n*4…...
Java 电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展
营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标…...
https协议经过SpringMVC重定向之后变成http协议
之前项目的协议还是http,当改为https之后,就出现了这个问题。 服务访问地址:https://wuxinke.demo.com 访问某个页面的地址:https://wuxinke.demo.com/aps/judgeProviderOrCtenant.ht 经SpringMVC重定向之后,地址变…...
iOS 分别对一张图的局部进行磨砂,拼接起来不能贴合
效果图 需求,由于视图层级的原因,需要对图片分开进行磨砂, 然后组合在一起 如图,上下两部分,上下两个UIImageVIew大小相同,都是和图片同样的大小,只是上面的UIimageVIew 只展示上半部份 &#…...
与面试官互动:建立积极的技术讨论氛围
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
计算机竞赛 基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习
文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 🔥 优质竞赛项目系列…...
完美解决Ubuntu网络故障,连接异常,IP地址一直显示127.0.0.1
终端输入ifconfig显示虚拟机IP地址为127.0.0.1,具体输出内容如下: wxyubuntu:~$ ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen …...
手机无人直播软件有哪些,又有哪些优势?
如今,随着智能手机的普及和移动互联网的发展,手机无人直播成为了一个炙手可热的领域。手机无人直播软件为用户提供了便捷、灵活的直播方式,让更多商家人能够实现自己的直播带货的梦想。接下来,我们将探讨手机无人直播软件有哪些&a…...
解密算法与数据结构面试:程序员如何应对挑战
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
分布式事务7种(秒懂-2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通)
参考文章: 七种常见分布式事务详解(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)_张维鹏的博客-CSDN博客 分布式事务 (秒懂)_40岁资深老架构师尼恩的博客-CSDN博客 分布式事务:在分布式…...
基于Java+SpringBoot+Vue前后端分离美食推荐商城设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
最新ChatGPT程序源码+AI系统+详细图文搭建教程/支持GPT4/AI绘画/H5端/完整Prompt知识库
一、AI系统 如何搭建部署人工智能源码、AI创作系统、ChatGPT系统呢?小编这里写一个详细图文教程吧!SparkAi使用Nestjs和Vue3框架技术,持续集成AI能力到AIGC系统! 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Mi…...
本地启动若依微服务版本
前置工作: 1.导入sql文件 2.安装完nacos 3.安装完redis 启动步骤: 1.开启nacos,在bin目录下 startup.cmd -m standalone 注意:在这之前要配置nacos持久化,修改conf/application.properties文件,增加支持…...
HTML的span标签的作用是什么?答:对文本内容进行精细的样式化和标记。
当谈到HTML中的<span>标签时,它是一个非常基本且灵活的内联元素。它通常用于在文本中应用样式、添加额外的语义或将特定部分标记为一个单独的区域。<span>标签本身并不会给其中的内容带来任何视觉上的变化,但它可以与CSS一起使用,…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
