W3
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 + 暂停开关」的上线方案,并写出紧急事件响应手册。

走完这条路之后