5 个阶段 · 约 60–80 小时 · 5 个阶段
开发者路径
从第一行 Solidity 到通过审计上线主网,走完一条完整的工程链路。
- 适合谁
- 会写代码、想把合约送上线的人
- 先修条件
- 任意一门编程语言基础(变量、函数、类即可,不需要区块链经验)
- 随堂练习
- 4 个可在线运行
1
Solidity 语言基础
含在线练习把 Solidity 当成一门普通语言先学会,不碰框架、不碰部署,专心理解语法与类型系统。
需要掌握的知识点
- 值类型与引用类型:uint / address / bytes / string / struct / mapping / array
- 函数可见性与状态可变性:public / external / internal / private、view / pure / payable
- 修饰器 modifier、事件 event、自定义错误 error 与 require / revert / assert 的取舍
- 存储布局:storage / memory / calldata 三者的成本差异与复制规则
- 合约继承、接口 interface、库 library、抽象合约
完成标志
能不看资料手写一个带权限控制、事件、自定义错误的代币合约,并解释每一行的作用。
这一段要让你看懂:合约里的金额永远是整数,小数只存在于你的显示层。几乎所有「金额少了一位」的 bug 都出在 decimals 上。
▶
试一试 · 单位换算与地址校验
可直接改代码 · 在浏览器沙箱里真跑playground.js(已注入 ethers v6)JavaScript
运行环境:iframe 沙箱(无 cookie 权限)。只支持纯 JS 片段,不支持 import / require;需要模块请用下方的完整示例复制到项目里。
检查点(跑完后逐条核对)
- 1 ETH 显示为 1000000000000000000 wei
- 100 USDC 显示为 100000000(6 位小数)
- 2500000 且 decimals=6 还原为 1.0 USDC
- 被改过一位的地址抛出 bad address checksum
2
Hardhat / Foundry 工程化
含在线练习把「能跑的代码」变成「可维护的项目」:写测试、跑覆盖率、管理多网络部署。
需要掌握的知识点
- Foundry 优先:forge init / forge test / forge script / anvil 本地链
- Hardhat 对照:hardhat.config.ts、hardhat-deploy、TypeChain 类型生成
- 单元测试与模糊测试(fuzz):不变量测试 invariant testing
- 主网分叉测试(fork testing):在本地复现真实协议状态
- 基于 OpenZeppelin 的标准化实现与 upgradeable 变体差异
- 环境变量与私钥管理:.env + keystore,绝不把私钥写进代码库
完成标志
能为自己的合约写出覆盖率 90% 以上的测试,用脚本一键部署到 Sepolia。
这一段要让你看懂:gas 用量由代码决定(写得差就是贵),gas 单价由网络拥堵决定(你控制不了)。优化合约是减少前者,选对链与时机是减少后者。
▶
试一试 · 算清一笔交易的 gas 成本
可直接改代码 · 在浏览器沙箱里真跑playground.jsJavaScript
运行环境:iframe 沙箱(无 cookie 权限)。只支持纯 JS 片段,不支持 import / require;需要模块请用下方的完整示例复制到项目里。
检查点(跑完后逐条核对)
- ETH 转账约 0.000294 ETH(约 $0.94)
- approve + swap 约 0.003220 ETH(约 $10.30)
- 部署 ERC-20 约 0.016800 ETH(约 $53.76)
- 把 gasPrice 改成 0.01 后,所有成本近似降到 1/1400
3
前端集成与钱包交互
含在线练习让用户能在浏览器里用起来:连接钱包、签名、读合约、发交易、处理各种失败态。
需要掌握的知识点
- EIP-1193 提供者接口与 EIP-6963 多钱包发现
- ethers v6 / viem 读取合约与构造交易,ABI 与类型安全
- 签名体系:personal_sign(EIP-191)、结构化数据签名(EIP-712)、SIWE 登录
- 交易生命周期:pending → 打包 → 确认数 → 重组回滚的处理
- L2 与多链:链切换、chainId 校验、跨链消息等待(L1→L2 与 L2→L1 时间差)
- 错误处理:用户拒绝、Gas 不足、滑点超限、nonce 冲突的可读提示
完成标志
能独立写一个 dApp 页面:连接钱包 → 读余额 → 授权 → 调用合约 → 展示交易哈希与状态。
这一段要让你看懂:交易里的 input 就是一串 calldata:前 4 字节决定调用哪个函数,后面按 ABI 依次编码参数。看懂它,就能在区块浏览器里判断一笔签名到底要做什么。
▶
试一试 · 手写并解码 calldata
可直接改代码 · 在浏览器沙箱里真跑playground.js(已注入 ethers v6)JavaScript
运行环境:iframe 沙箱(无 cookie 权限)。只支持纯 JS 片段,不支持 import / require;需要模块请用下方的完整示例复制到项目里。
检查点(跑完后逐条核对)
- calldata 以 0xa9059cbb 开头(transfer 的选择器)
- 解出的接收地址是 0xd8dA…6045
- 金额原始整数为 12500000(12.5 × 10^6)
- approve 无限授权被判定为 true
4
安全审计与攻防
含在线练习把「功能正确」升级为「在对抗环境下仍然正确」,这是合约能否上主网的分水岭。
需要掌握的知识点
- 重入(含只读重入)、闪电贷攻击、预言机价格操纵
- 整数与舍入:精度损失、第一笔存款者攻击、ERC-4626 通胀攻击
- 访问控制:tx.origin、delegatecall 与存储冲突、代理合约初始化漏洞
- 非预期资产:强制转账(selfdestruct)、balance 不能当作记账依据
- 工具链:Slither / Mythril 静态分析、Foundry 攻击复现、Echidna 模糊测试
- 审计流程:自查清单 → 竞品差异分析 → 外部审计沟通 → 报告问题修复与复测
完成标志
能对一份陌生合约做出一份含「问题位置 + 复现步骤 + 修复建议 + 严重等级」的审计笔记。
这一段要让你看懂:重入不是玄学,就是「先转账、后记账」的顺序问题。把状态改动的顺序调过来,同一个攻击合约立刻失效。
▶
试一试 · 重入攻击的资金流模拟
可直接改代码 · 在浏览器沙箱里真跑playground.jsJavaScript
运行环境:iframe 沙箱(无 cookie 权限)。只支持纯 JS 片段,不支持 import / require;需要模块请用下方的完整示例复制到项目里。
检查点(跑完后逐条核对)
- 「先转账后记账」的合约被重入,资金被重复取出
- 「先记账后转账」的合约在第 2 次进入时看到余额已是 0,攻击失败
- 两个版本的资金流差异能在日志里逐行看到
5
主网上线、治理与运维
把合约放到真实资金面前:控制权限、可升级、监控异常、出事能刹车。
需要掌握的知识点
- 部署方案:确定性部署(CREATE2)、多链同地址、验证源码
- 权限设计:多签(Safe)+ Timelock 组合,避免单点私钥控制
- 可升级合约:透明代理 / UUPS 的取舍,存储插槽与初始化函数
- Gas 优化:存储打包、calldata 与内存取舍、避免循环中写存储
- 上线后运维:事件监控告警、异常交易追踪、紧急暂停与迁移预案
完成标志
能设计一套「多签 + Timelock + 暂停开关」的上线方案,并写出紧急事件响应手册。