第 04 讲:Ethereum、EVM 与智能合约

  • 主题:Ethereum 架构、EVM/Gas/账户状态、Solidity 与代币标准
  • 重点问题
    • 为什么 Ethereum 比 Bitcoin 更适合金融应用?
    • 智能合约是"自动执行合同"还是"可编程资产规则"?
  • 关键词:账户(Account)|交易(Transaction)|状态(State)|合约(Contract)
  • 本讲结构:12 个主题,从 Ethereum 的起源到 Bitcoin vs Ethereum 的体系对比

上讲回顾与本讲定位

  • 上讲(第 03 讲)核心:Bitcoin 的 PoW 共识、UTXO 模型、Script 脚本与多层次安全体系
  • 本讲位置:技术演进主线——从"电子现金"走向"世界计算机"
  • 关键追问:如果 Bitcoin 的脚本是"计算器",Ethereum 的智能合约如何成为"计算机"?
  • 预习回顾:Bitcoin 的能力边界(低吞吐、弱脚本)如何推动 Ethereum 的出现?

1.1 Bitcoin 的可编程性局限

  • Bitcoin 脚本系统是非图灵完备的:仅支持有限操作(签名验证、时间锁、哈希锁)
  • 脚本执行无状态概念:无法维护链上持久化的业务状态
  • 金融应用需要更复杂的逻辑:借贷条件、自动清算、多签治理、代币发行
  • 资产定义受限于原生 UTXO:无法在比特币上直接创建可编程的"自定义资产"
  • 结论:Bitcoin 提供了安全的"价值结算层",但缺乏通用可编程平台

1.2 Ethereum 的愿景:世界计算机

  • Ethereum 白皮书(2013, Vitalik Buterin)提出 "区块链 + 图灵完备虚拟机"
  • 核心目标:将区块链从"分布式账本"提升为"分布式状态机"
  • 设计原则:统一执行环境、链上状态存储、图灵完备(受 Gas 约束)
  • 意义:Ethereum 将区块链从"可转账系统"扩展为"可编程平台"

1.3 从"转账记录"到"全局状态"

  • Bitcoin 维护的是 UTXO 集:本质是"谁拥有什么"的账本

  • Ethereum 维护的是全局状态:账户余额 + 合约存储 + 代码 + nonce

  • 每笔交易在 Ethereum 中触发一次确定性的状态转换函数:

    σt+1=APPLY(σt,TX)\sigma_{t+1} = \text{APPLY}(\sigma_t, TX)

  • 状态机范式使 Ethereum 易于表达金融逻辑:

    • 状态 = 资产分布 + 业务数据
    • 交易 = 外部事件触发规则执行
    • 结果 = 状态按规则转换

2.1 Ethereum 发展时间线总览

  • 2013 年底:Vitalik Buterin 发布 Ethereum 白皮书
  • 2014 年中:以太坊众筹(ICO),筹集约 1800 万美元
  • 2015 年 7 月:Frontier 阶段——主网上线,初始 PoW 共识
  • 2016 年 3 月:Homestead 阶段——协议稳定,引入更多安全改进
  • 2016 年 6 月:The DAO 攻击事件——触发 Ethereum / Ethereum Classic 硬分叉
  • 2017-2019 年:Metropolis 阶段(Byzantium + Constantinople)——隐私、难度调整
  • 2020-2022 年:Beacon Chain 启动,走向 PoS
  • 2022 年 9 月:The Merge——成功切换到 PoS 共识
  • 2023 年至今:Layer 2 生态扩展(Rollups)、EIP-4844(Proto-Danksharding)

2.2 四大发展阶段及其设计目标

  • Frontier( frontier,2015):初始阶段,命令行界面,社区开发者参与协议测试
  • Homestead(2016):协议安全性与稳定性提升,引入更多 Solidity 编译器优化
  • Metropolis(2017-2019)
    • Byzantium 分叉:降低 EVM 操作 Gas 成本,增加隐私原语(zkSNARKs 预编译)
    • Constantinople 分叉:优化合约存储效率,推迟"难度炸弹"
  • Serenity(2022 起):从 PoW 到 PoS 的共识层升级(The Merge)
  • 每个阶段包含多次硬分叉:规则变更需要通过网络升级协调

