待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此简书文集记录我的学习笔记。
课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第三课分为三部分:
- 以太坊区块结构
- GHOST协议
- 搭建测试网络
这篇文章是第三课第一部分的学习笔记:以太坊区块结构。
1、以太坊区块结构详细分解
以太坊区块结构
以太坊区块主要包括三部分:
- 区块头
- 交易
- 两个叔块的区块头散列值。
区块头的详细内容
- Parent header hash 父区块的区块头散列值。
- Ommers List hash 两个叔块的区块头散列值所组成的列表的单向散列值。
- Beneficiary 收益地址,160位
- State Root Trie Hash 全局状态根MPT的散列值
- Transaction Trie Hash 交易MPT树的散列值
- Receipt Trie Hash 收据MPT树的散列值。每一个交易都有一个收据,有多少个交易就有多少个收据。主要包括交易执行后衍生出的信息,包含四部分的内容。
以上的三个根,保证了所有节点保存的状态一致、交易一致、交易结果一致,再通过对整个区块头进行Hash操作,保证历史一致。这样就保证了这个区块链的公信力。 - logs Bloom 整个区块日志的Bloom过滤器,供查询区块的信息。
- Difficulty 区块难度。有很多因素决定,由一个公式算出。
- Number 直系父节点的个数
- GasLimit gas上限。比特币通过大小限制区块尺寸,而以太坊通过gas上限。
- GasUsed 当区块被挖出时,实际的gas消耗。
- Time 时间戳
- Extra Data
- mixHash
- nonce
后三个是与挖矿相关的参数。
2、以太坊数据分布结构与控制流
以太坊数据分布结构
- 全局状态树 State Trie
如果这是一个合约账户,其中的一个叶子节点将包含以下四个部分。
①是随机值,②是余额,③是相关代码的散列值,④是合约的相关全局变量的MPT。在后面的代码中,全经常看到 storage 。
其中,代码存储在交易中。
- 交易树 Txs Trie
本区块中,所有交易组成的MPT树。
- 收据树 Receipt Trie
每一个区块中,有自己的交易树和收据树,但全局状态则不同,它会重用历史信息,只更新需要更新的一小部分。
图中,左边部分的数据都不在以太坊的区块链上,区块链上只包括前一小节里提到的数据。左边这些数据都是根据交易信息在虚拟机中执行推导出来的,其它由Level DB 持久化存储。
数据控制流
以太坊数据的控制流如上图,简述如下:
❶交易信息输入到虚拟机中。
❷虚拟机根据交易信息从全局状态树中取得一些需要的信息。
❸执行合约的一些操作后, 会修改全局状态树,及收据树。
❹最后,左边的这些数据会串行化、持久化到 level DB。
3、以太坊全局状态Trie的变迁
全局状态Trie的变迁
前面提到,全局状态树并不是全部重新生成,只更新变化的部分。
上图中,从区块175223到区块175334过程,发生了一笔交易,账号175收到了18eth,余额发生了变化,蓝色的部分都发生了变化。而红色部分没有变化,所以在175334区块中,绿色的数据是新的,黄色和红色则可以重用上一区块。
不足之处,请批评指正。








网友评论