区块链结构
🍍

区块链结构

创建时间
Jan 29, 2025 01:10 PM
Arbitrum
人员
文件和媒体
AI 关键词

区块链

区块链是一系列数据块(即“区块”),通过特定的方式相互连接,形成的一条链。每个区块都包含前一个区块的哈希值,称为“父哈希值”( Parent Hash ),这是前一个区块内容的唯一标识符。通过这种方式,每个区块都与前一个区块相连接,形成了一条从第一个区块(创世区块)到最新区块的连续链条,这就是“区块链”。注:第一个区块里无父哈希值。
notion image

区块

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

交易

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

交易收据

在以太坊中,当一笔交易完成后,会生成“交易收据”( Transaction Receipt,又叫交易回执)。交易收据记录了交易执行的基本信息,是交易被包含在区块链中的重要证据。
notion image
每个交易收据包含的信息有:
  • transactionHash:交易哈希值,用于唯一标识一笔交易。
  • transactionIndex:交易在所在区块中的索引位置。
  • blockHash:包含该交易的区块哈希值。
  • blockNumber:包含该交易的区块编号。
  • from:发起交易的地址。
  • to:交易的目标地址。
  • cumulativeGasUsed:当前区块中累积消耗的 Gas 量。
  • gasUsed:这笔交易所消耗的 Gas 量。
  • contractAddress:如果交易用于创建合约,则表示合约地址;否则为 null。
  • logs:交易过程中产生的事件日志。
  • logsBloom:布隆过滤器,用于快速检索交易日志。
  • status:交易执行的状态码,表示成功或失败。

默克尔-帕特里夏树 Merkle Patricia Tree

以太坊每天的交易量达到数百万笔,如此多的交易数据是如何存储的呢?这里采用了一种名为Merkle Patricia Tree( MPT )的数据结构,这是一种特殊类型的默克尔树( Merkle Tree )。我们先了解一下基本的默克尔树。
①默克尔树,也称为哈希树( Hash Tree ),这棵树的叶子节点是数据块的哈希值,非叶子节点是其子节点的哈希值串联后再次进行哈希计算的结果,这样可以确保数据的完整性。如图所示,节点值的计算方法为:
哈希 A=Hash (数据 A );
哈希 B=Hash (数据 B );
哈希 E=Hash (哈希 A+哈希 B );
notion image
②帕特里夏树( Patricia Trie ),也称为压缩前缀树,这棵树既可以利用字符串的公共前缀来减少查询时间,又可以通过压缩无分支的节点来节省空间。
notion image
③默克尔-帕特里夏树 ( Merkle Patricia Tree ) 结合了默克尔树( Merkle Tree )和帕特里夏树( Patricia Trie )的优点,既可以验证数据的完整性,也可以快速检索状态信息,非常适合用作以太坊中的数据存储。在每个区块里,分别有一棵默克尔-帕特里夏树来存储交易数据、收据数据、状态数据和账户数据。
这一小节,我们对以太坊区块链的数据结构有了一个基本了解,可以用下面一张图来总结,它是一种高度复杂且精妙的设计,它整个系统能够安全地记录和验证交易,同时保证了网络的去中心化特性。
notion image
🚀
以太坊平台正在快速发展和持续升级,文章中的数据结构信息可能已不再是最新版本。另外,不同区块链之间的数据结构也会有所差异。所以我们强烈建议你关注最新的区块链技术动态,并以官方发布的最新文档为准确。