2.3 从 PoW 到 PoS:共识与扩展路径

  • PoW 阶段(Frontier → Metropolis):
    • 矿工竞争计算哈希,出块时间约 12-15 秒
    • 能耗高、参与门槛高,但已被 PoW 证明安全可靠
  • PoS 阶段(The Merge 之后):
    • 验证者质押 32 ETH 参与共识,通过罚没(Slashing)约束行为
    • 能耗降低约 99.95%,为未来分片打下基础
  • 扩展路径:从"单体链"到"模块化"
    • Layer 1(执行层 + 共识层 + 数据可用性层)
    • Layer 2 Rollup(Optimistic / ZK):将执行移出链外,保留数据可用性与安全性

3.1 Ethereum 核心组件概览

Ethereum 系统由五个基本组件构成,共同支撑可编程区块链的运行:

  1. 账户(Account):状态的基本载体——持有余额、nonce、代码与存储
  2. 交易(Transaction):触发状态变更的签名消息(外部输入)
  3. 智能合约(Smart Contract):链上部署的规则代码——定义资产逻辑与业务状态转移条件
  4. EVM(Ethereum Virtual Machine):统一的合约执行环境——所有节点运行同一指令集
  5. Gas:对计算与存储的资源定价机制——防止资源滥用,确保网络可持续

3.2 核心组件详解(一):账户与交易

  • 账户的两种类型
    • EOA(Externally Owned Account):由私钥控制,拥有余额和 nonce
    • 合约账户(Contract Account):由合约代码控制,拥有余额、存储和代码哈希
  • 每个账户的数据结构
    • nonce:交易计数器(防重放)
    • balance:账户余额(以 wei 为单位)
    • storageRoot:存储树的 Merkle 根
    • codeHash:合约代码哈希(仅合约账户)
  • 交易的数据结构:from、to、value、data、nonce、gasLimit、maxFeePerGas、v/r/s(签名)

3.3 核心组件详解(二):EVM 与 Gas

  • EVM 的关键特征
    • 基于栈的虚拟机(Stack-based),256 位字长
    • 指令集约 140+ 条操作码(算术、存储、跳转、日志、调用等)
    • 每次执行是确定性的:相同输入必然产生相同输出
  • Gas 的双重作用
    • 计量功能:每条指令消耗预设 Gas(如 ADD=3、SLOAD=100、SSTORE=20000)
    • 经济约束:防止无限循环(图灵完备的必要约束)
  • Gas limit 机制:每个区块有总 Gas 上限,交易须在 Gas 耗尽前完成

4.1 什么是"全局状态"?

  • Ethereum 的"状态"是每个账户的完整快照,全局映射:

    σ[address]=(nonce,balance,storageRoot,codeHash)\sigma[\text{address}] = (\text{nonce}, \text{balance}, \text{storageRoot}, \text{codeHash})

  • 与 Bitcoin 的关键区别:Bitcoin 状态 = UTXO 集合;Ethereum 状态 = 所有账户的完整数据

  • 智能合约的存储(storage)是状态的一部分,由合约逻辑读写

  • 状态在每笔交易后确定性更新——所有节点最终持有相同状态

4.2 状态转换函数

  • Ethereum 本质上是一个基于交易的状态机(Transaction-Based State Machine)

  • 核心转换公式:

    σt+1=Υ(σt,T)\sigma_{t+1} = \Upsilon(\sigma_t, T)

    其中 Υ\Upsilon 是状态转换函数,输入当前状态 σt\sigma_t 和交易 TT,输出新状态 σt+1\sigma_{t+1}

  • 步骤梳理:

    1. 验证交易签名与 nonce
    2. 扣除发送者 gas 预付费用
    3. 执行交易(转账或合约调用)
    4. 处理合约执行(EVM 运行,状态读写)
    5. 退还剩余 gas,更新状态根

