以太坊的数据结构
链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
以太坊被描述为为一个交易驱动的状态机,它在某个状态下接受一些输入后,会确定的转移到一个新的状态。具体来说,在一个以太坊的状态下,每个账户上有确定的余额和存储信息,当接收到一组交易,被影响账户上的余额和存储信息会发生变动。从第一个创世块开始,不断的收到交易,由此能进入一连串新的状态。
1.jpg
以太坊每隔一段时间把交易数据和验证信息打包在一个块里,依次串接起来,就成为一个链。块越新,块号(BlockNumber,或叫块高度)便越大,每个块的块头(验证信息)里,保存了前一个块的块头哈希值(ParentHash,父块哈希)。这样区块链里的块就彼此联系了起来。假如我们更改了前间某个块的内容,后面块的父块哈希就和它对应不上,这种块就不被大家认可。这就保证了区块链数据的不可篡改性。
2.jpg
以太坊的块(Block)
每个块包含块头和交易,其中块头的结构如下图所示:
4.jpg
几个关键字段的含义如下:
ParentHash:父块的哈希值
Number:块编号
Timestamp:块产生的时间戳
GasUsed:交易消耗的Gas
GasLimit:Gas限制
Difficulty:POW的难度值
Beneficiary:块打包手续费的受益人,也称矿工
Nonce:一个随机数,使得块头哈希满足POW需求
账户发起交易需要花费一些gas,作为手续费归矿工所占有。在POW模式下,矿工在打包块的时候,需要不停的调整Nonce,使得整个块头的哈希值满足一定的条件(比如头几位都是0)。
StateRoot:状态树的根哈希值
TransactionsRoot:交易树的根哈希值
ReceiptsRoot:收据树的根哈希值
每个矿工在把交易打包成块的时候,会组织三颗树:
交易树,树叶里是交易
收据树,树叶里是交易生成的收据
状态树,树叶里是交易影响到的账户状态
三棵树求取根哈希,可以得到 区块头中的StateRoot,TransactionsRoot,ReceiptsRoot三个字段。这样就建立了交易和区块头字段的映射。当其他用户收到块,根据块里的交易可以计算出收据和状态,计算三个根哈希后和区块头的三个字段进行验证,判断这是否为合法的块。
5.jpg
其中交易树和收据树是Merkle树,如上图所示。状态树是Merkle Patricia Tree.
状态(State)
在上文中我们提到,以太坊是基于状态的。多个账户的状态共同组成了以太坊的全局状态。账户分为两种:
外部账户(Externally owned account),被私钥控制且没有任何代码与之关联。一个外部账户可以创建交易,来发送消息给另一个外部账户或合约账户,以此来触发转账交易和智能合约的调用、创建
合约账户(Contract account),被它们的合约代码控制且有代码与之关联。合约账户不可以自己发起一个交易,只能被外部账户调用。
6.jpg
每个账户包含了以下的字段:
Balance:该账户的余额
Nonce:该账户为外部账户时候,表示该账户创建的交易序号,每做一次交易都会加1。该账户为合约账户时候,表示该账户创建的合约序号,每创建一次会加1。
CodeHash:该账户为合约账户时候,表示合约的哈希值,否则为空字符串的哈希
StorageRoot:该账户的存储内容组成Merkle树后求得的根哈希值
7.jpg
多个块的MPT树共享了账户状态,子块状态树和父块状态树的差别在于它指向了在子区块中被改变了的账户。这样节省了总的存储空间,方便了块的回滚操作。
8.jpg
交易(Transaction)
外部账户可以创建交易,用自己的私钥进行签名之发送消息给另一个外部账户或合约账户。两个外部账户之间传送的消息即为转账操作。从外部账户到合约账户的消息会激活合约账户的代码,执行各种操作,也就是我们常说的调用智能合约。可以通过向0地址发起交易来创建合约账户。交易包含以下主要字段:
Type:交易的类型,ContractCreation(创建合约)还是MessageCall(调用合约或转账)
Nonce: 发送地址的交易计数
Value: 向目标账户发送的金额
ReceiveAddress:接受方地址
GasPrice:为交易付出的Gas价格
Gas:为交易付出的Gas
Data:交易的附加数据
VRS:交易签名结构体
收据(Receipt)
账户创建交易并向其它节点广播后,会被其它节点执行并放入准备打包的区块。在这个过程中会生成一个收据。收据的主要字段有:
blockHash: 交易所在块的哈希值
blockNumber: 交易在块的序号
transactionHash: 交易的哈希值
transactionIndex: 交易在块中的序号
from: 发送者地址
to: 接受者地址,为空时候表示创建合约
cumulativeGasUsed: 执行完此交易时候,块内消耗的总的gas值
gasUsed:本交易所消耗的gas
contractAddress: 当此交易为创建合约时,表示所创建合约的地址,否则为空
logs: 此交易的日志
相关文章:

