欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

以太坊虚拟机(EVM)架构与智能合约重入攻击防范

发表于:|最后更新:|分类:前沿技术|阅读:5989 次

以太坊虚拟机(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);

text
(bool success, ) = msg.sender.call{value: balance}(""); // 触发外部回调
require(success);

balances[msg.sender] = 0; // 状态更新滞后,攻击者在此前重复重入

} 防范重入的核心准则是遵循 CEI 原则(Checks-Effects-Interactions):在与外部不可信实体产生任何交互之前,必须先完成本地状态变更。此外,继承 OpenZeppelin 的 ReentrancyGuard 并为关键函数挂载 nonReentrant 互斥锁修饰器,是生产环境合约不可逾越的底线。