以太坊作为全球第二大公链,其核心设计之一是独特的账户体系,它支撑了智能合约、去中心化应用(DApps)以及复杂经济模型的运行,以太坊中的账户主要分为两类:外部账户(Externally Owned Account, EOA)和合约账户(Contract Account),两者在功能、权限、交互方式及底层逻辑上存在显著差异,共同构成了以太坊“账户抽象”框架的基础,本文将深入解析这两类账户的特点,帮助读者理解以太坊生态的运行逻辑。
外部账户是由用户通过私钥控制的账户,是普通人参与以太坊生态的主要入口,其核心特点是“私钥所有权驱动”,本质上是链上身份与资产控制的载体。
外部账户的所有权完全由用户持有的私钥决定,私钥的生成与存储在链下(如硬件钱包、MetaMask等钱包工具),用户通过签名交易来控制账户行为,由于没有智能合约代码,外部账户本身不具备“自主执行逻辑”的能力,其所有操作(如转账、调用合约)均由用户主动触发。

外部账户的地址由公钥通过Keccak-256哈希算法生成,长度为20字节(通常以“0x”开头),地址的唯一性确保了账户在链上的独立性,类似于传统银行账户的“账号”,但所有权完全归属私钥持有者。

外部账户的核心功能包括:
由于外部账户没有代码逻辑,其权限完全由私钥持有者控制,用户可自由决定转账金额、目标地址,且账户本身不存在“余额不足”“权限冻结”等内置限制(但交易需满足网络规则,如gas费充足),这种设计确保了用户对资产的绝对控制权,但也要求用户妥善保管私钥——一旦丢失,账户资产将永久无法找回。
合约账户是由智能合约代码控制的账户,其本质是“可编程的账户”,由外部账户或其他合约账户通过交易部署生成,合约账户的运行逻辑完全由代码定义,是以太坊实现“可编程性”的核心载体。

与外部账户不同,合约账户的所有权归属其代码逻辑,账户中存储了代码(Code)和存储(Storage)两部分:代码定义了账户的行为规则(如接收ETH时的逻辑、转账条件等),存储则记录账户的状态数据(如合约变量、用户余额等),合约账户的执行由外部账户或合约账户的交易触发,遵循“代码即法律”原则。
合约账户的地址同样为20字节,生成方式与外部账户不同:当外部账户发起“合约创建交易”时,以太坊会随机生成一个地址,并通过CREATE或CREATE2 opcode与部署者地址、nonce等参数关联,地址格式的一致性使得链上系统无需区分账户类型,但可通过EXTCODESIZE等opcode判断地址是否为合约账户。
合约账户的功能远超简单的资产存储,其核心价值在于“可编程性”:
合约账户的权限完全由代码定义,其行为受预设规则限制。
外部账户与合约账户并非孤立存在,而是通过“交易”紧密协同,共同支撑以太坊生态的运行:
| 特性 | 外部账户(EOA) | 合约账户 |
|---|---|---|
| 控制权 | 私钥持有者(用户) | 智能合约代码 |
| 代码逻辑 | 无 | 有(定义行为规则) |
| 发起交易能力 | 可主动发起交易 | 仅响应外部/合约账户的调用 |
| 资产存储 | 存储ETH及ERC-20代币 | 可存储资产,但受代码规则约束 |
| 典型场景 | 用户钱包、转账、DApp交互入口 | DeFi协议、NFT合约、DAO治理 |