4.3 "世界计算机"隐喻的深刻含义

  • 共享执行:每个全节点独立执行所有交易——无须信任任何单一节点
  • 共享状态:合约状态对所有参与者一致可见——无须协调数据版本
  • 可组合性:合约可互相调用读写状态——如同程序函数调用
  • 金融含义:借贷协议实时获取清算价格;交易协议单笔原子操作完成多步逻辑
  • 局限:所有节点执行所有交易导致性能瓶颈——因此需要 Layer 2 扩展

5.1 EVM 的架构设计

  • EVM 是一个基于栈的准图灵完备虚拟机(准:受 Gas 约束)
  • 核心数据结构:
    • 栈(Stack):32 字节元素,最大深度 1024
    • 内存(Memory):字节寻址的易失性存储,交易执行期间有效
    • 存储(Storage):键值对形式的持久化存储(合约专属,昂贵)
  • 执行环境输入:
    • 调用数据(calldata)、合约代码(bytecode)、Gas 配额
  • 输出:
    • 状态变更(storage 写入)、事件日志(event logs)、返回值

5.2 EVM 执行流程详解

  • 步骤分解:
    1. 交易解析:解析 calldata、value、gas 参数
    2. 加载合约代码:从目标账户的 codeHash 读取 bytecode
    3. 逐条执行操作码:程序计数器(PC)指向下一条指令
    4. 状态读写:SLOAD/SSTORE 读取 / 写入合约存储
    5. 内部调用(CALL/STATICCALL/DELEGATECALL):调用其他合约
    6. 执行完成或回滚(REVERT/INVALID)
    7. 状态最终化:成功则提交状态变更,否则回滚(Gas 不退)
  • 关键属性:确定性——任何节点执行同一交易得到相同结果

5.3 操作码示例与 Gas 消耗

常见操作码及其 Gas 消耗(反映资源成本):

操作码 功能描述 Gas 消耗 说明
ADD / SUB 加减法 3 算术运算(低成本)
MUL / DIV 乘除法 5 略高于加减
SLOAD 读取存储 100(冷) 存储读取成本较高
SSTORE 写入存储 20000(设置) 存储写入成本最高
BALANCE 查询余额 700(冷) 账户访问成本
CALL 调用另一合约 700+ 包含子调用 Gas 传递
  • 设计逻辑:存储操作最昂贵,因为区块链状态的持久化成本远高于本地计算

6.1 外部账户(EOA)详解

  • 控制方式:由私钥签名授权,私钥持有者完全控制账户
  • 核心功能
    • 发起交易:转账 ETH、部署合约、调用合约函数
    • 签名验证:交易中的 v/r/s 字段由 EOA 私钥签名
  • 账户字段
    • nonce:发送交易的数量(防止重放攻击)
    • balance:账户持有的 ETH 余额
  • 关键性质
    • EOA 之间只能转账 ETH(不可直接触发逻辑)
    • EOA 无关联代码(无法执行自定义逻辑)
    • 创建成本为零(只需生成公私钥对)

6.2 合约账户详解

  • 控制方式:由合约代码控制——代码定义了对外部调用的响应逻辑
  • 创建方式:EOA 发送合约创建交易(to=空,data=初始化字节码)
  • 账户字段
    • nonce:合约账户也可有 nonce(由创建次数决定)
    • balance:合约持有的 ETH 余额
    • storageRoot:合约持久化存储的 Merkle 树根
    • codeHash:合约字节码的 Keccak-256 哈希
  • 关键性质
    • 合约不能主动发起交易——只能响应 EOA 或其他合约的调用
    • 合约代码不可变——部署后无法修改(但可通过代理模式实现可升级性)
    • 合约可持有和管理 ETH 和其他代币