(转载)虚幻引擎3--9掌握虚幻技术UnrealScript 预处理器
第九章 – UNREALSCRIPT预处理器9.1概述9.2 MACRO(宏)的基础知识指南 9.1 –您的第一个宏9.3具有参数的宏指南 9.2 – MACRO参数9.4内置宏DEFINE IF/ELSE/ENDIF 实例: IF/ELSE/ENDIF的应用 INCLUDE ISDEFINED/NOTDEFINED 示例: 结合使用 …

springboot添加多数据源连接池并配置Mybatis
springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018 星期六,那是个晴天,天湛蓝湛蓝的非常干净,仿佛飘过一粒尘埃也能看得清清楚楚,然后就发生…

lua菜鸟教程_Lua 环境安装
Lua 环境安装Linux 系统上安装Linux & Mac上安装 Lua 安装非常简单,只需要下载源码包并在终端解压编译即可,本文使用了5.3.0版本进行安装:curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gztar zxf lua-5.3.0.tar.gzcd lua-5.3.0make …

以太坊智能合约Demo
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例子深入浅出智…

Java学习笔记七——数组工具类Arrays
数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组。若将里面的方法用熟的话,那开发效率会大大提高。下面介绍其中的方法。 List<T> asList(T... a) 作用:将指定数组或数组元素,转换成固定大小的List。…

c++窗口管理系统是什么_优秀的食堂管理系统让你对校园生活更充满希望
面对今年疫情环境下的种种困难,各大高校纷纷根据情况采取不同的措施,应对开学的各种难题。解决返校学生就餐就是一大难点。学校后勤工作人员少之又少,开设的食堂窗口也供不应求。这也直接导致了后勤人员懒散,食堂阿姨给菜“手抖”…

ACM训练小结-2018年6月16日
今天题目情况如下:A题:线段树XOR性质。情况:由于写法问题,调试困难,浪费大量时间。B题:(对所有满足i mod pq,求a[i]之和),无修改,直接上n*sqrt(n)…

加密货币的本质
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 去年,比特币暴涨,其他币也像雨后春笋一样冒出来,已经有1000多种了。 很多人都在问,加密货币&#…

「2018山东一轮集训」 Tree
为什么出题人这么毒瘤啊??!!一个分块还要带log的题非要出成n<2*1e5。。。。。。。 为了卡过最后两个点我做了无数常数优化,包括但不限于:把所有线段树改成 存差分的树状数组;把树剖求LCA的极…

mysql 表空间收缩_mysql表碎片清理和表空间收缩
mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式)OPTIMIZETABLE [tablename],当然这种方式只适用于独立表空间清除碎片的优点:降低访问表时的IO,提高mysql性能,释放表空间降低磁盘空间使用率OPTIMIZE TABLE ipvacl…

spring security remember me实现自动登录
1 默认策略 在我们自定义的login中增加一个选择框 <input type"submit" value"Login" /> <br/> <br/> <input type"checkbox" valuetrue name"_spring_security_remember_me" />记住密码 <!-- 记住…

野指针与内存泄漏那些事
野指针:不是NULL指针,是指向垃圾内存的指针 野指针成因: 1.指针变量没有被初始化:指针变量在创建时同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 2.指针p被free或者delete,没有被设置为…

参数等效模型可以用于_等效媒质理论(介电参数反演)
听说过超材料的读者大概率会了解一个知识点,复杂的媒质块可以等效为一块平板,当然这是有条件的。比如模型小于十分之一波长之类的,尤其对模型厚度要求严格些。大家在查找等效媒质理论文献的时候,可能会被繁杂的理论解释弄得爆炸&a…

