
WTF-Solidity 怎么用从三行 HelloWeb3 到合约安全的 74 讲完整学习路径【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidityclone 下来第一眼是 74 个编号目录01 到 57外加 S01 到 S17每个还带自己的 readme 和截图。不知道先打开哪个的人多半已经关掉了。WTF-Solidity 这套 Solidity 极简教程的解法不是让你读 README 目录而是把 74 讲压成五段递进路线——照着走每段结束都有明确的完成标志。 项目快照项目说明项目名WTF-Solidity一句话定位面向编程新手的 Solidity 极简入门教程每周更新 13 讲技术栈Solidity 0.8.34 FoundryRemix 可在线跑课程总量主线 57 讲 安全篇 S01S17 共 17 讲另有 EVM 操作码等专题多语言支持中 / 英 / 西 / 葡 / 日社区入口Discord、微信群与官网 wtf.academy最值得说的是合约安全没有散落在语法课里而是单独成 S01S17 共 17 讲——重入、溢出、蜜罐、抢跑各占一篇这在整个教程里不多见。另一个工程细节是 src/ 把每个章节目录软链成统一编译根配 foundry.toml 之后全仓库可本地验证学完就能用 forge 自检。️ 学习地图五段递进74 讲怎么读语法地基 · 第 115 讲这一段解决一个合约由什么构成值类型、函数、变量作用域、数组结构体、mapping、修饰器、事件、继承、接口、异常逐块搭起写合约的地基。卡在这里后面每讲都在补洞。两个最值得反复看的点第 1 讲的 HelloWeb3.sol 全文只有三行SPDX、pragma、合约体一行一个是全书的压缩索引第 5 讲 DataStorage.sol 用可运行代码对比 storage/memory/calldata 的 gas 差异这是新手最容易踩、面试最爱问的点。完成标志不查教程独立写出一个带存储变量、事件和自定义 error 的合约。进阶 · 第 1630 讲底层调用与 EVM 交互这一段解决合约怎么和链、和其他合约说话重载、library、import、receive/fallback、三种发 ETH 方式、call/delegatecall、create/create2、ABI 编码、hash、selector、try-catch。看不懂 call 与 delegatecall 的区别后面代理合约会整段跳过。第 23 讲 Delegatecall.sol 用同一个合约、两条路径调出两个不同返回值把在谁的存储里执行讲得极其直观第 30 讲 TryCatch.sol 收尾外部调用异常是进阶段的出口关卡。完成标志能写出一个收 ETH、调外部合约并妥善处理失败分支的合约。应用 · 第 3145 讲写得出业务合约这一段是能不能写出有用合约的分水岭ERC20、水龙头、Merkle 空投、ERC721、荷兰拍卖、签名、NFT 交换、ERC1155、WETH、分账、vesting、代币锁、时间锁。第 34 讲 ERC721.sol 配 IERC165.sol、IERC721Receiver.sol 一整套接口族safeTransferFrom 是逐行读的价值所在第 37 讲 Signature.sol 把数字签名落地直接铺垫安全篇的 S6 重放攻击。完成标志从零写出一个 ERC20 和一份可验证的白名单空投合约。Degen · 第 4651 讲代理与可升级代理、可升级、透明代理、UUPS、多签、ERC4626 金库。第 46 讲 ProxyContract.sol 手写内联汇编 delegatecall是理解后续三讲的钥匙。完成标志解释得清透明代理与 UUPS 在谁能调管理函数上的区别。合约安全 · S01S17 讲重入、选择器碰撞、中心化、权限、溢出、签名重放、坏随机数、绕过合约检查、DoS、蜜罐、抢跑、tx.origin、未检查调用、时间戳、预言机、NFT 重入、跨服重入。每讲都串联前面的知识点重入对应第 19/20 讲的转账与 receive蜜罐对应 fallback 与权限控制。S17 在仓库里只附文章没有独立 .sol以 readme.md 为主。完成标志拿到任意合约能在 10 分钟内指出最明显的一个隐患。动手 5 分钟跑通第一讲克隆仓库git clone https://gitcode.com/GitHub_Trending/wt/WTF-Solidity cd WTF-Solidity打开 01_HelloWeb3/HelloWeb3.sol三行合约SPDX 注释、pragma solidity ^0.8.34、一个 public 字符串。把源码粘进 Remix 的默认 JavaScript 虚拟机环境点 Compile 编译。选一个测试账户点 Deploy部署到本地 EVM。点击合约里的_string看到Hello Web3!即跑通。线上 IDE 免安装、打开就能部署本地跑则需 Foundry 环境仓库根目录 foundry.toml 已配好solc 0.8.34与依赖路径映射无需再动。 仓库目录结构解读WTF-Solidity/ ├── 01_HelloWeb3/ # 课程章节 0157readme.md *.sol img/ ├── S01_ReentrancyAttack/ # 安全章节 S01S17 ├── src/ # 各章节软链统一编译根 ├── lib/ │ ├── forge-std/ │ └── openzeppelin-contracts/ ├── Languages/ # en / es / pt-br / ja ├── Topics/ # ERC721、Tools、翻译等专题 ├── img/ ├── foundry.toml └── scripts/run-forge-tests.shsrc/每个条目是软链如src/01_HelloWeb3 - ../01_HelloWeb3全仓库一次配置即可编译。lib/forge-std 测试库与 OpenZeppelin 源码既是依赖也可当参考读物。Languages/en 覆盖最全正文标注 preliminary需社区继续审校。Topics/含 TOOL01_Remix、TOOL07_Foundry 等开发工具文档。foundry.tomlsrc src、solc 0.8.34remappings 把forge-std/与openzeppelin/contracts/指向 lib 子目录。scripts/run-forge-tests.sh跑根目录 RootTest再逐章节回归第 18 讲与第 39 讲因依赖外部 URL 和 Chainlink 被排除。值得逐行读的 3 个讲次重入攻击先转款后扣余额的代价S1 把外部调用放在状态更新之前的代价演示到极限1 ETH 本金如何清空整家银行以及两种标准修法checks-effects-interactions 与重入锁。// S01_ReentrancyAttack/ReentrancyAttack.sol function withdraw() external { uint256 balance balanceOf[msg.sender]; require(balance 0, Insufficient balance); // 转账先发生触发恶意 receive 重入 (bool success, ) msg.sender.call{value: balance}(); require(success, Failed to send Ether); balanceOf[msg.sender] 0; // 更新在转账之后太晚了 }call发出即可能激活接收方receive()攻击合约借此循环提款。GoodBank把balanceOf[msg.sender] 0;挪到转账之前重入在 require 处失败。ProtectedBank的nonReentrant锁_status置 1 执行、结束归 0第二次进入直接 revert。延伸思考如果转账用的transfer只有 2300 gas这套攻击还成立吗代理合约一段内联汇编看懂 delegatecall第 46 讲不依赖任何库手写代理转发是读懂 4749 讲的前提也是数据与逻辑分离最原始的形态。// 46_ProxyContract/ProxyContract.sol function _delegate() internal { assembly { let _implementation : sload(0) // 读存储槽 0 calldatacopy(0, 0, calldatasize()) let result : delegatecall(gas(), _implementation, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) if iszero(result) { revert(0, returndataize()) } } }逻辑代码在 Proxy 的存储上下文里执行状态槽位按 Proxy 布局解释。源码注释明确提示Logic与Proxy的状态变量顺序必须一致否则槽位冲突。returndatacopy把逻辑合约返回值原样回传给调用方代理对调用者透明。延伸思考x只写在 Logic 里为什么经 Proxy 调increment()拿到的却是 1 而不是 100ERC721safeTransferFrom 的自保机制ERC721 用 ERC165 做能力自证用 receiver 回调防止 NFT 被永久锁进不会接货的合约是标准接口设计的范本。// 34_ERC721/ERC721.sol function _checkOnERC721Received( address from, address to, uint256 tokenId ) internal { if (to.isContract()) { bytes4 ret IERC721Receiver(to).onERC721Received( msg.sender, from, tokenId, ); require(ret IERC721Receiver.onERC721Received.selector, ERC721: caller is not an NFT receiver); } }接收方是合约就必须返回约定 selector否则整笔转账 revert。supportsInterface用type(IERC721).interfaceId自证支持的接口集合。教程用它免费铸造 WTFApe.sol把标准转成可运行应用。延伸思考receiver 回调本身又是外部调用这里为什么不会重入社区与延伸多语言现状英文最完整但标注 preliminary西语覆盖前 30 讲葡语体量最大139 份源码、115 份教程日语 33 讲。仓库内延伸阅读Topics/Tools/Remix、Foundry 等工具教程Topics/Translation/MetaMask 16 条安全建议、EVM 操作码资料lib/openzeppelin-contracts/工业级合约参考实现Languages/en/README.md英文版课程目录下次再看到那 74 个目录不用从 README 读起——从 01_HelloWeb3 打开三行合约顺着编号走到 S17每段结束都有完成标志给你对答案。【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考