🌐

区块链数据结构

 

目标

本节的目的是了解:
  • 区块链是如何组成的
  • 区块的数据结构
  • 交易的数据结构

介绍

区块链作为Web3生态的核心基础设施,就像一个分布式数据库,在全球范围内存储着交易数据、智能合约、用户身份信息以及各类去中心化应用程序(dApp)的数据。
以太坊区块链从上到下可以分为三个层级:区块链、区块和交易。交易数据、收据数据、状态数据和账户数据都存储在四棵独立的 Merkle 树中。如果你对这些概念还不熟悉,不用担心,本节我们将以以太坊为例,逐层剖析区块链的数据结构。

区块链

区块链是一系列数据块或“区块”,它们以特定方式连接起来形成一条链。每个区块都包含前一个区块的哈希值,称为“父哈希”,它唯一地标识了前一个区块的内容。通过这种方式,每个区块都与前一个区块相连,形成一条从第一个区块(创世区块)到最新区块的连续链——这就是“区块链”。注意:第一个区块不包含父哈希。
notion image
notion image

堵塞

区块链中的每个区块由两部分组成:区块头(Header)和区块主体(Body)。
  1. 区块头
区块头包含一个区块的基本信息,主要包括:
  • parentHash:记录前一个区块的哈希值。
  • 时间戳:记录区块被创建的准确时间。
  • nonce:用于工作量证明(PoW)挖矿过程。
  • 难度:表示挖矿难度。
  • coinBase:标识矿工的账户地址。
另外,区块头记录了三个非常重要的根哈希值:
  • stateRoot:表示区块链状态树的根哈希值,记录了所有账户的状态信息,如余额、合约代码等。
  • receivedRoot:表示收据树的根哈希值,记录了交易执行的结果,例如交易是否成功,交易费用等。
  • transactionRoot:表示交易树的根哈希值,其中包含了区块中的所有交易信息。
2. 块体
区块体存储了该区块的所有交易数据,即所有交易哈希的列表。
notion image
notion image

交易

在以太坊中,交易代表着将资产或消息从一个账户发送到另一个账户的行为。当用户发起交易时,以太坊客户端或钱包软件会构建交易数据。交易数据主要包含以下字段:
  • nonce:发送者账户的交易计数器,统计该账户在此区块链上进行的交易总数。
  • gasPrice:发送者愿意为每单位 gas 支付的价格。
  • gasLimit:发送者愿意在本次交易中消耗的最大 gas 量。
  • to:收件人的账户地址。
  • 值:要转移的以太币数量。
  • 数据:与智能合约相关的字节码。
  • v, r, s:由发送者的私钥生成的交易签名。
钱包构造好交易数据后,使用用户私钥对整个交易进行签名,并将签名结果(v,r,s)添加到交易数据中,然后计算整个交易数据(不包括签名)的哈希值。交易哈希是交易数据的唯一标识,保证交易数据的唯一性和不可篡改性。
notion image
notion image
例如,如果 Alice 想要向 Bob 发送 1 ETH,Alice 的账户地址是 0x123…ABC,Bob 的账户地址是 0x456…DEF。Alice 的账户已经进行了 5 笔交易,因此她下一笔交易的 nonce 是 6。当前的 gas 价格为 20 Gwei,她将 gas 限制设置为 21000(以太坊转账的标准 gas 费)。Alice 没有调用任何合约,因此数据字段为空。
  • 随机数:6
  • GasPrice: 20000000000 (20 Wei)
  • 气体限制:21000
  • 至:0x456…DEF
  • 价值:1000000000000000000(1 ETH)
  • 数据:0x
  • v, r, s:[签名数据]
Alice 的钱包会将这些交易数据打包并签名,然后生成交易哈希,并将这笔交易广播到以太坊网络。矿工会确认这笔交易并将其添加到新的区块中。一旦成功,1 个 ETH 就会从 Alice 的账户转移到 Bob 的账户。

交易收据

在以太坊中,一笔交易一旦完成,就会生成一个“交易收据”(也叫交易确认单),交易收据记录了交易执行的基本信息,是该笔交易被纳入区块链的重要证据。
notion image
notion image
每张交易收据均包含以下信息:
  • transactionHash:交易哈希值,唯一标识一笔交易。
  • transactionIndex:交易在其区块中的索引位置。
  • blockHash:包含交易的区块哈希值。
  • blockNumber:包含交易的区块编号。
  • from:发起交易的地址。
  • to:交易的目标地址。
  • cumulativeGasUsed:当前块中累计使用的Gas。
  • gasUsed:本次交易使用的Gas。
  • contractAddress:若该交易为创建合约,则为合约地址,否则为null。
  • logs:交易过程中产生的事件日志。
  • logsBloom:用于快速检索事务日志的布隆过滤器。
  • status:交易执行状态码,表示成功或者失败。

Merkle Patricia 树

每天有数百万笔交易,如此大量的交易数据是如何存储在以太坊中的呢?这是通过一种称为 Merkle Patricia Tree(MPT)的数据结构实现的,这是一种特殊的 Merkle 树。让我们首先了解基本的 Merkle 树。
  1. Merkle Tree又称哈希树,是一种以数据块的哈希值作为叶子节点,非叶子节点则为子节点哈希值拼接后的结果的树,保证了数据的完整性。如图所示,节点值的计算方法为:
    1. 哈希A = 哈希(数据A);
      哈希B = 哈希(数据B);
      哈希值 E = 哈希值(哈希值 A + 哈希值 B);
notion image
notion image
  1. Patricia Trie ,又称压缩前缀树,可以利用字符串的公共前缀来减少查找时间,通过压缩没有分支的节点来节省空间。
notion image
notion image
  1. Merkle Patricia Tree 兼具了 Merkle Tree 和 Patricia Trie 的优点,既能验证数据的完整性,又能快速检索状态信息,非常适合以太坊的数据存储。每个区块包含一棵 Merkle Patricia Tree,用于存储交易数据、收据数据、状态数据和账户数据。

概括

在本节中,我们对以太坊区块链的数据结构有了基本的了解。可以用下图来总结,这是一个高度复杂且巧妙的设计。整个系统可以安全地记录和验证交易,同时保持网络的去中心化特性。
notion image
notion image
💡
提醒
以太坊平台发展迅速,不断升级,本文中的数据结构信息可能不再是最新版本,且不同区块链之间的数据结构可能存在差异,因此强烈建议您及时了解最新的区块链技术动态,并参考最新的官方文档以确保准确性。