# Solidity 超详细学习方案(6-16 周,零基础到能独立开发生产级合约)

核心升级:每个知识点配「具体案例 + 代码片段」,每个实操任务给「 step-by-step 流程」,补充「工具使用细节 + 常见坑」,新增「每周时间分配 + 验收标准」,确保新手能跟着走、学得会、用得上。

# 一、前置准备(3-5 天,打牢基础不踩坑)

# 1. 前置知识(逐点突破,不用深挖原理,会用即可)

知识模块核心内容学习方式(推荐资源 + 方法)
区块链核心分布式账本、PoW/PoS 共识、区块结构(区块头 + 交易列表)、以太坊网络(主网 / 测试网区别)1. 视频:B 站「李永乐老师区块链科普」(1 集搞懂基础);2. 文档:以太坊官方入门(https://ethereum.org/zh/learn
Gas 机制Gas 的作用(支付矿工费)、Gas Limit(最大消耗)、Gas Price(单位价格)、Gas 不足的后果1. 实操:用 MetaMask 发起测试网转账,观察 Gas 设置界面;2. 文章:《以太坊 Gas 机制详解》(Solidity 中文网)
编程基础JavaScript 变量 / 函数 / 循环 / 对象、面向对象(类、继承)1. 刷题:LeetCode 简单题 10 道(JS 语法);2. 教程:W3Schools JavaScript 教程(只看核心语法)
以太坊核心概念EOA 账户(私钥控制)、合约账户(代码控制)、ABI(合约交互接口)、交易哈希1. 工具实操:MetaMask 创建账户(看 EOA 地址);2. Etherscan 查任意合约(看 ABI 格式)

# 2. 工具安装与配置(手把手步骤)

# (1)基础工具(入门必装)

  • Remix IDE:无需安装,直接访问 https://remix.ethereum.org/,收藏页面(推荐用 Chrome 浏览器)

  • MetaMask(小狐狸钱包)

  1. Chrome 应用商店搜索「MetaMask」安装,创建钱包(记好助记词,绝对不能泄露)

  2. 添加测试网(Sepolia):设置 → 网络 → 添加网络 → 输入 Sepolia 配置(RPC:https://rpc.sepolia.org,链 ID:11155111,符号:ETH)

  3. 领测试 ETH:访问 https://sepolia-faucet.pk910.de/,输入钱包地址,验证后领取(1-2 分钟到账)

  • Etherscan:注册账号(https://etherscan.io/),收藏 Sepolia 测试网地址(https://sepolia.etherscan.io/

# (2)进阶工具(阶段 2 开始安装)

  • Node.js + npm
  1. 下载 Node.js(https://nodejs.org/,选择 LTS 版本,如 18.x),安装时勾选「Add to PATH」

  2. 验证:命令行输入 node -vnpm -v ,能显示版本号即成功

  • Hardhat(本地开发框架)
  1. 新建文件夹(如 solidity-project),命令行进入文件夹

  2. 执行 npm init -y (初始化项目)

  3. 执行 npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox (安装 Hardhat 及工具包)

  4. 执行 npx hardhat init ,选择「Create a JavaScript project」,一路回车(自动生成配置文件)

# 3. 前置验收标准

  • 能解释「为什么以太坊转账需要付 Gas」

  • 能在 MetaMask 中切换 Sepolia 测试网,成功领取测试 ETH

  • 能在 Remix 中新建文件,编写简单的 HelloWorld 代码(不用部署)

# 二、分阶段学习计划(每周 6-10 小时,细化到每日任务)

# 阶段 1:入门启蒙(2 周,目标:会写基础合约 + 部署测试网交互)

# 第 1 周:Solidity 基础语法(每天 2 小时)

日期学习内容实操任务(代码 + 步骤)
Day1变量类型:值类型(uint/address/bool/string)、变量声明与赋值1. 新建 Variables.sol 合约;2. 声明 uint256(金额)、address(用户地址)、bool(是否激活)变量;3. 给变量赋值并打印(用 console.log ,需导入 hardhat/console.sol
Day2引用类型:array(数组)、mapping(映射)、struct(结构体);storage/memory 区别1. 定义 struct User (包含 name/age/balance);2. 用 mapping 存储用户数据(address → User);3. 用 array 存储所有用户地址
Day3函数:定义、参数、返回值(return/returns)、函数可见性(public/external/internal/private)1. 写 getUserInfo(address _user) 函数(返回 User 结构体);2. 写 addUser(string _name, uint _age) 函数(添加用户);3. 测试不同可见性的函数能否外部调用
Day4控制流:if-else/for 循环;修饰符(modifier):权限控制(onlyOwner)1. 写 transferBalance(address _to, uint _amount) 函数,用 if-else 判断余额是否充足;2. 定义 onlyOwner 修饰符(仅部署者可调用);3. 给 transferBalance 添加 onlyOwner 修饰符
Day5合约结构:状态变量(全局)、局部变量、事件(Event)1. 给 addUser 函数添加 Event UserAdded(address indexed _user, string _name) ;2. 函数执行时触发事件;3. 理解「事件用于前端监听」的作用
Day6语法复盘:整合前面知识点,写一个「用户管理合约」合约功能:添加用户、查询用户信息、修改用户年龄(仅 owner 可修改);1. 完整编写代码;2. 在 Remix 中编译,检查语法错误

# 第 2 周:合约部署 + 测试网交互(每天 2 小时)

日期学习内容实操任务(代码 + 步骤)
Day7Remix 部署合约到 Sepolia 测试网1. 打开 Remix,加载第 6 天写的用户管理合约;2. 编译(选择 Solidity 0.8.20 版本);3. 部署面板选择「Injected Provider - MetaMask」,连接钱包;4. 点击 Deploy,确认 MetaMask 交易(Gas 默认即可);5. 部署成功后,在 Remix 中调用 addUser 函数,添加测试用户
Day8用 Etherscan 查看合约 + 验证合约1. 复制部署后的合约地址,在 Sepolia Etherscan 中搜索;2. 查看合约交易记录、状态变量;3. 验证合约:Etherscan → Contract → Verify and Publish,输入合约代码、编译器版本,提交后可查看源码
Day9Hardhat 基础使用:编译合约、本地部署1. 在 Hardhat 项目的 contracts 文件夹下新建 UserManager.sol ,粘贴用户管理合约;2. 执行 npx hardhat compile (编译合约,生成 artifacts 文件夹);3. 执行 npx hardhat run scripts/deploy.js (本地部署,默认 Hardhat 内置测试网)
Day10Hardhat 测试:编写测试用例(Mocha/Chai)1. 在 test 文件夹下新建 userManager.test.js ;2. 编写测试用例:测试 addUser、getUserInfo 函数;3. 执行 npx hardhat test ,查看测试结果(全部通过即成功)
Day11常见问题排查:编译失败、部署失败、Gas 不足1. 故意写语法错误(如少分号),看编译报错信息;2. 部署时把 Gas Limit 设为 10000(过低),观察失败提示;3. 总结「部署失败的 3 种常见原因」
Day12阶段 1 复盘:重写「简单计数器合约」(包含自增、查询、仅 owner 操作)1. 独立编写合约,不参考之前代码;2. 部署到 Sepolia 测试网;3. 用 MetaMask 发起交易(调用自增函数),在 Etherscan 查看交易详情

# 阶段 1 验收标准

  • 能独立编写包含「struct+mapping+modifier+event」的合约

  • 能通过 Remix/Hardhat 两种方式部署合约到 Sepolia 测试网

  • 能调用合约函数,在 Etherscan 中查看交易记录和事件日志

# 阶段 2:核心特性夯实(3 周,目标:掌握支付 + 继承 + 接口 + 异常处理)

# 第 3 周:支付机制 + 转账函数(每天 2 小时)

日期学习内容实操任务(代码 + 步骤)
Day13payable 关键字:接收 ETH 的函数 / 合约;msg.value(交易金额)1. 新建 Payment.sol 合约,给合约添加 payable 修饰符(允许接收 ETH);2. 写 deposit() 函数(无参数,用户转账调用);3. 用 console.log(msg.value) 打印转账金额
Day14转账三种方式:transfer/send/call 的区别(Gas 限制、返回值)1. 写 withdraw(address _to, uint _amount) 函数(提取 ETH 到指定地址);2. 分别用 transfer、send、call 实现转账;3. 测试三种方式的成功率(send 失败返回 false,transfer 失败抛异常)
Day15接收 ETH 的特殊函数:receive(纯 ETH 转账)、fallback(无匹配函数调用)1. 在 Payment 合约中添加 receive 函数(触发事件,打印转账金额);2. 直接向合约地址转 ETH(不调用任何函数);3. 观察 Remix 日志,确认 receive 函数被触发
Day16实操:编写「简易存钱罐合约」功能:1. 用户可存钱(deposit);2. 仅 owner 可取钱(withdraw);3. 可查询账户余额(getBalance);4. 部署到测试网,测试存钱、取钱功能
Day17异常处理:require(参数校验)、revert(主动回滚)、assert(逻辑校验)1. 在存钱罐合约中添加校验:withdraw 时金额不能超过合约余额(用 require);2. 测试「取超过余额的钱」,观察是否回滚交易;3. 理解三种异常的使用场景(require 用于用户输入,assert 用于内部逻辑)

# 第 4 周:继承与接口(每天 2 小时)

日期学习内容实操任务(代码 + 步骤)
Day18继承:is 关键字、父合约构造函数、函数重写(override)1. 新建父合约 BaseContract (包含 onlyOwner 修饰符、 getOwner() 函数);2. 新建子合约 ChildContract 继承 BaseContract;3. 重写 getOwner () 函数(添加日志)
Day19多重继承:菱形继承问题、super 关键字1. 新建 ContractA (有 foo() 函数)、 ContractB (继承 A,重写 foo ());2. 新建 ContractC 继承 A 和 B,用 super.foo () 调用父合约函数;3. 测试函数调用顺序
Day20接口(interface):定义交互规范、调用外部合约1. 定义 IPayment 接口(包含 deposit ()、getBalance () 函数声明);2. 让之前的 Payment 合约实现 IPayment 接口;3. 新建 CallerContract ,通过接口调用 Payment 合约的 getBalance ()
Day21抽象合约(abstract):包含未实现函数的合约1. 定义抽象合约 AbstractPayment ,包含抽象函数 withdrawAll() ;2. 让 Payment 合约继承 AbstractPayment 并实现 withdrawAll ();3. 测试抽象合约不能直接部署
Day22实操:编写「分级权限合约」功能:1. 父合约定义 owner、admin 角色;2. 子合约实现 admin 专属函数(如修改手续费);3. 用接口让外部合约查询 admin 权限

# 第 5 周:核心特性综合实战(众筹合约)

日期学习内容实操任务(代码 + 步骤)
Day23众筹合约需求分析:目标金额、截止时间、参与众筹、提款、退款1. 列出核心功能:初始化(目标金额、截止时间)、参与众筹(payable)、发起人提款(仅 owner)、未达标退款(用户主动提取)
Day24合约编写 1:状态变量 + 初始化函数1. 定义状态变量:targetAmount(目标金额)、deadline(截止时间)、participants(mapping (address → uint) 参与金额);2. 构造函数接收目标金额和截止时间(用 block.timestamp + 天数计算)
Day25合约编写 2:参与众筹 + 提款函数1. 写 participate() 函数(payable,记录用户参与金额);2. 写 withdrawFunds() 函数(仅 owner 可调用,判断是否达标 + 转账)
Day26合约编写 3:退款函数 + 事件1. 写 claimRefund() 函数(用户调用,判断未达标 + 退还金额);2. 添加事件(Participated/Withdrawn/Refunded);3. 用 require 校验所有边界条件(如截止时间前不能提款)
Day27合约测试:Hardhat 编写测试用例1. 测试「参与众筹」:用户转账后余额是否正确;2. 测试「达标提款」:owner 能否提取全部资金;3. 测试「未达标退款」:用户能否拿回本金
Day28部署测试网 + 交互:邀请朋友测试1. 部署众筹合约到 Sepolia(目标金额设为 0.01 ETH,截止时间设为 1 小时后);2. 用自己的钱包参与众筹;3. 到期后测试提款 / 退款功能

# 阶段 2 验收标准

  • 能清晰区分 transfer/send/call 的使用场景(如大额转账用 call)

  • 能通过「继承 + 接口」实现多合约协作

  • 能独立编写「众筹合约」,覆盖正常场景 + 异常场景(如超时提款、余额不足)

# 阶段 3:进阶实操(4 周,目标:掌握 ERC 标准 + OpenZeppelin+NFT / 代币开发)

# 第 6 周:ERC20 代币标准(每天 2 小时)

日期学习内容实操任务(代码 + 步骤)
Day29ERC20 核心标准:totalSupply(总发行量)、balanceOf(余额查询)、transfer(转账)、approve(授权)、transferFrom(授权转账)1. 阅读 OpenZeppelin 的 ERC20 源码(https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol);2. 记录核心函数的参数和返回值
Day30OpenZeppelin 使用:安装 + 导入 + 继承1. 执行 npm install @openzeppelin/contracts (安装合约库);2. 新建 MyToken.sol 合约,继承 ERC20 ;3. 构造函数中调用 ERC20("MyToken", "MTK") (初始化名称和符号)
Day31自定义 ERC20:添加 mint(铸造)、burn(销毁)功能1. 写 mint(address _to, uint256 _amount) 函数(仅 owner 可调用,铸造代币给指定地址);2. 写 burn(uint256 _amount) 函数(用户销毁自己的代币);3. 编译测试函数是否生效
Day32进阶功能:转账手续费(交易时扣除比例)1. 重写 _transfer 函数(OpenZeppelin 的内部函数);2. 计算手续费(如 1%),剩余金额转账给接收方;3. 手续费转入 owner 地址
Day33测试与部署:Hardhat 测试 + 测试网部署1. 编写测试用例:测试转账、授权、手续费扣除;2. 部署到 Sepolia 测试网;3. 在 MetaMask 中添加代币(输入合约地址),测试转账功能

# 第 7 周:ERC721 NFT 标准(每天 2 小时)

日期学习内容实操任务(代码 + 步骤)
Day34ERC721 核心标准:mint(铸造)、transferFrom(转账)、tokenURI(元数据)1. 阅读 OpenZeppelin 的 ERC721 源码;2. 理解「每个 NFT 有唯一 tokenId」的设计;3. 记录 tokenURI 的作用(关联图片 / 属性数据)
Day35元数据制作:IPFS 上传图片 + 编写 JSON 元数据1. 准备一张图片(如 NFT 头像);2. 注册 Pinata(https://www.pinata.cloud/),上传图片获取 IPFS 链接;3. 编写 JSON 文件(包含 name/description/image 属性),上传到 Pinata
Day36自定义 NFT 合约:基础铸造功能1. 新建 MyNFT.sol ,继承 ERC721 ;2. 构造函数初始化名称和符号;3. 写 mint(address _to) 函数(自动生成 tokenId,调用 _mint 函数);4. 重写 tokenURI 函数(返回 Pinata 的 JSON 链接)
Day37进阶功能:白名单铸造(仅白名单地址可优先铸造)1. 用 mapping 存储白名单(address → bool);2. 写 addWhitelist(address[] _users) 函数(仅 owner 可添加);3. 给 mint 函数添加 onlyWhitelist 修饰符(白名单用户可铸造)
Day38进阶功能:公开铸造(需支付 ETH)+ 铸造上限1. 给 mint 函数添加 payable 关键字,设置铸造价格(如 0.001 ETH);2. 定义 MAX_SUPPLY (最大铸造量,如 100);3. 校验铸造数量不超过上限
Day39部署测试:测试网铸造 + Opensea 查看1. 部署 NFT 合约到 Sepolia;2. 调用 addWhitelist 添加自己的地址;3. 支付测试 ETH 铸造 NFT;4. 打开 Opensea 测试网(https://testnets.opensea.io/),搜索合约地址查看 NFT

# 第 8-9 周:ERC1155 多资产标准 + 综合项目(每天 2.5 小时)

日期学习内容实操任务(代码 + 步骤)
Day40ERC1155 核心特性:兼容代币 + NFT、批量操作(mintBatch/transferBatch)1. 阅读 OpenZeppelin 的 ERC1155 源码;2. 理解「一个合约管理多种资产」的设计;3. 测试批量铸造功能
Day41编写 ERC1155 合约:游戏道具场景(代币 = 金币,NFT = 装备)1. 新建 GameAssets.sol ,继承 ERC1155 ;2. 铸造两种资产:id=0(金币,可无限铸造)、id=1(装备,限量 10 件);3. 写 mintGold(address _to, uint _amount)mintEquipment(address _to) 函数
Day42综合项目:NFT 交易市场(简化版)需求分析核心功能:1. 卖家挂单(设置 NFT 价格);2. 买家购买(支付 ETH 获取 NFT);3. 卖家取消挂单;4. 平台手续费(交易金额的 2%)
Day43交易市场合约编写 1:挂单存储 + 挂单函数1. 定义 struct Order (包含 seller/nftContract/tokenId/price/isActive);2. 用 mapping 存储订单(uint256 orderId → Order);3. 写 createOrder(address _nftContract, uint256 _tokenId, uint256 _price) 函数(卖家授权后挂单)
Day44交易市场合约编写 2:购买 + 取消挂单函数1. 写 buyOrder(uint256 _orderId) 函数(买家支付 ETH,转移 NFT 和资金);2. 写 cancelOrder(uint256 _orderId) 函数(仅卖家可取消);3. 计算平台手续费,剩余资金转给卖家
Day45交易市场合约编写 3:权限校验 + 事件1. 校验挂单是否有效(isActive=true);2. 校验买家支付金额是否正确;3. 添加 OrderCreated/OrderBought/OrderCancelled 事件
Day46Hardhat 测试:覆盖所有功能1. 测试挂单→购买→手续费分配;2. 测试挂单→取消;3. 测试异常场景(购买已取消的订单、支付金额不足)
Day47部署测试网 + 端到端测试1. 部署 NFT 合约和交易市场合约到 Sepolia;2. 铸造 NFT 并挂单;3. 用另一个钱包购买 NFT;4. 查看 Etherscan 确认资金和 NFT 转移

# 阶段 3 验收标准

  • 能独立开发带「手续费 + 铸造上限」的 ERC20 代币

  • 能开发带「白名单 + 公开铸造」的 ERC721 NFT,且能在 Opensea 测试网显示

  • 能完成「NFT 交易市场」核心功能,实现 NFT 与 ETH 的兑换

# 阶段 4:安全与优化(3 周,目标:规避漏洞 + Gas 优化 + 安全审计基础)

# 第 10 周:常见安全漏洞(每天 2 小时)

日期漏洞类型学习 + 实操任务
Day48重入攻击(Reentrancy):原理 + 案例 + 防御1. 阅读 The DAO 攻击事件(重入攻击经典案例);2. 编写有漏洞的转账合约(用 call 转账后更新状态);3. 编写攻击合约,模拟重入;4. 修复漏洞(用 Checks-Effects-Interactions 模式 + ReentrancyGuard)
Day49溢出 / 下溢:原理 + 防御1. 理解 Solidity 0.8.x 内置溢出检查;2. 用 0.7.x 版本编写无 SafeMath 的合约,测试溢出;3. 用 SafeMath 修复(或升级到 0.8.x)
Day50访问控制漏洞:未授权调用敏感函数1. 编写未加 onlyOwner 的 mint 函数;2. 用另一个钱包调用 mint,观察是否能铸造;3. 添加 Ownable 修复漏洞
Day51伪随机数问题:blockhash/block.timestamp 作为随机数的风险1. 编写用 block.timestamp 生成随机数的 NFT 合约;2. 分析「矿工可操纵区块时间」的风险;3. 集成 Chainlink VRF(获取真随机数)
Day52抢跑攻击(Front-running):原理 + 基础防御1. 理解「公开交易可被矿工优先打包」的风险;2. 编写拍卖合约(最高价者得);3. 分析抢跑攻击场景;4. 防御:设置最小加价比例 + 拍卖截止时间

# 第 11 周:Gas 优化技巧(每天 2 小时)

日期优化方向实操任务(代码对比)
Day53状态变量优化:打包存储、避免不必要的 storage 读写1. 优化前:uint256 + uint8 + uint256(占用 3 个存储槽);2. 优化后:uint256 + uint256 + uint8(打包到 2 个存储槽);3. 用 Remix 的 Gas Reporter 插件对比 Gas 消耗
Day54函数优化:可见性调整、避免重复计算1. 把外部调用的函数从 public 改为 external;2. 把循环中的重复计算(如 array.length)提取到局部变量;3. 对比优化前后的 Gas 消耗
Day55数据结构优化:mapping vs array、bytes vs string1. 用 mapping 存储用户数据(查询 O (1)) vs array(查询 O (n));2. 用 bytes 存储固定长度字符串(比 string 省 Gas);3. 测试不同数据结构的查询 Gas 消耗
Day56代码逻辑优化:简化循环、避免冗余判断1. 简化众筹合约中的退款循环(批量退款改为用户主动提取);2. 合并多个 require 判断为一个;3. 测试优化后的合约执行效率

# 第 12 周:安全工具使用 + 合约审计基础(每天 2 小时)

日期学习内容实操任务
Day57Slither(静态分析工具):安装 + 使用1. 执行 pip3 install slither-analyzer (安装 Slither);2. 进入之前的 NFT 合约项目;3. 执行 slither . (扫描合约);4. 查看漏洞报告,修复提示的问题
Day58Mythril(漏洞扫描工具):安装 + 使用1. 执行 pip3 install mythril (安装 Mythril);2. 执行 myth analyze contracts/MyNFT.sol (扫描 NFT 合约);3. 对比 Slither 和 Mythril 的扫描结果
Day59Remix Security Plugin:实时检测漏洞1. 在 Remix 中安装「Security」插件;2. 打开之前的有漏洞的重入合约;3. 查看插件提示的漏洞,手动修复
Day60合约审计报告编写:模仿专业审计报告1. 找一个开源合约(如 GitHub 上的简易 ERC20);2. 用 Slither 扫描 + 手动审查;3. 编写审计报告(包含漏洞描述、风险等级、修复建议)

# 阶段 4 验收标准

  • 能识别并修复「重入攻击、访问控制」等 5 种常见漏洞

  • 能对之前写的 ERC20 合约进行 Gas 优化,使转账 Gas 消耗降低 20% 以上

  • 能用 Slither 扫描合约并修复提示的漏洞

# 阶段 5:生态拓展与实战(长期,目标:对接 DApp + 跨链 + 进阶方向)

# 第 13-16 周:DApp 全流程开发(每周 10 小时)

阶段学习内容实操任务
前端基础React+Ethers.js:搭建前端页面、连接 MetaMask、调用合约1. 用 create-react-app dapp-frontend 创建 React 项目;2. 安装 ethers.jsnpm install ethers );3. 编写连接 MetaMask 的代码(检测钱包、切换网络)
合约交互前端调用合约函数:查询数据(call)、发起交易(sendTransaction)1. 导入之前部署的 NFT 交易市场合约 ABI;2. 编写「查询挂单列表」的代码(call 函数,无需 Gas);3. 编写「购买 NFT」的代码(sendTransaction,需用户确认)
页面开发实现 NFT 交易市场前端:首页(NFT 列表)、挂单页面、购买页面1. 用 Ant Design 组件库搭建页面;2. 展示 NFT 图片(通过 tokenURI 获取 IPFS 图片);3. 显示挂单价格、卖家地址;4. 实现「挂单」「购买」「取消挂单」按钮
跨链部署部署到 Polygon 测试网(Gas 更低)1. MetaMask 添加 Polygon 测试网(RPC:https://rpc-mumbai.maticvigil.com);2. 领 Polygon 测试 MATIC(https://faucet.polygon.technology/);3. 用 Hardhat 部署合约到 Polygon 测试网
全流程测试端到端测试:前端 + 合约 + 跨链1. 用 React 前端连接 Polygon 测试网;2. 铸造 NFT 并挂单;3. 用另一个钱包购买 NFT;4. 确认交易成功,NFT 和资金转移正常

# 进阶方向(选 1-2 个深入)

方向学习内容实操任务
DeFi 基础AMM(自动做市商)核心逻辑(恒定乘积公式 x*y=k)、借贷合约(抵押 / 借款 / 还款)1. 阅读 Uniswap V2 核心合约(Pair 合约);2. 编写简易 AMM 合约(实现添加流动性、兑换功能)
DAO 基础治理合约(提案创建、投票、执行)、ERC20 投票权1. 基于 OpenZeppelin 的 Governor 合约;2. 编写 DAO 治理合约(仅持有代币的用户可投票)
链上数据索引The Graph:定义 Schema、编写 Subgraph、查询链上数据1. 注册 The Graph 账户(https://thegraph.com/);2. 为 NFT 交易市场合约编写 Subgraph;3. 用 GraphQL 查询挂单历史

# 阶段 5 验收标准

  • 能独立开发「前端 + 合约」的完整 DApp,实现 MetaMask 连接、合约交互

  • 能部署合约到 Polygon 等 EVM 兼容链

  • 能在进阶方向中完成一个小型 Demo(如简易 AMM 合约、DAO 投票合约)

# 三、优质学习资源(精准避坑,优先官方 + 实战类)

# 1. 官方文档(权威首选)

  • Solidity 官方文档:https://docs.soliditylang.org/(0.8.x 版本,重点看「Language Basics」和「Contracts」)

  • OpenZeppelin Docs:https://docs.openzeppelin.com/contracts/(安全合约使用指南,必看 ERC20/ERC721 章节)

  • Hardhat Docs:https://hardhat.org/docs(本地开发 + 测试,重点看「Getting Started」和「Testing」)

# 2. 视频教程(入门首选)

  • 英文:Patrick Collins(Youtube)-「Solidity, Blockchain, and Smart Contract Course - Beginner to Expert」(保姆级,从环境到实战)

  • 中文:黑马程序员 -「Solidity 区块链智能合约开发教程」(B 站,适合零基础,讲解通俗)

  • 安全专题:Secureum(Youtube)-「Security Fundamentals」(常见漏洞详解)

# 3. 实战与安全

  • 刷题平台:Ethernaut(https://ethernaut.openzeppelin.com/,Web3 安全闯关游戏,边玩边学漏洞)

  • 安全案例:Rekt.news(https://rekt.news/,记录区块链安全事件,分析漏洞原因)

  • 开源合约:Uniswap V2(https://github.com/Uniswap/v2-core)、Aave V2(https://github.com/aave/aave-v2-core)(学习生产级合约设计)

# 4. 中文社区(问题求助 + 资源分享)

  • Solidity 中文网:https://solidity-cn.readthedocs.io/(中文文档 + 教程)

  • 以太坊中文社区:https://ethfans.org/(技术文章 + 社区讨论)

  • Discord:Solidity 中文社区(https://discord.gg/solidity-cn)(实时答疑)

# 四、关键注意事项(新手必看,少走 90% 的坑)

  1. 版本统一:Solidity 合约、Remix 编译器、Hardhat 配置的版本要一致(推荐 0.8.20,稳定无兼容问题)

  2. 安全优先:永远不要复用未知来源的合约代码,优先使用 OpenZeppelin 的经过审计的合约

  3. 测试先行:任何合约上线前,必须用 Hardhat 编写测试用例,覆盖正常场景 + 异常场景

  4. Gas 意识:链上合约要时刻考虑 Gas 消耗,避免复杂循环(如遍历大数组)

  5. 隐私注意:区块链数据公开,不要在合约中存储私钥、密码等敏感信息

  6. 主网谨慎:未经过安全审计的合约,绝对不能部署到以太坊主网(避免资金损失)

按这个方案推进,6-16 周可从零基础成长为能独立开发「代币 / NFT/DApp」的 Solidity 开发者,且具备基础的安全意识和 Gas 优化能力。如果某阶段觉得难度大,可适当延长时间(比如阶段 3 的综合项目可延长到 1 个月),核心是「每学一个知识点,必写代码测试」,实操是 Solidity 学习的唯一捷径~