Solidity面试题更新 2026-08-03

请解释 Solidity 智能合约中的重入攻击是什么,并说明有哪些防御方法?

考察说明

考察对智能合约安全漏洞重入攻击的理解及防御措施的掌握

回答思路

  1. 【回答框架 1】重入攻击是指合约在外部调用(如转账)时,被调用的恶意合约在被调用函数完成前再次进入原合约函数,导致状态未更新而重复执行关键逻辑。攻击核心是利用回调(如 receive/fallback 函数)和以太坊的交易原子性。
  2. 【回答框架 2】防御方法一:检查-效应-交互模式,先更新状态变量,再执行外部调用,确保调用前状态已生效,从而阻断重入条件。
  3. 【回答框架 3】防御方法二:使用互斥锁(如 OpenZeppelin 的 ReentrancyGuard),通过状态标志位确保同一函数不可重入,简单可靠。
  4. 【回答框架 4】防御方法三:使用转账限制(如 transfer 限制 gas)或采用 Pull Payment 模式,将支付与业务逻辑分离,降低重入风险。
  5. 【回答框架 5】综合建议:结合多种防御手段,并在设计合约时遵循最小化外部调用原则,必要时使用专业审计工具检测漏洞。
  6. 【关键点 1】重入攻击依赖于外部调用期间的函数重入,状态更新滞后是根源。
  7. 【关键点 2】检查-效应-交互模式是最基础的防御手段,需先更新状态。
  8. 【关键点 3】互斥锁可简单有效防止重入,但注意 gas 消耗。
  9. 【关键点 4】使用 transfer 限制 gas 仅对部分情况有效,不能完全依赖。
  10. 【关键点 5】Pull Payment 模式将支付分离,提升安全性。
  11. 【易错点 1】忽略外部调用的风险,在调用前未更新状态,导致重入漏洞。
  12. 【易错点 2】过度依赖 transfer 的 2300 gas 限制,可能因编译器版本或 EVM 变化而失效。
  13. 【易错点 3】使用互斥锁时未考虑跨函数重入,或锁粒度设计不当。