# Web3开发必修课：从0到1的生产级Dapp项目实战

By [Keegan小钢](https://paragraph.com/@keeganlee) · 2024-11-03

---

**Web3开发必修课：从0到1的生产级Dapp项目实战**
==============================

我在前几天的文章「[**聊聊我在新加坡的近况**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495105&idx=1&sn=4feaa7618d6364d4c2c7e12d5279163d&chksm=8b685711bc1fde07a6b377a77000f3d20de94e5958f9e1579ea7f15c9cc834e7171b513e6a4b&token=235093483&lang=zh_CN#rd)」中说过，我最近开启了「[**从0到1开发Dapp实战课程**](http://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495099&idx=1&sn=dea8654e5c21a13188b5003b1ab9a071&chksm=8b6856ebbc1fdffd88600cbedb7bbe476ed5266cfb910f405a9b1168ec452467c1d1c9096934&scene=21#wechat_redirect)」，打算把这些年来做 Dapp 实际项目的经验，用体系化的方式，由浅入深地讲授出来。做完之后，还打算把项目上线主网真正跑起来。**总而言之，我要做的是一个生产级的 Dapp 项目，而这个课程主要就是讲解怎么把这个项目手把手地做出来。**

如今，预售阶段已结束，课程准备也进入了一个新阶段，下面我就关于该课程的一些内容展开说说。

**课程项目**
--------

首先，先来介绍下课程要做的实战项目，这也是大家最关心的。实战项目是做一个**链上 ETF 产品**。

传统 ETF 全称为**交易型开放式指数基金**（英语：exchange-traded funds，缩写：**ETF**），或称**交易所交易基金**，是一种在证券交易所交易，提供投资人参与指数表现的指数基金。ETF 将指数证券化，投资人不以传统方式直接进行一篮子证券之投资，而是透过持有表彰指数标的证券权益的受益凭证来间接投资。ETF 的发行机构会将一篮子可追踪的指数中的股票投资组合，委托一受托机构托管，并以此为实物担保，分割成许多单价较低之投资单位（即ETF），让投资人购买，并在集中市场挂牌交易。ETF 发行后，投资人可再向发行机构申请创造或赎回 ETF，创造 ETF 时投资人须将与标的指数相同之一篮子股票与等值之股息存入受托机构，再由机构发行相对应数量之 ETF 予投资人。赎回 ETF 之过程，投资人可将持有之 ETF 转换为标的指数之成分股票。

简而言之，一个 ETF 类似于一只特殊的股票，代表了一个指数，这个指数由一篮子证券按照一定的权重比例所组成。

而我们这个链上 ETF 产品，本质上也是一样的，发行一个 ETF 代币，代表一个指数，该指数由一篮子代币所组成，这组代币也会有相应的权重比例。铸造该 ETF 代币时，需要投资人存入一篮子代币，而赎回时就是把持有的 ETF 转换为一篮子代币。

不过，以上只是最基本的功能，一个 ETF 肯定不只是这么简单。

铸造 ETF 时，不能只支持让投资人直接投入一篮子代币，要让投资人自己去买入一篮子代币，这太不友好了。所以，还要支持只用一种代币进行投资，比如投资人可以用 ETH/USDT/USDC 等代币进行投资来铸造 ETF 代币。我们可以使用 Uniswap 来把单一代币自动兑换成 ETF 对应的一篮子代币。赎回也一样，要支持可以赎回成一种单一代币。那么，怎么接入 Uniswap？每个代币兑换时的交易路径怎么算？怎么算具体每个单一代币需要投入多少？这些问题其实都没有那么简单。

ETF 里的一篮子代币也是可以调整的，可以增加和移除代币，调整代币也会涉及到一些其他的调整。

ETF 还有**再平衡**的需求，因为每个代币的涨跌不一样，随着时间流逝，这一篮子代币实际的权重比例会偏离原本设置的权重比例，所以需要定时进行再平衡，将实际权重过高的代币卖掉部分，买回权重降低了的代币。实现再平衡的时候，计算需要用到代币价格，所以就会引入价格预言机。也需要用到 Uniswap 来实现自动兑换。另外还有很多其他问题要考虑，包括怎么计算哪些币要卖多少，哪些币要买多少，又怎么解决多代币的兑换路径问题，等等，这块的复杂度并不低。

我还会给它加上**流动性挖矿**的功能，投资人投入流动性资产铸造出 ETF，随着时间流逝，是可以不断挖出项目代币的。有点类似于你把钱存入银行可以赚到利息。不过，在链上实现这种功能有其独有的实现方案，和链下的实现方案有着很大不同。

既然流动性挖矿挖的是项目代币，自然也就有发行项目代币的需求。课程中我也会扩展介绍实现 ERC20 代币的几种不同场景。

既然有了发行代币的需求，那少不了也会有**代币空投**的需求。课程中也会介绍实现代币空投的几种不同方案。

ETF 代币铸造出来后，最好还能添加到 DEX 中进行交易，所以可以为其增加一个 Uniswap 的池子，我打算为其添加一个 UniswapV2 的流动性池子。为了鼓励更多人去这个池子里添加流动性，那我打算再增加一个 **Staking** 合约，用户质押这个流动性池子的 LP 代币，可以得到项目代币，以及可以得到 ETF 协议手续费的分成。

因为合约本身无法自动执行再平衡，所以还需要引入 **Keeper** 来完成定时执行 rebalance 的任务。我会介绍两种实现方案，一是采用 Golang 自己实现一个 Keeper 服务；二是采用 Chainlink Automation 来实现。

在实际项目中，合约里的资产和 Owner 权限肯定也不会交给一个 EOA 地址进行管理，通常都是采用**多签钱包**进行管理的，所以也会介绍多签钱包的使用。

Dapp 项目发展到成熟阶段，通常都会转为 DAO 的方式进行管理，所以也会介绍下**投票治理流程**。

整个项目，除了合约，也少不了**前端交互页面**，所以也会讲解怎么用常用的 Web3 前端库去实现交互功能。

最后，就是把整个项目部署上线了，包括合约、前端、后端等。

课程结束后，我还会发行一个 NFT 合约给学员们 mint，作为一个结业证明吧。既然涉及 NFT，那我就会顺便介绍下怎么发行 NFT。

**课程大纲**
--------

根据以上内容，我再根据复杂度和优先级进行了编排，最终就梳理出了具体的课程内容大纲了。废话不多说，直接看以下内容：

*   **第1节 ERC721**：详细讲解课程售卖的门票 NFT 合约和页面交互实现逻辑，以及介绍发行 NFT 的常用实现方案，和介绍最常用的 NFT 交易市场。
    
*   **第2节 ERC20**：介绍实际生产项目中实现 ERC20 代币的几种常用方案，包括测试用的 Mock 代币、固定供应代币、灵活供应代币、可升级合约代币。
    
*   **第3节 代币空投**：介绍实现代币空投的三种方案，以及各自的优缺点和所适用的场景。
    
*   **第4节 ETF v1版本**：详解链上 ETF v1 版本，实现最基本的功能，包括合约实现和交互页面。
    
*   **第5节 ETF v2版本**：详解链上 ETF v2 版本，增加使用单一代币进行投资和赎回的功能，涉及 UniswapV3。
    
*   **第6节 ETF v3版本**：详解链上 ETF v3 版本，增加 rebalance 和增减代币的功能，涉及 UniswapV3 和 Chainlink 价格预言机。
    
*   **第7节 ETF v4版本**：详解链上 ETF v4 版本，增加流动性挖矿功能，涉及链上特有的计算方案。
    
*   **第8节 ETF v5版本**：详解链上 ETF v5 版本，整合并改为可升级合约模式。同时介绍三种常用的代理模式。
    
*   **第9节 Staking**：实现 Staking 功能，涉及到 UniswapV2。
    
*   **第10节 Keeper**：增加 Keeper 服务，实现自动 rebalance。
    
*   **第11节 多签钱包**：介绍多签钱包的使用，使用多签钱包作为合约 Owner 进行管理。
    
*   **第12节 投票治理**：介绍在实际项目中都是怎么做投票治理的，实现投票治理合约和演示投票治理流程。
    
*   **第13节 部署上线**：最后，把链上 ETF 产品部署上线。
    

完成这些内容，要实现的工作其实很多，我不止要实现合约逻辑，要写单元测试，还要编写前端交互页面，还要部署。我一定要把这门课程做成精品课程，所以需要多些时间进行准备。

我计划最快可能是 11 月中旬正式开第一节课，如果晚的话也可能拖到月底才开课。打算每周讲两节课，那就能够在两个月之内全部讲完。

授课将采用腾讯会议进行，直播+录播回放的方式。直播结束后，就只剩下录播课了。课程的课件和代码会放上 Github，给学员们开放权限。对于我的 1v1 学员们，我还会给他们进行更细致的 1v1 辅导，布置更具体的编码作业，以及帮他们做代码 review。

**关于课程门票 NFT**
--------------

大家都知道，这一次课，我采用了 Web3 的方式进行售卖。我开发了一个合约，叫 **CourceNFT**，把课程售卖的逻辑直接用合约实现了。而且还自己写了一个简单的交互页面：

> [**https://nft-ui-mu.vercel.app/**](https://nft-ui-mu.vercel.app/)

很多人都已经知道购买这个 NFT 就是购买了我这门课的门票，找我核销后就可以进入学员群。但大家不知道的是，这个 NFT 并不只是用于我目前这门课，还可以用于我后续的课程。

这门课程肯定不是我最后一门课程，这只是一个新模式课程的开始，后续我会陆续出不同的课程。而后续课程的门票，依然也是采用这个 NFT 合约进行发售。

如果你现在只花 200U 买了一个 NFT，假设我下一门课的门票起步价为 300U，到时候用这个 NFT 来核销兑换学习新课程，那你就赚了 100U 了。如果你自己不用，转手把它卖给其他想买课的童学，就算打个 9 折转让，270U 卖给其他人，这一倒手也赚了 70U 呢。

另外，CourceNFT 本身自带推荐分佣机制，只要购买了 NFT 的地址就会自动成为可分佣地址，就算后续把这个 NFT 核销了或转给其它地址了，可分佣的资格依然不变。分佣比例起步为 5%，每增加一个被推荐人购买，分佣比例就能提高 1%，目前设置的最高分佣比例达 50%。所以，购买一个 NFT 后，去推荐别人来购买，赚分佣也是一个不错的思路。

还有，NFT 门票，每增加一人购买，价格就会自动涨 1U，所以，越早购买越划算。

以后，我还会陆续为这个 NFT 增加更多其他支持。

**前置知识**
--------

很多人都会询问，包括已经报名了的学员都会问的一个问题：**学习这门课程前需要先学习哪些前置知识？**

因为此次课程主要还是讲实战，不会花太多时间去讲解一些基础知识，所以大家提前先了解一些基础知识的确是很有必要的。下面，我就给出一份快速的学习指南，包括需要学习什么、去哪里学。

首先，肯定要先掌握 Solidity 语言基础。学习 Solidity 语言基础，我主要推荐两个学习资料：

1.  **WTF Academy** 的 [**Solidity 101**](https://www.wtf.academy/docs/solidity-101) 和 [**Solidity 102**](https://www.wtf.academy/docs/solidity-102/)
    
2.  B 站「[**崔棉大师玩转Web3**](https://space.bilibili.com/286084162/)」的「[**Solidity 8.0全面精通**](https://space.bilibili.com/286084162/channel/collectiondetail?sid=296410)」视频合集
    

另外，官方的文档虽然内容更详细，但更多其实是作为手册来用，并不适合初学者快速入门。

接着，可以学习我 B 站上「[**转型Web3开发第二课**](https://space.bilibili.com/60539794/channel/collectiondetail?sid=3409922)」的视频合集，了解 MetaMask、区块浏览器、以太坊基础和 Dapp 的基本架构，这些也是必须掌握的基础知识。

然后，合约开发三大工具 **Remix、Hardhat、Foundry** 至少也要掌握一个。其中 **Remix** 是每一个开发都需要掌握的。刚好我 B 站上已经有「[**智能合约开发工具Remix**](https://space.bilibili.com/60539794/channel/collectiondetail?sid=3980129)」的视频合集，可以去观看学习。

**ERC20** 和 **ERC721** 这两大代币标准也是要懂的。虽然课程中都会讲到 ERC20 和 ERC721，但不会花篇幅去讲什么是 ERC20、什么是 ERC721，也不会去讲标准接口都有哪些，我只会教在实际项目中怎么用。

一些常用的 ERC20 要知道，包括 **WETH、USDT、USDC**，这几个是最常用的代币。

还有**价格预言机、Uniswap、Subgraph、Keeper** 这几个的概念也要懂，可以不知道具体怎么用，但要先了解这些是什么东西。

以上这些前置知识，其实都在我的小报童专栏小册「[**深入浅出Web3开发技术**](https://xiaobot.net/p/web3dev?refer=f0767f23-6215-40d7-b189-a8e7d1959fb8)」里都有讲到。如果还没有看过的，建议可以去看一看。

![小报童专栏](https://storage.googleapis.com/papyrus_images/c74a5bdd57fd7e2fa19d324484ca0a27583673970fd22cb7f3a54499efcc3385.png)

小报童专栏

**最后总结**
--------

总结一下，「从0到1开发Dapp实战课程」不仅是一个全面深入的 Web3 开发实践课程，更是一个系统构建生产级 Dapp 的完整指南。在这里，你将不只学到 Dapp 开发的理论和基础操作，更将通过手把手的实战项目，把一个链上 ETF 项目从构想到上线，亲手实现每一步。无论是 ERC20、ERC721 等代币标准的应用，还是 Uniswap 集成、价格预言机和 Keeper 服务等复杂功能，课程都提供详细的讲解和动手机会。

从项目初始的构思到最终的部署上线，你不仅会学到具体的合约编写、测试和前端交互实现，还将了解流动性挖矿、代币空投、多签钱包管理、DAO 治理等重要概念和实现方法。尤其适合想要在实际项目中掌握全栈 Dapp 开发的学习者。

**这是一次深入而实战的体验**，不仅教你如何从0到1实现一个生产级 Dapp，更重要的是帮助你掌握 Web3 开发的思维方式和实战技巧。这门课程将带你迈出 Web3 开发的关键一步，欢迎加入，共同开启这段精彩的 Web3 开发旅程！

---

*Originally published on [Keegan小钢](https://paragraph.com/@keeganlee/web3-0-1-dapp)*
