1.4 KiB
1.4 KiB
title, type, tags, last_updated
| title | type | tags | last_updated |
|---|---|---|---|
| ChecksEffectsInteractions | concept | 2026-05-01 |
Definition
checks-effects-interactions 是 Solidity 智能合约开发的核心安全原则,规定函数内操作必须按以下顺序执行:
- Checks:验证前置条件(require/assert 语句)
- Effects:更新合约内部状态(状态变量修改)
- 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}(""); // ✅ 最后外部调用
}