区块链数据的存储和更新

2023-11-20

1、引言

在第一篇文章里我们从静态的角度讲解了以太坊的数据的组织形式。这一篇文章里,我们从动态的角度出发,以cpp-ethereum v130为例分析以太坊全节点中,区块链数据在各个环节是怎么加载、更新、回滚、保存。

2、主要流程

进行相关操作的类主要包括以下几个:
BlockChain:区块链数据的类
Block:块数据类
BlockHeader:块头信息类
State:状态信息的类,每个Block实例包含一个State成员变量
Client:类响应RPC调用,管理交易、块的接受和处理
区块链数据的更新
以太坊采用LevelDB作为底层数据库,它是一个google实现的非常高效的kv数据库。key和value均为任意长度的字节数组。数据库提供了基本的接口操作包括Put()、Delete()、Get()、Batch(),支持批量操作的原子性。
编码方式采用了RLP,RLP(Recursive Length Prefix,递归长度前缀)是一种编码算法,用于编码任意的嵌套结构的二进制数据,它是以太坊中数据序列化/反序列化的主要方法,区块、交易等数据结构在持久化时会先经过RLP编码后再存储到数据库中。 下面介绍主要的数据存储和操作流程

2.1数据库读取

BlockChain和Client类在初始化时候,总计会打开三个LevelDB的数据库连接:

blocksDB:保存了块的主体内容,包括块头和交易。
stateDB:保存了账户的状态数据。
extrasDB:保存了收据信息和其它辅助信息。
客户端运行过程中可能需要加载块数据或者读取账户信息。具体过程如下:

2.1.1 从数据库加载块数据

Client类初始化时候,并不会把所有的块数据加载到内存中,而是在运行过程中按需加载。当需要根据块号去生成对应块时候,流程如下:

从extraDB里,以块号为key读取到块哈希值
调用Block类的提供了一个同步方法(sync(BlockChain,h256)),以块哈希为key,读取到rlp编码后的区块数据。在这个过程中,会对查询结果进行缓存,这样第二次便不必去数据库里读取。
解码区块数据,按照设定的规则可以依次读取父块哈希、叔块哈希、作者地址、状态树根哈希、交易树根哈希、收据树根哈希、块内交易等各种内容,以此来填充Block对应字段。

2.1.2从数据库读取账户信息

账户信息包括该地址对应的余额、存储、Nonce和字节码的哈希值。为了读取某个块下的账户信息,我们首先要执行上一步,取得块数据树的状态根哈希。
这颗MPT状态树与普通树的一个区别是:父节点保存了子节点的哈希值,而非指向子节点的指针。每个节点的哈希值为key,节点内容rlp编码后的字符串为value,通过stateDB保存到了LevelDB里。这样整个树都保存在了本地数据库中。
我们根据块中的树根哈希,在树中查找到编码后的账户信息,解析得到需要的字段。

2.2 区块链数据更新与回滚

2.2.1 交易数据

Client类可以自己创建或者从p2p网络接收到各种交易。这些交易在验证之后,会在未被确认的块中(也就是pending块)进行插入、执行和打包。Client类创建了m_preSeal,m_postSeal,m_working三个块,在多线程的条件下合作完成这个流程。后面会有专门篇幅来讲解。我们这里关注数据的更新。
State类里有两个关键的成员变量: 1.m_state 维护了上面提到的MPT树,支持树的各种插入更新操作。并支持在数据真正向数据库提交前的缓存 2.m_cache 通过两个unordered_map(支持不同key)提供了key-value缓存功能,用于缓存交易改变的账户数据
当交易被插入块中,首先会被存储在块实例的一个Vector容器里。在这些交易执行时候,会影响到一些账户的状态,这些新值首先会被写入State实例的成员变量m_cache里。在执行一个可能发生回滚的交易前,m_cache会被复制一份。假如交易需要回滚,那么m_cache会被重新赋值回去,然后执行下一个交易。
所有的交易被执行过,可以正常打包。那么m_cache里的内容会被State的commit函数插入到m_state这个成员变量的缓存中。每次插入状态树可以计算一个根哈希值,而所有的交易都执行过之后交易树和收据树也可以计算出根哈希,这就是前边提到的区块头的三个字段。
在这里插入图片描述

2.2.2 块数据

当本地客户端成功的挖出一个块,或者通过p2p网络收到其它客户端发来的块后。本地客户端会再次执行块内所有的交易,所有交易执行成功后,和上面提到的一样,被影响的数据会被从m_cache插入到到m_state中的缓存。
接下来会进行父哈希、Gas等多种验证,任何一项不通过的话,都会触发m_state清空缓存。

在这里插入图片描述
区块链数据保存
在上面的环节中,如果块数据最终通过了验证,是一个有效的块。BlockChain会调用m_state中db的commit操作,将缓存的状态通过写入本地数据库。
然后把块数据通过blocksDB写入本地数据库。
最后把收据、最新区块号等信息通过extraDB写入本地数据库。这样区块链数据就被保存到了本地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链数据的存储和更新 的相关文章

  • 基本逻辑运算

    目录 1 与 2 或 3 非 4 与非 5 或非 6 异或 7 同或 1 与 输入有零 输出为0 输入全1 输出才1 1 逻辑表达式 L A B
  • windows下安装ElasticSearch的Head插件

    es5以上版本安装head需要安装node和grunt 1 从https nodejs org en download 下载相应系统的msi 双击安装 2 安装完成用cmd进入安装目录执行 node v 可查看版本号 3 执行 npm in
  • github搭建个人博客报错分析及用法总结

    注册可以参考csdn中关于注册的相关博客 这里我想说的是 当重复注册 出现github账号被标记的情况 或者操作失误所产生的不能搭建个人博客的问题 遇到这种问题 直接联系管理员就好 一封礼貌的email就可以解决问题 1 每个人只能注册一个
  • C/C++实现输入终止则循环结束

    C while scanf d n EOF C while cin gt gt N

