一、区块结构

在各种区块链项目中(例如以太坊),节点往往需要维护三个 Trie Root,在每个区块头中会记录

  • stateRoot
  • transactionsRoot
  • receiptsRoot

代码:https://github.com/ethereum/go-ethereum/blob/053ed9cc847647a9b3ef707d0efe7104c4ab2a4c/core/types/block.go

二、TransactionsRoot

TransactionsRoot 存储的是 block中transactions组成的Trie的Root
TransactionsRoot的作用最简单,用于接收者检查block中transactions的完整性。

三、ReceiptsRoot

ReceiptsRoot存储的是交易回执内容

receipt本身记录交易是否在block被成功执行。

代码:https://github.com/ethereum/go-ethereum/blob/ddadc3d27379a3326fd1b78278e5e5da44a91d94/core/blockchain.go

receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig)

四、StateRoot

StateRoot 记录的是 transaction执行结束之后的世界状态。

 if root := statedb.IntermediateRoot(v.config.IsEIP158(header.Number)); header.Root != root {return fmt.Errorf("invalid merkle root (remote: %x local: %x)", header.Root, root)}

但是这个StateRoot 和 ReceiptRoot的作用仿佛就相似了。
都是检查状态改变结果是否正确。

五、ReceiptsRoot与StateRoot 作用的差异

作用上很相似,都是检查transaction执行结果是否正确。
为啥要实现两遍呢,我们是否可以通过比较StateRoot和header中一致,来保障transaction的内容正确和执行顺序正确?

仔细看一下Receipts的内容

ReceiptsRoot

代码:https://github.com/ethereum/go-ethereum/blob/7770e41cb5fcc386a7d2329d1187174839122f24/core/state_processor.go

我们发现除了result.Failed()来记录transaction执行是否成功外,还有一个receipt.GasUsed域值得关注。
这个域表示当前transaction执行后,该block一共消耗了多少Gas。
所以明显receiptsRoot还有transactions执行顺序的一致性。

但是顺序一致,依旧可以通过stateRoot的一致来检查。

StateRoot

代码: https://github.com/ethereum/go-ethereum/blob/ddadc3d27379a3326fd1b78278e5e5da44a91d94/core/blockchain.go


我们看stateRoot的内容,有Account的内容。StateRoot更多是世界环境的Root。所以他更多是表达transaction执行后的世界。

总结

receiptRoot 和 StateRoot的作用都是检查transaction执行是否正确可靠。
不同点在于receiptRoot只是表示transaction执行成功失败还有执行顺序。
StateRoot的作用是记录 transaction执行结束之后的世界状态。

注意,以太坊允许uncle block这种孤块的存在。
当一个BP节点本身处在一条非主流分叉上时,它所产生的StateRoot与接收者执行后的StateRoot不同
如果单纯比较StateRoot不同而盲目的认为BP节点是evil节点,就有些不公正。
我们可以通过比较receiptsRoot来对transaction的执行正确性达成一致,不必在乎执行的环境是否相同。
这样以太坊就对uncle block更加友善了。

https://blog.csdn.net/cemao4548/article/details/105939491

https://docker.blog.csdn.net/article/details/109741079

区块链 以太坊 三元组是什么 state root transaction root receipt root相关推荐

  1. 【区块链-以太坊】5 Ubuntu下truffle ganache安装及使用

    [区块链-以太坊]5 Ubuntu下truffle & ganache安装及使用 1 truffle安装 1)输入sudo npm install -g truffle 2)将truffle复 ...

  2. 区块链-以太坊学习资料汇总

    最近一段时间以来,对区块链的底层研究和基于区块链的应用开发已经越来越火热了.机缘巧合,目前我也在进行区块链方面的开发,在之后的博客中,我会和大家一起分享区块链开发中的酸甜苦辣.今天我先来对收藏区块链- ...

  3. 8支团队正在努力构建下一代区块链以太坊Ethereum 2.0

    2019独角兽企业重金招聘Python工程师标准>>> "我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两 ...

  4. 可编程区块链以太坊的未来

    区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>,感受一下先行者的思想. 到本文结束时,你将了解一般的区块链(特别是下一代区 ...

  5. 回看2015年是如何描述区块链以太坊的未来

    区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>,感受一下先行者的思想. 到本文结束时,你将了解一般的区块链(特别是下一代区 ...

  6. 回望Vinay2015年的文章:内容可编程的区块链——以太坊的未来

    2019独角兽企业重金招聘Python工程师标准>>> 区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>, ...

  7. 上下文可编程区块链——以太坊的未来

    区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>,感受一下先行者的思想. 到本文结束时,你将了解一般的区块链(特别是下一代区 ...

  8. 区块链以太坊以及hyperledger总结

    https://learnblockchain.cn/ 1.什么是智能合约?它有什么特点? 就是具有交互能力而且能够在区块链中传递的合约 一个由计算机代码控制的以太币账户 特点: 公开透明.能即时与区 ...

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

    一.结构 区块由两部分组成,分别是 区块头(header) 区块体(body) 1. 结构图 2. 区块头(header) 区块头存储了区块的元信息,用来对区块内容进行一些标识,校验,说明等. 通用字 ...

  10. 带你玩转区块链--以太坊基础、发币、基于智能合约实现彩票项目-第二章-第一节【以太坊篇】

    意义: 在上一节知识学习中,我们已经了解如何实现一个基础区块链,并重构了BTC关键代码.对比传统的中心化项目,区块链项目拥有很多优势,如:追溯性.不可传篡改性.在中心化项目中的网络协议是:[数据层-- ...

最新文章

  1. 利用.htaccess绑定子域名到子目录(亲测万网可用)
  2. Gitlab用户权限管理
  3. Windows轻松实现linux shell环境:gitforwindows
  4. SpringBoot监听redis过期key
  5. ffmepg4 解码特别慢
  6. 安装CocoaPods
  7. Linux篇 | 多网卡绑定技术 binding 和 网络组nmcli
  8. JDK源码解析之 java.lang.ThreadLocal
  9. 13-12-X-Pack的配置与检查
  10. 7-16 求符合给定条件的整数集
  11. LintCode—链表翻转(35)
  12. 电路设计_示波器接地常识
  13. 关于如何实现一个至简的麻将模拟程序的思考
  14. sqlserver 登录方式修改,由默认的windows账户改为用sa等sql server账户登录问题
  15. UnityHub 无需登录 傻瓜教程 一键搞定
  16. matlab ezplot fplot,[求助]fplot和ezplot功能一样啊?
  17. Win7 64位系统下思维导图XMind的Java环境配置
  18. SQL1084C Shared memory segments cannot be allocat
  19. HaaS100 云端钉一体智能语音播放器设计
  20. 什么是POP3、SMTP和IMAP?

热门文章

  1. 用于WebKit的CSS诀窍-图片版
  2. javascript 之牛人感悟,必看学习
  3. Hive实践(hive0.12)
  4. shell 构建脚本基础
  5. Centos7.6安装Oracle11gR2
  6. react里执行shouldComponentUpdate时返回false的后果
  7. ES6-模块导入导出
  8. Java多线程(三) 多线程间的基本通信
  9. Android 代码名字-API级别-版本号-NDK版本对应关系
  10. Container的限制