level | 标题 | 考察点 |
---|---|---|
level0 | HelloEthernaut | 了解如何用浏览器控制台在ethernaut中交互 |
level1 | Fallback | 了解fallback/receive函数, 提供ethernaut命令行和remix两种解决方法 |
level2 | Fallout | 了解constructor构造函数 |
level3 | Coinflip | 了解合约的可预测性,调用前模拟调用结果 |
level4 | Telephone | 了解tx.origin和tx.sender差别 |
level5 | Token | 老版本solidity中uint溢出漏洞 |
level6 | Delegation | 学习如何使用delegatecall |
level7 | Force | 了解selfdestruct 用法 |
level8 | Vault | 理解solidity中不存在真正private的变量,掌握读取storage内容的方法 |
level9 | King | 了解receive函数的触发和执行特点 |
level10 | Reentrancy | 了解重入漏洞和对应防护方式 |
level11 | Elevator | 合约函数如何实现同样入参在不同的调用点返回不同的值 |
level12 | Privacy | 合约storage存储规则入门 |
level13 | GatekeeperOne | 变量转换逻辑和跨合约调用的gas限制 |
level14 | GatekeeperTwo | contructor函数中调用外部合约的特殊逻辑 |
level15 | NaughtCoin | ERC-20 常见接口的使用方式 |
level16 | Preservation | delegatecall 的使用方法,多次调用达到攻击目标 |
level17 | Recovery | CREATE 操作码创建合约时的合约地址生成规则 |
level18 | MagicNumber | 合约编译生成的字节码规范,字节码与操作码的关系,字节码执行逻辑 |
- 有些涉及调试过程和测试代码,我使用的
vscode + foundry
开发测试。为了对foundry
的工程有更好的适配,建议vscode
做如下配置
{
...
"solidity.remappings": [
"forge-std/=lib/forge-std/src/",
"@openzeppelin/=lib/openzeppelin-contracts/"
],
"solidity.packageDefaultDependenciesContractsDirectory": "lib",
"solidity.packageDefaultDependenciesDirectory": "src",
"[solidity]": {
"editor.defaultFormatter": "JuanBlanco.solidity"
},
"solidity.formatter": "forge"
...
}
- 安装foundry 依赖:
forge install OpenZeppelin/openzeppelin-contracts --no-commit