随机推荐

  • 【Windows】局域网内共享文件夹的设置方法

    引言 Windows 系统自带有文件共享功能 可实现局域网内简单的协同办公 本文简单介绍一下该功能该如何使用 需求 假设这里有两台在同一局域网的电脑 设备别名分别定义为 pc1 和 pc2 现在 pc1 桌面上建立一个名为 public 的
  • Street Workout

    sw网站 网站简介 很早就有了这个想法 但是无奈一直没有去做 终于到了这个寒假 2019 2020上 开始编码了 作为自己第一个单独开发的网站 经过了十多天的堆码 终于完成了大概的框架 虽然没有什么浏览量但是还是挺开心的 话不多说 放图 多
  • java获取指定时间前N天和后N天

    获取指定时间前N天后N天 Test public void getLastDay String time public void getLastDay SimpleDateFormat sdf new SimpleDateFormat yy
  • iPhone上查询UDID

    查找设备的 UDID 有多种方式 可以通过 iTunes 或 Finder 查找 也可以通过 Xcode 查找 这里介绍一种在线通过 iPhone 或 iPad 直接查找 UDID 的方法 1 在 iOS 设备上打开 Safari 浏览器
  • 华为OD机试 - 食堂供餐(Java)

    题目描述 某公司员工食堂以盒饭方式供餐 为将员工取餐排队时间降低为0 食堂的供餐速度必须要足够快 现在需要根据以往员工取餐的统计信息 计算出一个刚好能达成排队时间为0的最低供餐速度 即 食堂在每个单位时间内必须至少做出多少价盒饭才能满足要求
  • H5微信分享记录

    最近做H5微信分享 用的微信jssdk来做 现记录下一些过程和遇到的问题 一 公众号配置 微信官方文档 已经说明了使用步骤 公众号配置比较模糊 主要是要配置ip白名单和绑定js接口安全域名 1 检查分享接口权限是否已获得 在微信公众号的 设
  • 考虑载波和采样频率的2PSK调制 MATLAB仿真

    功能 生成psk调制信号 创建日期 2016 7 27 创建人 Alice 764499604 qq com clear all close all clc max 100 g zeros 1 max g randint 1 max 长度为
  • CentOS 7 安装 Python 3

    文章目录 前言 操作系统说明 在线安装 离线安装 环境 组件说明 组件用途说明 安装步骤 详细步骤 准备安装 搜集 下载 安装依赖 安装 Python 安装 virtualenv 异常处理 异常信息 原因分析 处理方法 小技巧 前言 推荐在
  • 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 HTML5期末大作业 (1)

    HTML5期末大作业 动漫电影主题 电影动漫言叶之庭 4页 带音乐 HTML CSS JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 大学生毕设网页设计源码HTML 1 临近期末 你还在为H
  • element 中 datepicker设置,只能选中今天以及之前日期

    1 只能选择当前及以后的日期
  • 六,RBAC简介

    六 RBAC RBAC 基于角色的权限控制 role base access control 是一种设计模式 是用来设计和管理权限相关数据的一种模型 RBAC权限数据的管理 都是重复的CRUD的操作 这里我们就不再重复的从0到1开发 我们只
  • 在预训练时使用Warm Up的理解以及loss plateau。

    在预训练时使用Warm Up的理解 之前在wikitext 103上预训练Bert base的时候 发现loss曲线会平一段然后再下降 大概是像下图这样 横轴是step 纵轴是loss 当时的warm up是前16K step 一直以为第二
  • Python3 pip

    Python3 中的 pip 是一个常用的包管理工具 它可以用来下载 安装和卸载 Python 包 以下是一些常用的 pip 命令 1 安装包 pip install package name 例如 要安装 Flask 框架 可以使用命令
  • C++中vector删除指定位置的元素

    1 可以用erase方法删除vector指定位置的元素 2 例程 include
  • IAR 编译异常记录

    问题一 问题描述 WARNING the connected j link is defective proper operation cannot be guaranteed 连接的J Link不良 无法保证正确操作 问题原因 驱动版本与
  • 138-139-----JS基础-----二级菜单-完成基本功能、过渡效果

    一 代码 这两节的代码还是有点的难度的 有这样的需求时 按照类似的接口去做即可 不一定要和他的需求完全一样 因为我看他的需求好像点开另一个 已经打开的选项会被自动关闭 这样感觉不好 因为可能用户有时想要看到所有的选项的要求
  • 五大学科竞赛(五)2018年第二十四届全国青少年信息学奥林匹克联赛初赛

  • 音频增加噪声低通滤波降噪的过程

    啊 clear all close all clc s Fsample B wavread music wav Ts 1 Fsample M length s 获取音频的数据长度 m 0 M 1 figure subplot 3 1 1 p
  • 微服务框架

    微服务框架 1 SOA思想 面向服务的架构 SOA 是一个组件模型 它将应用程序的不同功能单元 称为服务 进行拆分 并通过这些服务之间定义良好的接口和协议联系起来 接口是采用中立的方式进行定义的 它应该独立于实现服务的硬件平台 操作系统和编
  • 区块链数据的存储和更新

    目录 1 引言 2 主要流程 2 1数据库读取 2 1 1 从数据库加载块数据 2 1 2从数据库读取账户信息 2 2 区块链数据更新与回滚 2 2 1 交易数据 2 2 2 块数据 1 引言 在第一篇文章里我们从静态的角度讲解了以太坊的数