一文读懂以太坊账户的基本原理,从私钥到世界状态
如果说区块链是一个巨大的全球共享账本,账户”就是这个账本上的基本记账单元,与比特币采用 UTXO(未花费交易输出)模型不同,以太坊从设计之初就选择了更为直观的账户模型,理解以太坊账户的基本原理,是深入学习智能合约、DeFi 乃至整个以太坊生态的第一步,本文将从账户类型、内部结构、地址生成机制等方面,系统剖析以太坊账户的核心原理。
两种账户类型:EOA 与合约账户
以太坊中存在两种类型的账户,它们在地址格式上完全相同(均为 20 字节),但控制方式截然不同:
外部账户
- 由私钥控制,私钥掌握在用户手中
- 任何人都可以通过生成密钥对免费创建
- 可以主动发起交易(转账、部署合约、调用合约)
- 没有关联的合约代码
合约账户
- 由智能合约代码控制,不存在对应的私钥
- 由外部账户(或其他合约)通过交易创建
- 不能主动“苏醒”,只能在被交易或消息调用触发时执行代码
- 拥有持久化的存储空间和可执行的代码
一个关键区别在于:EOA 的行为由人决定,合约账户的行为由代码决定,这也是“代码即法律”理念的技术基础。
账户的内部结构:四个核心字段
无论哪种账户,在以太坊世界状态中都由以下四个字段描述:
nonce(交易计数器)
- 对于 EOA,nonce 表示该账户已发送的交易数量
- 对于合约账户,nonce 表示其创建的合约数量
- 核心作用是防止重放攻击,确保每笔交易只能被执行一次,同时保证交易的处理顺序
balance(余额)
- 账户持有的以太币数量,以 wei 为最小单位(1 ETH = 10¹⁸ wei)
- 采用 256 位整数存储
storageRoot(存储根)
- 指向该账户专属存储树的 Merkle 根哈希
- 合约账户用它保存所有状态变量(如代币的持有人映射)
- EOA 此字段为空
codeHash(代码哈希)
- 账户智能合约代码的 Keccak-256 哈希值
- 代码在部署后不可修改
- EOA 的 codeHash 是空字符串的哈希
账户地址是如何生成的
以太坊账户体系建立在非对称加密之上,地址的生成遵循一条清晰的链条:
私钥 → 公钥 → 地址
- 私钥:一个随机生成的 256 位数字(32 字节),是账户的终极控制权所在,谁掌握私钥,谁就掌握账户。
- 公钥:使用 secp256k1 椭圆曲线算法从私钥推导出公钥(64 字节),这一过程在数学上是单向的。
- 地址:对公钥做 Keccak-256 哈希运算,取结果的后 20 字节(40 个十六进制字符),加上
0x前缀即得到地址。
0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
注意:以太坊使用的是原始的 Keccak-256 算法,与 NIST 标准化的 SHA3-256 略有不同,EIP-55 引入了通过大小写混合实现的地址校验机制,帮助检测地址输入错误。
合约账户的地址则由部署者的地址及其 nonce 共同决定(CREATE 操作码),因此是可预先计算的,CREATE2 更进一步允许预先确定合约地址。
账户模型 vs UTXO 模型
| 维度 | 以太坊账户模型 | 比特币 UTXO 模型 |
|---|---|---|
| 记账方式 | 余额直接增减 | 未花费输出的集合 |
| 直观性 | 类似银行账户,易理解 | 需理解“找零”等概念 |
| 状态存储 | 全局世界状态 | 交易本身携带状态 |
| 智能合约 | 天然支持复杂状态 | 支持有限 |
账户模型
The End
发布于:2026-10-10,除非注明,否则均为原创文章,转载请注明出处。

