Loading...
Loading...
Compare original and translation side by side
Master smart contract security with vulnerability detection, auditing methodology, and incident response procedures.
通过漏洞检测、审计方法论和事件响应流程掌握智能合约安全。
undefinedundefinedundefinedundefined// VULNERABLE
function withdraw(uint256 amount) external {
(bool ok,) = msg.sender.call{value: amount}("");
require(ok);
balances[msg.sender] -= amount; // After call!
}
// FIXED: CEI Pattern
function withdraw(uint256 amount) external {
balances[msg.sender] -= amount; // Before call
(bool ok,) = msg.sender.call{value: amount}("");
require(ok);
}// 存在漏洞
function withdraw(uint256 amount) external {
(bool ok,) = msg.sender.call{value: amount}("");
require(ok);
balances[msg.sender] -= amount; // 调用后执行!
}
// 修复方案:CEI模式
function withdraw(uint256 amount) external {
balances[msg.sender] -= amount; // 调用前执行
(bool ok,) = msg.sender.call{value: amount}("");
require(ok);
}// VULNERABLE
function setAdmin(address newAdmin) external {
admin = newAdmin; // Anyone can call!
}
// FIXED
function setAdmin(address newAdmin) external onlyOwner {
admin = newAdmin;
}// 存在漏洞
function setAdmin(address newAdmin) external {
admin = newAdmin; // 任何人都可调用!
}
// 修复方案
function setAdmin(address newAdmin) external onlyOwner {
admin = newAdmin;
}// VULNERABLE
IERC20(token).transfer(to, amount); // Ignored!
// FIXED: Use SafeERC20
using SafeERC20 for IERC20;
IERC20(token).safeTransfer(to, amount);// 存在漏洞
IERC20(token).transfer(to, amount); // 忽略返回值!
// 修复方案:使用SafeERC20
using SafeERC20 for IERC20;
IERC20(token).safeTransfer(to, amount);// VULNERABLE: Division before multiplication
uint256 fee = (amount / 1000) * rate;
// FIXED: Multiply first
uint256 fee = (amount * rate) / 1000;// 存在漏洞:先除法后乘法
uint256 fee = (amount / 1000) * rate;
// 修复方案:先乘法后除法
uint256 fee = (amount * rate) / 1000;undefinedundefinedundefinedundefined// Foundry fuzz test
function testFuzz_Withdraw(uint256 amount) public {
amount = bound(amount, 1, type(uint128).max);
vm.deal(address(vault), amount);
vault.deposit{value: amount}();
uint256 before = address(this).balance;
vault.withdraw(amount);
assertEq(address(this).balance, before + amount);
}// Foundry模糊测试
function testFuzz_Withdraw(uint256 amount) public {
amount = bound(amount, 1, type(uint128).max);
vm.deal(address(vault), amount);
vault.deposit{value: amount}();
uint256 before = address(this).balance;
vault.withdraw(amount);
assertEq(address(this).balance, before + amount);
}function invariant_BalancesMatchTotalSupply() public {
uint256 sum = 0;
for (uint i = 0; i < actors.length; i++) {
sum += token.balanceOf(actors[i]);
}
assertEq(token.totalSupply(), sum);
}function invariant_BalancesMatchTotalSupply() public {
uint256 sum = 0;
for (uint i = 0; i < actors.length; i++) {
sum += token.balanceOf(actors[i]);
}
assertEq(token.totalSupply(), sum);
}| Severity | Impact | Examples |
|---|---|---|
| Critical | Direct fund loss | Reentrancy, unprotected init |
| High | Significant damage | Access control, oracle manipulation |
| Medium | Conditional impact | Precision loss, timing issues |
| Low | Minor issues | Missing events, naming |
| 严重程度 | 影响 | 示例 |
|---|---|---|
| 关键 | 直接资金损失 | 重入漏洞、未受保护的初始化 |
| 高 | 重大损害 | 访问控制缺失、预言机操纵 |
| 中 | 有条件影响 | 精度丢失、时间相关问题 |
| 低 | 轻微问题 | 缺失事件、命名不规范 |
undefinedundefinedundefinedundefined// Emergency pause
function pause() external onlyOwner {
_pause();
}// 紧急暂停
function pause() external onlyOwner {
_pause();
}| Pitfall | Risk | Prevention |
|---|---|---|
| Only testing happy path | Missing edge cases | Fuzz test boundaries |
| Ignoring integrations | External call risks | Review all dependencies |
| Trusting block.timestamp | Miner manipulation | Use for long timeframes only |
| 陷阱 | 风险 | 预防措施 |
|---|---|---|
| 仅测试正常流程 | 遗漏边缘情况 | 对边界进行模糊测试 |
| 忽略集成风险 | 外部调用风险 | 审查所有依赖项 |
| 信任block.timestamp | 矿工操纵 | 仅用于长时间段场景 |
06-smart-contract-securitysolidity-developmentdefi-protocols06-smart-contract-securitysolidity-developmentdefi-protocols| Version | Date | Changes |
|---|---|---|
| 2.0.0 | 2025-01 | Production-grade with tools, methodology |
| 1.0.0 | 2024-12 | Initial release |
| 版本 | 日期 | 变更 |
|---|---|---|
| 2.0.0 | 2025-01 | 生产级版本,包含工具、方法论 |
| 1.0.0 | 2024-12 | 初始版本 |