MODULE 1 · EVM 内部原理

Lesson 1: 账户模型

📖 阅读 ~10 分钟 🧪 3 个实验 ❓ 2 道测验

一切从"账户"开始

在你使用任何区块链之前,你需要理解一个根本概念:以太坊上一切都是账户。你的钱包是一个账户,智能合约也是一个账户。它们住在同一棵状态树上,遵循同样的寻址规则。

以太坊有且只有 两种 账户类型:

🔑 EOA(外部拥有账户)

  • 由私钥控制
  • 可以主动发起交易
  • 没有代码
  • 📝 你的 MetaMask 钱包就是 EOA

📜 合约账户

  • 没有私钥,无人"拥有"
  • 不能主动发起交易
  • 有代码(字节码)
  • 📝 Uniswap、AAVE 都是合约账户
💡 关键理解 EOA 和合约账户共享同样的 20 字节地址格式(0x + 40 个十六进制字符),从地址本身你分不出它是 EOA 还是合约——你需要查询它的 code 字段才能判断。

地址是怎么来的?

你的以太坊地址不是"注册"来的,而是从私钥数学推导出来的。这意味着:你不需要联网就能创建地址,全世界也没有任何"账户注册中心"。

EOA 地址生成

// EOA 地址推导过程 随机数 (256 bit) 私钥 (32 bytes, 64 hex chars) ↓ secp256k1 椭圆曲线 公钥 (64 bytes, 未压缩) ↓ Keccak-256 哈希 哈希值 (32 bytes) ↓ 取最后 20 bytes 地址 = 0x + 40 hex chars // 例:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 (Vitalik)

合约地址生成

// 普通部署 (CREATE) 合约地址 = keccak256(部署者地址 + 部署者 nonce)[12:] // 确定性部署 (CREATE2) 合约地址 = keccak256(0xff + 部署者 + salt + initCodeHash)[12:]
🔍 为什么重要 CREATE2 让你可以在部署之前就知道合约地址。这被广泛用于:工厂合约 (Uniswap Pair)、可升级代理、跨链部署同一地址。

账户状态:每个账户存了什么?

以太坊的全局状态(World State)本质上是一个巨大的映射表:address → state。每个账户的状态包含 4 个字段

nonce
EOA:已发送的交易数量
合约:已创建的合约数量
用途:防止交易重放攻击
balance
账户持有的 ETH 数量,以 wei 为单位
1 ETH = 10¹⁸ wei = 10⁹ gwei
codeHash
账户代码的 Keccak-256 哈希
EOA = keccak256("") 空哈希
storageRoot
账户私有存储树的 Merkle 根
EOA 没有存储,值为空树哈希
💡 关键理解 你的钱包里并不"存储" ETH。ETH 的余额记录在全网节点的状态树里。你的私钥只是证明你有权操作那个地址的签名工具

单位换算

// 以太坊单位体系 1 ETH = 1,000,000,000 gwei (10⁹) 1 ETH = 1,000,000,000,000,000,000 wei (10¹⁸) 1 gwei = 1,000,000,000 wei (10⁹) // Gas 价格通常用 gwei 表示 // 合约内部计算一律使用 wei(uint256 整数)

🧪 动手实验

🔬 实验 1:生成训练钱包

生成一个新的 EOA,观察私钥、公钥、地址之间的关系。

chainlab lab evm wallet

思考:为什么每次生成的地址都不同?两个人生成同样地址的概率有多大?

🔬 实验 2:查询真实余额

查询 Vitalik 的 ETH 余额,理解 RPC 调用和 wei/ETH 转换。

chainlab lab evm balance 0xd8dA...96045 --chain ethereum

思考:这个余额信息从哪里来?你的电脑怎么知道 Vitalik 有多少 ETH?

🔬 实验 3:读取最新区块

读取以太坊最新区块,看看真实网络上正在发生什么。

chainlab lab evm block latest --chain ethereum

思考:一个区块包含多少笔交易?Gas 利用率和 Base Fee 有什么关系?

❓ 自测

检验你的理解

Q1: 以下哪个说法是正确的?

✅ 正确!合约账户没有私钥,不能主动签名交易。所有链上操作最终都要由 EOA 发起。
❌ 再想想。提示:谁能签名?谁不能?

Q2: 1 ETH 等于多少 gwei?

✅ 正确!1 ETH = 10⁹ gwei = 10¹⁸ wei。Gas 价格用 gwei,合约内部用 wei。
❌ 记住:ETH → gwei 是 10⁹,gwei → wei 也是 10⁹,所以 ETH → wei 是 10¹⁸。

📝 本课小结

核心要点 1. 以太坊只有 EOA 和合约账户两种
2. 地址是从私钥数学推导的,不需要"注册"
3. 每个账户有 4 个状态字段:nonce / balance / codeHash / storageRoot
4. 余额不在你的钱包里,在全网的状态树里
5. 所有交易最终都由 EOA 发起(合约不能主动行动)
下一课
Lesson 2: 状态树 (Merkle Patricia Trie)