以太坊,作为全球领先的智能合约平台,其核心架构由账户(Account)驱动,理解以太坊账户的数据结构,是掌握以太坊工作原理、进行安全交易以及开发智能合约的基础,与比特币基于UTXO(未花费交易输出)模型不同,以太坊采用的是账户余额模型,每个账户都存储了特定状态的数据,本文将深入剖析以太坊账户的数据构成,揭示其内部运作机制。
以太坊账户的两种类型
以太坊中的账户主要分为两类:外部账户(Externally Owned Account, EOA) 和 合约账户(Contract Account),这两类账户在数据结构、控制方式和功能上存在显著差异。
-
外部账户(EOA):
- 控制者:由私钥控制,用户通过钱包软件管理私钥,从而控制EOA,你个人创建的钱包地址就是一个EOA。
- 功能:可以发起交易(如转移ETH、调用合约函数)、创建新的合约账户。
- 特点:本身不存储代码,只能被动接收交易调用。
-
合约账户:
- 控制者:由合约代码控制,合约账户没有私钥,其行为由部署到其中的智能代码逻辑决定。
- 功能:可以存储数据、执行代码逻辑、响应来自EOA或其他合约账户的交易调用。
- 特点:包含合约代码和存储空间,可以主动执行操作。
以太坊账户的核心数据结构
无论是EOA还是合约账户,它们在以太坊的状态树(State Trie)中都由一个唯一的地址(Address)索引,并且其数据遵循一定的结构,以太坊的状态数据存储在一个名为“Merkle Patricia Trie”(Merkle Patricia 前缀树)的数据结构中,以确保高效验证和同步。
每个账户在状态树中存储的数据主要包括以下几个字段(以最新的EIP-1559及之后版本为例):
-
nonce(nonce值):
- 对于EOA:表示该账户已发起的交易数量,每发起一笔新的交易,nonce值就会加1,Nonce的主要作用是防止重放攻击(Replay Attack),确保交易的顺序性和唯一性,矿工/节点会验证交易的nonce是否与账户当前nonce匹配。
- 对于合约账户:表示该账户已创建的合约数量,每创建一个新的合约,nonce值也会加1,这防止了合约无限循环创建自身或其他合约。
-
balance(余额):
- 这是账户中持有的以太币(ETH) 的数量,以“wei”为单位(1 ETH = 10^18 wei)。
- 对于EOA,这是用户可用的资金;对于合约账户,这是其持有的ETH,可以用于支付交易费或进行其他操作。
-
storageRoot(存储根):
- 仅适用于合约账户。
- 这是一个Merkle Patricia Trie的根哈希值,指向该合约账户的存储(Storage) 数据,合约的存储是持久化的,用于存储合约在执行过程中需要持久化的状态变量(如uint256, string, mapping等),每个合约账户都有自己独立的存储空间。
- 对于EOA,此字段为空。
-
