区块链 以太坊 区块结构详解

2024-09-03 09:32
文章标签 详解 区块 结构 以太

本文主要是介绍区块链 以太坊 区块结构详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

一、结构

区块由两部分组成,分别是

  • 区块头(header)
  • 区块体(body)

1. 结构图

preview

 

 

 

2. 区块头(header)

区块头存储了区块的元信息,用来对区块内容进行一些标识,校验,说明等。

通用字段

  • ParentHash: 父区块的哈希值。
  • Root:世界状态的哈希,stateDB的RLP编码后的哈希值。
  • TxHash(transaction root hash):交易字典树的根哈希,由本区块所有交易的交易哈希算出。
  • ReceptHash:收据树的哈希。
  • Time:区块产生出来的Unix时间戳。
  • Number:区块号。
  • Bloom:布隆过滤器,快速定位日志是否在这个区块中。

公链场景

  • Coinbase:挖出这个块的矿工地址,因为挖出块所奖励的ETH就会发放到这个地址。
  • Difficulty:当前工作量证明(Pow)算法的复杂度。
  • GasLimit: 每个区块Gas的消耗上线。
  • GasUsed:当前区块所有交易使用的Gas之和。
  • MixDigest: 挖矿得到的Pow算法证明的摘要,也就是挖矿的工作量证明。
  • nonce:挖矿找到的满足条件的值。
  • Uncle:叔块是和以太坊的共识算法相关。

 

3. 区块体(Body)

区块体包括这个区块打包的所有交易,在一些链的设计中,并不像以太坊区分header和body,而是整合在一起。

 

二、区块存储

以太坊在存储区块的时候,区块头和区块体其实是分开存储的,其实也很容易理解,分开存储可以提供更多的灵活性,比如不用保存全部区块数据的轻节点。

1. 区块头存储

以太坊通过如下方式将区块头转换成键值对存储在LevelDB中;

headerPrefix + num + hash  -> rlp(header)
Tips: num是以大端序的形式转换成bytes的,其中headerPrefix的值是 []byte("h")


2. 区块体存储

区块体的存储方式也是类似;

bodyPrefix + num + hash -> rlp(block)
Tips: num是以大端序的形式转换成bytes的,其中bodyPrefix的值是[]byte("b")

 

3. 潜在问题

假设在一个联盟链的场景下,采用了BFT类的算法,有一个重量级的业务跑在上面,日积月累产生了大量的数据,是否会出现

  • LevelDB的读写性能大幅下降拖慢系统的响应速度?
  • 单机存储无法满足需要?
  • 存储了大量的不会使用的历史数据?

 

在联盟链的场景下,由于共识速度的提升,导致出块速度也大幅提升,原本在公链场景下不存在的区块写入瓶颈,现在反而成了拖慢系统运行速度的重要因素了。

观察一下区块数据的存储就可以发现下面的这些特点;

  • 区块数据只会增加;
  • 无需对历史区块进行修改;
  • 无需对区块数据进行复杂操作,比如聚合,运算等;

归纳一下就是

  • 顺序写
  • 随机读
  • 迭代(Iterator)

 

针对这些特点Hyperledger Fabric设计了基于文件的存储方式,在Fabric中区块数据是以一个个文件的形式存在。

chains|----mychannel|----|----blockfile_000000
index|----000001.log|----CURRENT|----LOCK|----LOG|----MANIFEST-000000

其中blockfile_000000是区块数据,index则是索引游标等元信息。

这种方式速度很快,方便做数据归档,也可以避免像LevelDB等数据库数据越写越慢的问题,主流联盟链都是采用类似的方案。

 

 

 

区块详解:

https://blog.csdn.net/weixin_41806245/article/details/80899500

 

以太坊解析:默克尔树、世界状态、交易及其他

https://www.cnblogs.com/ccbupt/p/11468791.html

 

内容来自

以太坊区块结构

https://zhuanlan.zhihu.com/p/89698073

这篇关于区块链 以太坊 区块结构详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.