以太坊虚拟机(EVM)是一个基于栈架构的准图灵完备执行环境,所有的智能合约字节码最终都由 EVM 进行解释或 JIT 执行。在 EVM 内存模型中,状态被分为只读的代码区(Code)、非持久且按需扩容的内存区(Memory)、用于算术与逻辑运算的执行栈(Stack,深度限制 1024 槽位),以及开销极高的持久化存储(Storage,以 32 字节 Key-Value 映射树组织)。在 Solidity 智能合约的安全历史中,最具破坏性的漏洞莫过于重入攻击(Reentrancy Attack),其臭名昭著的受害者即为引发以太坊硬分叉的 The DAO 事件。重入攻击的本质原因在于:当合约向外部地址发送原生代币(ETH)时,若目标地址是合约账户,EVM 会默认调用该目标地址的 receive() 或 fallback() 回调函数。若当前合约在转账发生前未完成内部状态更新,攻击者可以在回调函数中再次调用该提现函数,形成恶意递归:Solidity// 危险实现:Checks-Effects-Interactions 原则被破坏 function withdraw() public { uint256 balance = balances[msg.sender]; require(balance > 0);
(bool success, ) = msg.sender.call{value: balance}(""); // 触发外部回调
require(success);
balances[msg.sender] = 0; // 状态更新滞后,攻击者在此前重复重入} 防范重入的核心准则是遵循 CEI 原则(Checks-Effects-Interactions):在与外部不可信实体产生任何交互之前,必须先完成本地状态变更。此外,继承 OpenZeppelin 的 ReentrancyGuard 并为关键函数挂载 nonReentrant 互斥锁修饰器,是生产环境合约不可逾越的底线。