6.3 交易结构与调用关系

  • Ethereum 交易的结构

    字段 说明
    from 发送方 EOA 地址
    to 目标地址(EOA 或合约)
    value 转账金额(wei)
    data 调用数据(calldata)
    nonce 发送方交易序号
    gasLimit 愿意支付的最大 Gas 量
    maxFeePerGas / maxPriorityFeePerGas EIP-1559 后的费用参数
  • 调用链:EOA 交易 \rightarrow 合约 A \rightarrow 合约 B \rightarrow ...

  • 消息调用(Message Call):合约到合约的调用,可传递数据和 ETH

7.1 Gas 机制的设计动机

  • Ethereum 是图灵完备的——理论上合约可包含无限循环
  • 若无 Gas 约束,攻击者可部署死循环合约消耗全网计算资源
  • Gas 的核心作用:计量(指令消耗透明)、经济约束(预付费用)、资源定价(操作反映实际成本)
  • 类比:预付油费(Gas 费),油尽则停车(执行终止),未完成变更全部回滚

7.2 Gas 计量明细

  • Gas 消耗的三个层面

    1. 交易基础费用(21,000 Gas):每笔交易必须付出的固定开销
    2. 操作码执行费用:根据指令类型动态计算
    3. 存储扩展费用:写入新存储槽位按每字节约 200 Gas 计价(EIP-2200 调整后)
  • Gas 与费用的区分(教学重点):

    • Gas 消耗 = 执行交易实际使用的计算/存储单位(由操作决定)
    • 交易费用(Transaction Fee)= Gas 消耗 ×\times Gas 单价(由市场决定)
    • Gas 单价在 EIP-1559 后分为:基础费(Base Fee)+ 小费(Priority Fee)
  • Gas limit 验证:交易指定的 gasLimit 必须至少等于实际消耗——否则交易失败

7.3 EIP-1559 与费用市场改革

  • EIP-1559(2021 年 8 月实施,伦敦硬分叉)
    • 废除第一价格拍卖模式,引入"基础费(Base Fee)+ 小费(Priority Fee)"
    • 基础费根据区块利用率动态调整(目标 50% 满载)
    • 基础费被销毁(Burn),减少 ETH 供应量
    • 小费直接支付给验证者,提供出块激励
  • 改革效果
    • 费用预测更准确(用户不再需要"盲目竞价")
    • 减少交易确认延迟(复杂金融操作可预估成本)
    • ETH 通货紧缩压力(部分供应量被销毁)
  • 教学要点:理解 EIP-1559 需要区分 "Base Fee" 与 "Priority Fee" 的不同经济含义

8.1 智能合约的定义与特征

  • 智能合约:部署在区块链上的可执行代码,由 EVM 解释执行
  • 五大特征:确定性执行、透明可审计、自动触发、不可篡改、可组合
  • 金融含义:合约不仅是"自动执行合同",更是"可编程资产规则"——代币发行、借贷逻辑、交易结算均可编码

8.2 最简 ERC-20 合约代码分析

contract SimpleToken {
    mapping(address => uint256) public balanceOf;
    event Transfer(address indexed from, address indexed to, uint256 value);

    constructor(uint256 _supply) { balanceOf[msg.sender] = _supply; }

    function transfer(address to, uint256 amount) external returns (bool) {
        require(balanceOf[msg.sender] >= amount, "insufficient balance");
        balanceOf[msg.sender] -= amount;
        balanceOf[to] += amount;
        emit Transfer(msg.sender, to, amount);
        return true;
    }
}
  • 教学要点:仅约 15 行代码即可定义一种可转账、可验证、可持有的数字资产

8.3 "Code is Law" 的实践与反思

  • "Code is Law" 的核心理念
    • 合约代码即是最终规则——不存在"合约之上的解释权"
    • 执行结果由数学保证,不依赖于任何第三方的善意
  • 现实挑战
    • 代码漏洞可能导致资产损失(如 The DAO 重入攻击)
    • 权限设计失误:管理员地址可单方面提取资金(rug pull 风险)
    • 外部依赖风险:预言机数据错误、组合协议间的不兼容
    • 治理困境:合约不可修改意味着 bug 无法修复;可升级合约又引入信任假设
  • 教学要点:智能合约的"自动性"不等于"安全性"——代码质量、权限模型、外部依赖都需要审慎评估

