Files
nexus/wiki/concepts/ChecksEffectsInteractions.md
2026-05-03 05:42:12 +08:00

1.4 KiB
Raw Blame History

title, type, tags, last_updated
title type tags last_updated
ChecksEffectsInteractions concept
2026-05-01

Definition

checks-effects-interactions 是 Solidity 智能合约开发的核心安全原则,规定函数内操作必须按以下顺序执行:

  1. Checks验证前置条件require/assert 语句)
  2. Effects:更新合约内部状态(状态变量修改)
  3. Interactions执行外部调用token transfer、合约调用等

Why It Matters

违反此顺序会导致 重入攻击Reentrancy Attack。如果外部调用在状态更新之前执行,攻击者的恶意合约可以在状态仍然显示"资金未提取"的情况下递归调用 withdraw(),反复提取资金。

Vulnerable Pattern (违反 CEI)

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount);
    // ❌ 外部调用在状态更新之前
    msg.sender.call{value: amount}("");
    balances[msg.sender] -= amount; // 太晚了
}

Secure Pattern (遵循 CEI)

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount);
    balances[msg.sender] -= amount; // ✅ 先更新状态
    emit Withdrawal(msg.sender, amount);
    msg.sender.call{value: amount}(""); // ✅ 最后外部调用
}

Sources