在以太坊这个庞大的去中心化应用生态系统中,账户(Account)是所有交互的核心,无论是用户持有的资产、智能合约的状态,还是交易的发起与接收,都离不开账户的概念,理解以太坊账户的构成,是深入掌握以太坊工作原理的关键,一个完整的以太坊账户,主要由以下四个核心部分组成,它们共同定义了账户的身份、状态和权限。
地址 (Address)
地址是以太坊账户最直观的标识符,可以理解为银行账户中的账号,它是一个20字节(40个十六进制字符)的值,由账户的公钥经过特定算法(Keccak-256哈希后取后20位)生成,或直接由智能合约创建时指定。
- 作用:地址是账户在以太坊网络中的唯一身份标识,所有发送给该地址的ETH和代币,以及调用该地址(如果是合约账户)的函数,都通过地址来定位。
- 类型:地址本身并不区分是外部拥有账户(EOA)还是合约账户,地址的“类型”取决于它背后是由私钥控制的EOA,还是由代码和数据构成的合约账户。
- 生成:对于EOA,地址从私钥/公钥对派生;对于合约账户,地址在合约创建时由创建者地址和nonce值共同决定,确保了合约地址的唯一性。
账户余额 (Account Balance)
账户余额是以太坊账户中存储的以太坊(ETH)数量,通常以“wei”为最小单位(1 ETH = 10^18 wei),这是账户状态最核心、最直观的体现。
- 作用:对于EOA,余额代表了用户可以用于支付交易费用(Gas费)和发送的价值,对于合约账户,余额可以存储ETH,也可以作为合约逻辑的一部分被使用或转移。
- 状态存储:账户余额记录在以太坊的状态根(State Root)中,是账户状态树中的一个叶子节点,每次余额发生变动(如转账、收取Gas费),都会更新状态树,并最终反映在最新的区块中。
- 查询:任何人都可以通过以太坊客户端(如Geth、Nethermind)或区块浏览器,查询任意地址的当前ETH余额。
Nonce (Nonce)
Nonce是一个与账户相关的计数器,其具体含义和作用根据账户类型略有不同,但核心目的都是防止重放攻击和确保交易顺序。
-
<p>对于外部拥有账户 (EOA):

- 作用:Nonce记录了由该EOA发起的交易序列号,每成功发起一笔交易,其Nonce值就会加1,新的交易必须使用当前正确的Nonce值才能被网络接受,这确保了交易的顺序性,并防止攻击者重放旧的交易来消耗用户Gas或执行恶意操作。
- 示例:如果一个账户的Nonce是5,那么下一笔合法交易的Nonce必须是6。
-
对于合约账户:
- 作用:Nonce记录了该合约账户创建的其他合约数量,每当一个合约账户通过
CREATE或CREATE2操作码创建新合约时,其自身的Nonce值就会加1,这个值用于计算新合约的地址,并确保合约创建的唯一性。
- 作用:Nonce记录了该合约账户创建的其他合约数量,每当一个合约账户通过
代码与存储 (Code and Storage)
这是区分EOA和合约账户的关键部分,也是以太坊支持智能合约功能的核心所在。
-
代码 (Code):
- 一段以太坊虚拟机(EVM)可执行的字节码,对于EOA,这部分为空(即
codeHash为c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470,表示空代码的哈希值),对于合约账户,这部分包含了定义合约逻辑的字节码。 - 作用:当外部向合约账户发送交易(或合约账户之间交互)时,EVM会执行这段代码,从而实现预定的业务逻辑,如转账、计算、状态更新等,代码本身在部署后通常是不可变的(除非通过特定的代理模式升级)。
- 一段以太坊虚拟机(EVM)可执行的字节码,对于EOA,这部分为空(即
-
存储 (Storage):
- 一个持久化的键值对(key-value)数据库,专门用于存储合约的状态变量,每个合约账户都有自己独立的存储空间。
- 作用:存储使得智能合约能够“记忆”数据,在一个投票合约中,每个地址是否已经投票的信息会记录在存储中,存储的修改会消耗大量的Gas费用,因为它需要永久写入区块链。
- 特性:存储是持久化的,一旦写入,除非被合约逻辑主动修改或销毁,否则会永久存在于以太坊状态中,与代码不同,存储的内容是可变的。
以太坊账户的这四个组成部分——地址、余额、Nonce以及代码与存储——共同构成了一个完整的账户模型,地址作为身份标识,余额代表价值,Nonce确保了交易的有序性和唯一性,而代码与存储则赋予了以太坊执行复杂智能合约的能力,正是这四个部分的精妙设计与协同工作,使得以太坊不仅仅是一个加密货币平台,更成为一个能够运行去中心化应用的全球性、可编程的计算机,理解这四个部分,就是迈向以太坊世界深处的第一步。