js日期格式化Date
使用Date类进行日期格式化。 1 输入“yyyy-MM-dd hh:mm:ss”格式的String字符串,返回字符串 做一个简单判定,在当日显示为几点几分,同年为月日,不同年显示年月 1 function dateFormat(str){2 //str格式为yyyy-mm-dd h…

(十九)异常处理
什么是异常处理 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 语法错误&…

jquery 获取一组元素的选中项 - 函数、jquery获取复选框值、jquery获取单选按钮值...
做表单提交时,如果现在还在用form提交,用户体验很差,所以一般使用ajax提交。 其中需要获取每个表单输入元素的值,获取的时候像文本框这些还好说,Jquery提供了 .val() 方法,获取很方便,但是获取复…

geany怎么创建文件夹_教程详情|Geany怎么使用,Geany安装使用教程_234游戏网
Geany是利用GTK 2工具包开发的一个快速、轻巧的集成开发环境,具有良好的可移植性和通用性、安全性,广泛应用于各个行业。Geany具有语法高亮、代码折叠、代码自动完成等功能,非常适合开发人员使用。下面是关于Geany安装使用教程,希…

Django模板系统和admin模块
只需要记两种特殊符号:{{ }}和 {% %}变量相关的用 {{}}, 逻辑相关的用 {%%}。 Filters 语法: {{ value|filter_name:参数 }}default{{ value|default: "nothing"}} 如果value值没传的话就显示nothinglength{{ value|length }}|左右…

finalshell文件列表不显示_Jira面板配置_待办事项不显示问题列表
最近,使用jira进行项目管理,出现一些问题,对于其中一些配置,做下记录,后续方便查看,也给需要的人一个参考,传送门:jira使用文档_Java_pang787559613的博客-CSDN博客blog.csdn.netj…

背单词:3年,34150分钟!
转载于:https://www.cnblogs.com/sx00xs/p/6128618.html

如何学习区块链技术
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 有效地学习区块链技术,您需要深入了解区块链协议和一些编程语言。记住区块链是一种可以用各种编程语言实现的协议。看下面的例子&#…

.net里鼠标选中的text数据怎么获取_Python数据科学实践 | 爬虫1
点击上方蓝色字体,关注我们大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。前面几章大家学习了如何利用Python处理与清洗数据,如何探索性数据分析,以及如何利用…

redis实现对账(集合比较)功能
现状:每日在进行系统之间的订单对账时,往往是这样的操作流程; 1.从外部系统拉取数据存入本地数据库; 2.查询本地订单数据集合localSet; 3.查询外部系统订单数据集合outerSet; 4.以本地localSet为基准,对照o…

Javascript刷题 》 查找数组元素位置
找出元素 item 在给定数组 arr 中的位置 输出描述: function indexOf(arr, item) {..... } 如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1 输入例子: indexOf([ 1, 2, 3, 4 ], 3) 输出例子: 2 实现方法 1、先将arr转换成字符串,…

Go 语言函数
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执…

终端主题_再见 XShell 和 ITerm 2,是时候拥抱全平台高颜值终端工具 Hyper 了!
点击上方“涛哥聊Python”,选择“星标”公众号重磅干货,第一时间送达转自:运维之美不论是 macOS 还是 Windows 下,我们都不推荐使用系统自带终端。无论是可拓展性还是可编程性都被「系统自带」这样的特点限制。特别是 Windows 下的…

每天一个linux命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一。一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本…

samba srver on centos-7
切换到root用户安装samba,将windows登录用户admin映射到linux用户centos 安装samba并准备工作目录 yum install -y samba samba-client mkdir -p /var/samba/code chown -R centos:centos /var/samba/codetouch /etc/samba/smbusersecho "centos admin "…

以太坊数据结构MPT
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 MPT(Merkle Patricia Tries)是以太坊存储数据的核心数据结构,它是由Merkle Tree和Patricia Tree结合的一种树形结构,理解MP…

lambda在python中的用法_在python中对lambda使用.assign()方法
我在Python中运行以下代码:#Declaring these now for later use in the plotsTOP_CAP_TITLE Top 10 market capitalizationTOP_CAP_YLABEL % of total cap# Selecting the first 10 rows and setting the indexcap10 cap.loc[:10, :].set_index(id)# Calculating…