主页 > 华为安装imtoken > 以太坊教程 - 区块结构

以太坊教程 - 区块结构

华为安装imtoken 2023-02-10 05:32:19

比特币区块链使用 PoW 来确保每个区块都指向前一个区块,并且在每个区块内,一个独立的 Merkle Tree 确保所有交易都不可篡改。 用户的比特币是以 UTXO 的形式存储的,因此,比特币的交易就是不断地消耗现有的 UTXO 并产生新的 UTXO。

然而,以太坊采用的是账户模型。 如果小明账户在某个区块的资产是1ETH,小明转0.2ETH给小红后,扣除手续费,他的账户还剩下0.8ETH左右。 由于小明的账户地址保持不变,以太坊的区块结构必须能够在每个区块中持续跟踪和记录小明账户余额的变化。 因此,与比特币相比,以太坊的区块数据结构更为复杂。

默克尔帕特里夏树

以太坊存储账户数据的数据结构为MPT:Merkle Patricia Tree以太坊ETH挖矿教程,是一种改进的Merkle Tree。 当MPT的每个叶子节点的值确定后,计算出的Root Hash也就完全确定了。 例如,在第一个块中,确定了4个账户的余额后,就可以确定Root1:

以太坊挖矿教程_以太坊挖矿教程2021_以太坊ETH挖矿教程

在第二个块中,如果发生传输,将计算一个新的 Root2:

以太坊ETH挖矿教程_以太坊挖矿教程2021_以太坊挖矿教程

每个区块将通过 Root Hash 完全确定所有账户的状态。 因此,从全局的角度来看,以太坊是一个状态机,每个区块通过记录一个stateRoot来代表一个新的状态。 如果给定某个区块的stateRoot,我们肯定可以确定所有账户的所有余额和其他信息。 因此,stateRoot 被称为当前世界状态。

有的同学可能会想,如果第一个区块只有几个账户,随着账户数量的增加,如果有数百万个账户,以后区块存储的数据量不就增加了吗?

其实每个区块的stateRoot代表了一棵完整的状态逻辑树,但是每个区块记录的数据只包括修改的部分,如果我们观察第二个区块的树,它其实只记录了修改的两个账户,并且两个账号修改导致的上层路径Hash的变化:

以太坊挖矿教程2021_以太坊挖矿教程_以太坊ETH挖矿教程

将一棵百万节点的树完全放入内存需要大量内存,而以太坊的全节点不会将整个逻辑树放入内存。 实际上,每个节点的数据都存储在LevelDB中,节点在内存中只存储了当前活动的一些账户信息。 如果需要操作一个不在内存中的账号,会从LevelDB中加载到内存中。 如果内存不够,长期不活跃的节点也会从内存中移除,因为以后可以通过节点的路径再次从LevelDB中加载。

帐户数据

一个以太坊账户由 4 部分数据组成:

其中,nonce是一个递增的整数,每发送一笔交易,nonce就加1以太坊ETH挖矿教程,因此,nonce记录了交易的数量。

余额记录账户余额,单位为wei,1 Ether等于1,000,000,000,000,000,000wei(10的18次方)。

如果一个账户是一个合约账户,storageRoot存储合约相关的状态数据,codeHash存储合约代码的Hash。 对于外部账户,这两部分数据都是空的。

块数据

一个以太坊区块由区块头和一系列交易组成。 区块头除了记录parentHash(前一个区块的Hash)和stateRoot(世界状态)外,还包括:

transactionRoot 和 receiptsRoot 也是两棵 MPT 树,但与 stateRoot 不同。 它们只代表当前区块的两棵树,与前一个区块的状态无关。

叔块

以太坊采用类似于比特币的PoW挖矿,但算法是改进的Ethash算法。 PoW 挖矿肯定会产生分叉,但由于最长链共识,最终一定会分叉胜出:

以太坊挖矿教程2021_以太坊ETH挖矿教程_以太坊挖矿教程

但与比特币不同的是,#4 竞争结果是一胜一负,以太坊鼓励后续的#5 区块引用另一个废弃的#4 区块,这种引用的废弃区块被称为叔块(Uncle Block):

以太坊挖矿教程_以太坊ETH挖矿教程_以太坊挖矿教程2021

块头中记录的sha3Uncles就是叔块。 一个区块可以引用0-2个叔块,叔块的高度必须在前7层以内。

叔块的目的是给输掉比赛的矿工部分奖励,避免更长的分叉。

概括

以太坊的核心数据结构是 Merkle Patricia Tree 中记录的世界状态。 每个区块都包含新的交易,这会导致世界状况发生变化。

访问liaoxuefeng.com获取更多区块链教程