关于以太坊的学习,我们慢慢地接近尾声了。从前面的文章中我们可以看出,以太坊的整个实现机制比比特币复杂得多,所以它的区块结构也比比特币的复杂,而且它的存储不止区块这一种方式,咱们花几天的时间来好好学习一下以太坊的区块和存储。
先从区块开始。跟比特币一样,以太坊的区块结构也分为区块头和区块体,这一篇我们先讲区块头。以太坊的区块头包含15个字段:
ParentHash
这是上一个区块的哈希值,跟比特币一样,我们可以把它看成一个指针,指向上一个区块,正是有这个指针,区块和区块才串联起来,才有区块链。
Coinbase
在比特币里也有一个coinbase,但那个coinbase是指一笔特殊的交易,就是系统奖励比特币给区块创建者的那笔交易。但在以太坊这里,是区块创建者留下的以太坊地址,用于接收系统奖励和交易手续费。
UncleHash
以太坊有一个独特的东西,叫叔区块,咱们下一篇会仔细讲讲。现在只要知道这个字段就是所有叔区块用RLP编码后再哈希出来的值即可。
Root
这是一棵MPT树的根哈希,这棵树存储了所有以太坊账户。
TxHash
这也是一棵MPT树的根哈希,这棵树存储了所有的交易信息。
ReceiptHash
这还是一棵MPT树的根哈希。对于以太坊账户和交易我们都已讲过,MPT我们也讲过,用MPT树来存储它们好理解。那这棵树又是存什么的呢?其实,这棵树存储的是收据信息。什么是收据?就是交易完成后会提供一个清单给你,告诉你一些信息:比如这笔交易被哪个区块打包了,这笔交易最终花费了多少gas、执行交易时创建的一些日志等等。
Bloom
我们可以在合约中通过定义“事件”来生成日志。上面说了,在收据树里会存储一些日志,这个bloom其实是一个过滤器,通过这个过滤器可以快速搜索和判断某个日志是不是存在于收据中。
Difficulty、 Nonce、mixHash
这三个字段都和以太坊的挖矿有关,以太坊和比特币一样,也是POW模式,所以它也有一个挖矿难度系数,这个系数会根据出块速度来进行调整。以太坊第一个区块的难度是131,072,后面区块的难度会根据前面区块出块的速度调整,出得快难度就调高一点,出得慢就调低一点。
Difficulty就是区块的难度系数,Nonce是目标值,Nonce值小于等于2^256/Difficulty。所以,难度值越高,目标值的范围越窄,要找到符合的就越难。以太坊具体的挖矿计算比比特币复杂得多,但大概的流程就是不断尝试不同的mixHash来获得符合条件的Nonce。所以,mixHash可以简单理解为比特币区块头里的随机值。
Number
区块的序号,每个区块的序号就是在父区块的序号上加1。
Time
区块生成的时间。这个时间不是那么精确地就是区块真正生成的时间,有可能就是父区块的生成时间加上10秒,有可能就是区块产生时的“大概”时间。
GasLimit
区块内所有Gas消耗的理论上限。这个理论值与父区块有关,它允许打包区块的矿工根据父区块的情况对这些值做些微调。每个区块在产生时就必须设定这么一个gas消耗的理论上限,这个上限值限定了一个区块打包交易的总量,比如一个区块的上限值设定为10000,现在有3笔交易的gas设定分别都是5000,那么这个区块就最多打包其中的两笔交易,如果硬要打包3笔,其他节点就不会认这个区块的。
可以这么说,这个字段限定了一个区块的存储规模,但仍保有一定弹性。这一点与比特币不同,比特币的一个区块是多大,直接写死在比特币软件里,要更改的话只能通过硬分叉。
GasUsed
区块内所有交易执行完后所实际消耗的gas总量。
extraData
这个字段是留给区块的创建者,让他可以记录一些与该区块有关的信息,长度小于等于32字节即可。
这就是区块头的完整信息,明天咱们继续学习以太坊的区块结构以及其他存储方式。
不投资毋宁死
自由,就是拥有选择的权利,而每一次选择都是一次投资。
谢谢阅读
✬如果你喜欢这篇文章,欢迎分享到朋友圈✬
评论功能现已开启,灰常接受一切形式的吐槽和赞美☺
领取专属 10元无门槛券
私享最新 技术干货