9.1 DApp 架构总览

  • DApp(Decentralized Application):至少由以下三层构成:

    用户交互层(前端 UI / 移动端)
          ↕  (通过钱包签名)
    合约执行层(智能合约逻辑 + 状态)
          ↕  (链上数据索引与查询)
    数据层(区块链账本 + 事件日志)
    
  • 与传统 App 的本质区别:

    • 后端逻辑不由单一服务器执行,而是由全节点分布式执行
    • 数据不由单一数据库管理,而是由链上状态维护
    • 用户控制私钥——服务提供者无法擅自操作资产

9.2 DApp 各组件详解

  • 前端界面
    • HTML / CSS / JavaScript(React, Vue, Next.js 等)
    • 通过 Web3 库(ethers.js、web3.js)与链交互
  • 钱包交互
    • 用户使用 MetaMask、Rabby、WalletConnect 等签署交易
    • 钱包管理私钥——前端无法直接操作资产
  • 智能合约
    • 核心业务逻辑:代币管理、借贷计算、交易配对、治理投票
    • 部署后公开可验证——用户可检查合约逻辑是否符合声称
  • 链上数据与事件日志
    • Event Logs 提供低成本的状态变更记录
    • The Graph、Dune Analytics 等工具索引事件,提供服务端查询能力
    • 业务追踪:用户历史交易、清算事件、流动性变化等

9.3 DApp 生态的演进

  • 第一代(2015-2017):代币发行 + ICO;用户体验差(Gas 费高、确认慢)
  • 第二代(2018-2021):DeFi 协议崛起(Uniswap、Compound、Aave)、AMM 交易模式、链上治理
  • 第三代(2022 至今):Layer 2 降低 Gas、账户抽象(ERC-4337)、模块化 DeFi
  • 趋势:用户体验接近 Web2,安全性与透明度超越 Web2

10.1 ERC-20:为什么需要代币标准化?

  • ERC-20(Ethereum Request for Comments 20):Fabian Vogelsteller 和 Vitalik Buterin 于 2015 年提出
  • 标准化动机:此前每个代币合约定义独有转账接口,钱包/交易所需逐一适配,互换性与流动性受限
  • ERC-20 核心贡献:统一接口函数与事件,任何遵循 ERC-20 的代币均可被通用接入——降低协同成本,提升互操作性

10.2 ERC-20 接口规范详解

  • 必需函数(Mandatory Functions):totalSupply、balanceOf、transfer、approve、transferFrom、allowance
  • 必需事件Transfer(from, to, value)Approval(owner, spender, value)
  • 教学要点:approve / transferFrom 双步机制支持"授权转账"——是 DeFi 借贷和 DEX 的基础

10.3 ERC-20 的金融含义与影响

  • ERC-20 是 DeFi 的基石:借贷协议依靠 balanceOf/approve 管理抵押品;DEX 利用 transferFrom 即时结算;治理代币通过 ERC-20 聚合投票权
  • 原生代币 vs ERC-20:ETH 由协议底层定义(支付 Gas);ERC-20 由合约定义(业务层资产/权益/治理权)
  • 后续标准扩展:ERC-721(NFT)、ERC-1155(多代币)、ERC-4626(代币化金库)

11.1 DAO 的基本概念

  • DAO(Decentralized Autonomous Organization):将治理规则写入智能合约的链上组织形式
  • 核心理念:规则透明(代码公开)、执行自动(合约自动执行)、全球参与
  • 历史里程碑:2016 年"The DAO"(首个大规模实验,募集 1.5 亿美元 ETH);2020 年后 DeFi 协议广泛采用 DAO 治理;2021 年后 DAO 工具化(Snapshot、Tally、Aragon)

