Web3专业术语
Reentrancy
重入攻击 · 智能合约最经典的致命漏洞
合约安全智能合约
REEN
- 定义
- Reentrancy是Web3领域的专业术语。重入攻击利用合约在转账时将控制权交给外部合约的特性,恶意合约在回调中反复调用提款函数,在余额更新前多次提取资金。
最后更新:2026-03-18
什么是Reentrancy?
重入攻击利用合约在转账时将控制权交给外部合约的特性,恶意合约在回调中反复调用提款函数,在余额更新前多次提取资金。The DAO 事件就是重入攻击。
- 智能合约最经典的安全漏洞
- 利用外部调用的回调机制
- The DAO 事件的根本原因
Reentrancy详解
重入攻击的原理:合约 A 向合约 B 转账时,B 的 receive/fallback 函数被触发,B 在回调中再次调用 A 的提款函数,此时 A 的余额尚未更新,导致重复提款。防御方式:Checks-Effects-Interactions 模式(先更新状态再转账)、ReentrancyGuard 互斥锁、使用 transfer 限制 gas。2016 年 The DAO 因重入漏洞损失 6000 万美元,直接导致以太坊硬分叉。
Reentrancy的应用场景
正式定义
智能合约因外部调用重入导致状态不一致的安全漏洞
应用场景
- 智能合约的安全审计
- DeFi 协议的漏洞检测
- Solidity 开发的安全最佳实践
常见误区
- 重入不只发生在 ETH 转账,ERC-20 的回调也可能触发
- Checks-Effects-Interactions 模式是最基本的防御
- 现代 Solidity 版本和工具已能检测大部分重入风险
实际案例
📌 The DAO 事件
2016 年 The DAO 因重入漏洞被攻击者提取了 360 万 ETH(当时约 6000 万美元),以太坊社区为此进行了硬分叉,分裂出 ETH 和 ETC。
Reentrancy的参考来源
关于Reentrancy的常见问题
- 重入攻击是怎么发生的
- 合约在转账时调用外部合约,外部合约在转账完成前再次调用原合约的提款函数,反复提取资金。
- 怎么防止重入攻击
- 使用 Checks-Effects-Interactions 模式、OpenZeppelin 的 ReentrancyGuard、或先更新状态再转账。