什么是 EOA 和合约账户?钱包地址与合约地址到底有什么区别
EOA 由私钥控制,合约账户由代码控制。本文讲清地址、钱包、签名、Nonce、多签和智能账户之间的区别与常见风险。
钱包里看到一个 0x 开头的地址,区块浏览器也显示它有余额。它可能是某个人用私钥控制的账户,也可能是一段部署在链上的程序。两者都能收 ETH 和代币,地址长度看起来也一样,但谁能让它行动、收到调用后会发生什么,完全不同。
以太坊传统账户模型把账户分成两类:外部拥有账户(EOA)由私钥控制,合约账户由代码控制。理解这一区别,能帮助你看懂交易发起者、合约交互、多签钱包、授权和智能账户。
地址只是链上标识;真正决定行为的是背后的密钥或代码。
什么是 EOA
EOA 是 Externally-Owned Account 的缩写,通常由一对密码学密钥控制。私钥用来签名,网络据此验证一笔交易确实得到该账户控制者授权。创建新 EOA 本身不需要在链上部署代码,因此不产生部署 Gas。
传统交易由 EOA 签名并提交:转 ETH、调用代币合约、在 DEX 兑换,本质上都是 EOA 发起交易,再由网络执行。谁掌握私钥或助记词,谁就能产生有效签名;丢失密钥时,链上没有“忘记密码”按钮。

钱包、账户和地址不是同一个东西
钱包是帮助管理密钥、展示资产和构造交易的应用或设备;账户是链上状态中的实体;地址是识别账户的 20 字节标识。换钱包应用导入同一助记词,通常仍在控制原来的 EOA,资产没有从一个应用“搬”到另一个应用。
什么是合约账户
合约账户是部署到网络的智能合约。创建它需要执行部署交易并保存代码,因此要支付 Gas。它没有像 EOA 那样的私钥,收到消息调用时,EVM 按合约代码处理:可以修改存储、转移资产、调用其他合约,也可以回退拒绝操作。
一个合约账户能否转出资产,取决于代码定义的条件。可能需要多个所有者签名、时间锁、角色权限或治理投票,也可能因为代码没有提款入口而永远无法主动转出。

两类账户的核心差异
| 维度 | EOA | 合约账户 |
|---|---|---|
| 控制方式 | 私钥签名 | 合约代码与其状态 |
| 创建 | 链下生成密钥即可 | 需要链上部署并支付 Gas |
| 代码 | 没有运行时代码 | 地址上有 EVM 代码 |
| 传统模型下主动发起 | 可以签名交易 | 响应调用后发送消息 |
| 恢复能力 | 取决于密钥备份 | 可由代码设计恢复规则 |
账户在链上保存什么
Ethereum 官方文档把账户描述为包含 nonce、ETH 余额、codeHash 和 storageRoot 等字段。EOA 的 codeHash 对应空代码,合约账户则关联运行时代码;合约存储由 storageRoot 概括。两类账户都能持有 ETH,代币余额通常记录在代币合约自己的映射中,而不是直接塞进账户余额字段。
Nonce 的含义也略有不同
对 EOA,nonce 通常记录已发送交易的序号,确保同一序号的签名交易不能重复执行,也决定交易顺序。对合约账户,nonce 与它创建合约的次数有关。不要把 EOA 的“交易 nonce”规则机械套到所有合约内部操作。
如何初步判断一个地址是哪类
区块浏览器通常标记 Contract,并展示源码、代理和读写入口;RPC 也能读取地址代码。若当前代码为空,常被视为 EOA,但这不是完整安全判断:地址可能尚未部署、合约可能在构造期间,某些系统还有特殊账户语义。更不能因为“不是合约”就认定对方身份真实可信。
同样的转账,结果为什么不同
给 EOA 转 ETH,通常只是更新双方余额;给合约账户转 ETH,可能触发 receive 或 fallback 并执行代码,也可能因入口不可支付而回退。给任何地址转 ERC-20 代币,则是在代币合约中修改余额记录,接收地址本身未必执行代码或知道代币已经到账。
多签钱包为什么常是合约账户
多签可以把控制规则写进合约:例如三位所有者中两位批准才执行,或超过限额必须等待。所有者的 EOA 提交签名,合约验证规则后执行目标调用。资产属于多签合约地址,不属于某个签名人的 EOA。
智能账户让边界变得更灵活
账户抽象允许合约钱包提供批量操作、会话密钥、社交恢复、Gas 代付等能力。用户体验上,它可以像账户一样“发起操作”,而底层通常通过专门入口与打包流程执行。因此“合约账户永远不能主动操作”只适合描述传统交易起点,不应被当成现代钱包体系的完整结论。
签名能力与代码能力各有风险
- EOA 风险集中在私钥泄露、钓鱼签名和错误备份。
- 合约账户风险包括代码漏洞、权限配置、升级管理员和依赖合约。
- 智能账户还要检查验证模块、恢复人、会话权限和代付规则。
- 两者都可能被伪装名称、相似地址和错误网络误导。
向地址转账前的检查
- 确认网络、币种和完整目标地址。
- 查看地址是否为合约、代理或已知存款入口。
- 确认对方是否支持该代币与该网络。
- 理解操作是普通转账还是函数调用。
- 大额前先做可识别的小额测试。
- 不要把浏览器标签或头像当成身份保证。
官方资料
账户类型、字段与钱包区别参考 Ethereum.org:Ethereum Accounts;智能账户发起写操作的现代说明参考 Ethereum.org:Interacting with Smart Contracts。不同 EVM 网络与账户抽象实现可能有额外规则。
EOA 和合约账户不是“真人地址”与“机器人地址”的简单区别。前者把授权根放在私钥,后者把授权与行为写进代码。看懂一个地址,既要看谁能提供有效授权,也要看收到授权后究竟会执行哪些规则。
本文为链上指南原创科普内容,不构成任何投资建议。私钥、签名和智能合约均可能带来不可逆风险,操作前请独立核对地址、网络、权限与代码信息。