以太坊作为全球领先的智能合约平台和去中心化应用(DApps)的底层系统,其数据存储机制一直是开发者和用户关注的焦点,与许多人可能想象的“数据存储在某个中心化服务器”不同,以太坊的数据以一种独特且分布式的方式存在于全球网络中,以太坊的数据主要存储在全球节点组成的网络中,具体可以细分为以下几个层面:
核心数据:存储在区块链本身(链上存储)
这是以太坊最核心、最基础的数据存储方式,也是我们通常所说的“上链”数据,这些数据被记录在以太坊的区块链上,具有极高的安全性和不可篡改性,主要包括:
-
账户状态(Account State):
- 外部账户(EOA, Externally Owned Account):即我们通常说的钱包地址,其数据包括账户的 nonce(交易次数)、余额(以太币数量)。
- 合约账户(Contract Account):智能合约的账户,其数据包括合约代码( bytecode)和存储在合约中的状态变量(state variables)。
- 这些账户状态信息共同构成了以太坊的“状态树”(State Tree),是当前时刻整个以太坊网络所有账户状态的快照。
-
交易数据(Transaction Data):
- 每一笔发起的交易(如转账、合约调用)都会作为一个区块的基本单元被记录下来,交易数据包括发送方、接收方(或合约地址)、交易金额、gas 限制、gas 价格、交易数据(payload,通常是合约调用的输入参数)以及数字签名等。
- 所有交易数据按顺序链接成“交易列表”,每个区块包含一个或多个交易。
-
区块头(Block Header):
每个区块的头部包含了该区块的元数据,如父区块哈希、本区块的哈希(通过区块头计算得出)、时间戳、难度值、随机数(nonce)、默克尔根(Merkle Root,代表本区块所有交易的哈希摘要)等,区块头通过哈希指针将各个区块连接成一条不可篡改的链。
-
收据(Receipts):
交易执行后会产生收据,记录了交易执行的结果,例如是否成功、消耗了多少 gas、如果是合约创建或调用,还会记录日志主题(Topics)和数据(Data)等,收据对于追踪交易状态和合约事件至关重要。
这些链上数据通过Merkle Patricia Trie(默克尔帕特里夏树)数据结构组织起来,并存储在以太坊的世界状态(World State)中,每一个全节点都会完整地存储一份最新的世界状态数据以及从创世块至今的所有区块头和部分历史数据(取决于节点的同步模式)。
辅助数据:存储在节点客户端(P2P网络与数据库)
虽然区块链本身是分布式账本,但以太坊节点客户端(如 Geth、Parity 等)为了高效地提供数据服务,还会使用本地数据库来存储一些辅助数据:
-
区块体(Block Bodies):
区块头之后的部分,包含了本区块的所有完整交易数据,节点会将区块体存储在本地数据库中,以便快速响应其他节点的请求或进行交易查询。
-
历史状态数据(部分节点):
- 默认情况下,全节点会存储最新的世界状态,但对于历史状态数据,不同类型的节点策略不同:
- 全节点(Full Node):通常只存储最新的状态,但可以选择同步并存储更多历史状态,这会占用大量存储空间。
- 归档节点(Archive Node):会存储从创世块至今的所有历史状态数据,这对需要查询历史状态的用户或开发者非常有用,但存储需求极高(目前可达数TB)。
- 默认情况下,全节点会存储最新的世界状态,但对于历史状态数据,不同类型的节点策略不同:
-
索引数据:
为了提高查询效率,节点客户端会在本地数据库中建立各种索引,如地址交易索引、区块高度索引、主题日志索引等,使得用户可以快速查找特定交易、地址活动或合约事件。
挑战与扩展:链下存储与 Layer 2 解决方案
随着以太坊的广泛应用,链上存储的成本日益高昂(主要因为 gas 费用),且区块链本身的存储扩展性有限,大量数据开始转向链下存储,而以太坊主要负责记录这些数据的“存在性证明”或“指针”。
-
链下存储(Off-chain Storage):
- IPFS(星际文件系统)

- IPFS(星际文件系统)