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