11.2 DAO 的核心组成部分

  • 治理代币:代表投票权或经济权益,按代币数量加权
  • 提案机制:成员描述待执行的行动(参数修改、资金分配、协议升级),包含目标合约地址与调用数据
  • 投票机制:常见模式有简单多数、加权投票、二次方投票;投票期 3-7 天;达到法定人数(Quorum)后通过
  • 执行:提案通过后触发 Timelock 合约执行,结果自动写入链上(不可逆)

11.3 DAO 的现实挑战

  • 治理失灵(Governance Failure)
    • 低投票参与率导致少数持币者控制决策
    • 大型代币持有者(鲸鱼)可能主导投票结果
    • 闪电贷攻击:临时借入大量代币操纵投票(无成本治理攻击)
  • 执行风险
    • 提案逻辑缺陷可能被利用(如 2022 年 BeanStalk DAO 攻击)
    • 多签管理员的权限过大与 DAO "去中心化" 理念矛盾
  • 激励不一致
    • 投票者缺乏深入研究提案的动力("理性冷漠")
    • 短期利益可能压倒协议长期健康发展
  • 教学定位:DAO 是链上治理的重要实验,但远未成熟——治理机制设计本身是重要的研究领域

12.1 Bitcoin vs Ethereum:系统定位对比

维度 Bitcoin Ethereum
核心定位 去中心化数字现金 + 价值存储 去中心化通用可编程平台
状态模型 UTXO 集(交易输出) 账户余额 + 合约存储(全局状态)
图灵完备 否(脚本非图灵完备) 是(受 Gas 约束)
编程模型 受限脚本(锁定脚本/解锁脚本) Solidity / Vyper 等高级语言编译为 EVM 字节码
共识机制 PoW(SHA-256,当前) PoS(Casper FFG + LMD-GHOST,2022 年后)
扩展策略 链下(Lightning Network) Layer 2 Rollups + 分片(Danksharding)
代币发行 仅原生 BTC 原生 ETH + 任意 ERC-20 / ERC-721 等

12.2 架构对比:可编程性的差异

  • Bitcoin 的脚本模型
    • 脚本仅验证 UTXO 花费条件(签名、时间锁、哈希锁)
    • 无链上持久化"状态"概念——无法维护业务数据
    • 无循环(非图灵完备)——递归验证被设计排除
  • Ethereum 的合约模型
    • 账户可持有复杂的持久化数据结构(mappings、arrays、structs)
    • 合约逻辑可包含条件分支、循环、内部调用——表达能力强于 Bitcoin 脚本数个量级
    • 合约间可自由组合(Composability)——构建复杂的金融协议栈
  • 金融含义
    • Bitcoin 更适合简单、安全的支付与结算场景
    • Ethereum 适用于需要复杂状态管理的金融应用(借贷、交易、衍生品)

12.3 Ethereum 作为后续创新的基础

  • DeFi 生态的基石
    • 自动化做市商(AMM):Uniswap、Curve
    • 借贷协议:Aave、Compound
    • 合成资产:Synthetix
    • 收益聚合:Yearn Finance
  • NFT 与数字所有权
    • ERC-721 / ERC-1155 定义非同质化资产
    • 数字艺术、游戏资产、身份凭证的链上表达
  • Layer 2 扩展
    • Optimistic Rollups(Optimism、Arbitrum)
    • ZK Rollups(zkSync、StarkNet)
    • 解决 Ethereum 性能瓶颈,同时继承其安全性
  • 总结:理解 Ethereum 的账户 / 状态 / EVM / Gas 机制,是理解 DeFi、NFT、Rollup 等技术的基础

本讲延伸思考

  • 思考题 1:Gas 机制在防止资源滥用的同时,是否也限制了某些有正当需求的应用?如何平衡?
  • 思考题 2:DAO 的"去中心化"理想与现实中的"鲸鱼控制"之间存在张力——设计更优治理机制的可能方向?
  • 预习提示:下讲将深入分析智能合约安全——以 The DAO 重入攻击为例,探讨漏洞原理、分叉决策与治理权衡