📚 第十四章 | DeFi / DAO / GameFi 项目高级实战
------完整项目实操,打造区块链产品 MVP!
✅ 本章导读
基础语法 + 工程化开发,我们已经搞定!
这章,我们从「写功能」到「做产品」。
什么是项目?
-
有用户
-
有交互
-
有经济模型
-
有治理或盈利逻辑
而这些都需要落地成代码和产品。
这一章,我们通过三个实战案例,走通完整开发闭环。
👉 你不仅会写 ERC20,还能设计发币经济模型
👉 不只是投票 DAO,还能设计激励机制
👉 不只是 GameFi NFT,还能设计奖励和升级体系
✅ 本章你将掌握
-
DeFi 流动性挖矿(Staking + Farming)
-
DAO 治理投票(提案 + 投票 + 执行)
-
GameFi 激励系统(NFT + 奖励分红)
-
Token 经济模型设计
-
完整合约 + 部署 + 前端 DApp
-
项目迭代优化
-
主网部署建议
1️⃣ DeFi | 流动性挖矿项目实战
✅ 场景
用户质押代币,获取奖励。
👉 类似 PancakeSwap、Uniswap 的 Farming 挖矿池
✅ 项目需求
-
支持用户质押 LP 代币
-
根据质押时间分发奖励 Token
-
提前退出收手续费
-
管理员添加/关闭矿池
✅ 合约结构
contracts/
├─ Token.sol // 奖励代币合约
├─ StakingPool.sol // 挖矿合约
✅ 核心合约(StakingPool.sol)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract StakingPool is Ownable {
IERC20 public rewardToken;
IERC20 public stakingToken;
uint public rewardRate = 1e18;
uint public lastUpdateTime;
uint public rewardPerTokenStored;
mapping(address => uint) public userRewardPerTokenPaid;
mapping(address => uint) public rewards;
mapping(address => uint) public balances;
uint public totalSupply;
constructor(address _stakingToken, address _rewardToken) {
stakingToken = IERC20(_stakingToken);
rewardToken = IERC20(_rewardToken);
}
modifier updateReward(address account) {
rewardPerTokenStored = rewardPerToken();
lastUpdateTime = block.timestamp;
if (account != address(0)) {
rewards[account] = earned(account);
userRewardPerTokenPaid[account] = rewardPerTokenStored;
}
_;
}
function rewardPerToken() public view returns (uint) {
if (totalSupply == 0) return rewardPerTokenStored;
return rewardPerTokenStored + (rewardRate * (block.timestamp - lastUpdateTime) * 1e18 / totalSupply);
}
function earned(address account) public view returns (uint) {
return (balances[account] * (rewardPerToken() - userRewardPerTokenPaid[account]) / 1e18) + rewards[account];
}
function stake(uint amount) external updateReward(msg.sender) {
require(amount > 0, "Cannot stake 0");
stakingToken.transferFrom(msg.sender, address(this), amount);
balances[msg.sender] += amount;
totalSupply += amount;
}
function withdraw(uint amount) external updateReward(msg.sender) {
require(amount > 0, "Cannot withdraw 0");
balances[msg.sender] -= amount;
totalSupply -= amount;
stakingToken.transfer(msg.sender, amount);
}
function claimReward() external updateReward(msg.sender) {
uint reward = rewards[msg.sender];
require(reward > 0, "No rewards");
rewards[msg.sender] = 0;
rewardToken.transfer(msg.sender, reward);
}
function setRewardRate(uint _rate) external onlyOwner {
rewardRate = _rate;
}
}
✅ 合约亮点
-
动态奖励分发
-
持仓越久,收益越高
-
可配置 rewardRate 动态调节奖励强度
-
兼容 ERC20 标准代币
✅ 项目优化
-
提现手续费 → 进入 DAO 金库
-
前端显示 APY → 实时数据展示
-
Dune Analytics 看板 → 质押用户数据透明
2️⃣ DAO | 治理投票系统实战
✅ 场景
持有治理代币的用户,可以:
-
提案
-
投票
-
执行决议
👉 类似 Snapshot + Governor DAO 模型
✅ 项目需求
-
持币提案门槛
-
投票权重按代币数量
-
投票期结束后自动结算
-
通过提案后执行(分红、铸币等)
✅ 合约结构
contracts/
├─ GovernanceToken.sol // 治理代币合约
├─ DAOProposal.sol // 提案合约
✅ 核心合约(DAOProposal.sol)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract DAOProposal is Ownable {
IERC20 public governanceToken;
struct Proposal {
uint id;
string description;
uint voteYes;
uint voteNo;
uint endTime;
bool executed;
}
uint public proposalCount;
mapping(uint => Proposal) public proposals;
mapping(uint => mapping(address => bool)) public voted;
event ProposalCreated(uint id, string description);
event Voted(uint id, address voter, bool support);
constructor(address _token) {
governanceToken = IERC20(_token);
}
function createProposal(string memory _description) external {
require(governanceToken.balanceOf(msg.sender) >= 1000 * 1e18, "Need 1000 tokens to propose");
proposalCount++;
proposals[proposalCount] = Proposal(proposalCount, _description, 0, 0, block.timestamp + 3 days, false);
emit ProposalCreated(proposalCount, _description);
}
function vote(uint _proposalId, bool support) external {
Proposal storage proposal = proposals[_proposalId];
require(block.timestamp <= proposal.endTime, "Vote ended");
require(!voted[_proposalId][msg.sender], "Already voted");
uint weight = governanceToken.balanceOf(msg.sender);
require(weight > 0, "No voting power");
if (support) {
proposal.voteYes += weight;
} else {
proposal.voteNo += weight;
}
voted[_proposalId][msg.sender] = true;
emit Voted(_proposalId, msg.sender, support);
}
function execute(uint _proposalId) external onlyOwner {
Proposal storage proposal = proposals[_proposalId];
require(block.timestamp > proposal.endTime, "Voting not ended");
require(!proposal.executed, "Already executed");
require(proposal.voteYes > proposal.voteNo, "Proposal failed");
proposal.executed = true;
// 执行提案:转账 / 铸币 / 修改状态 等
}
}
✅ 合约亮点
-
提案门槛防止刷提案
-
投票按治理代币权重
-
投票状态透明
-
通过后可扩展多种执行操作
✅ 项目优化
-
引入
Governor
模块 + TimeLock -
链上执行多签验证
-
前端提案 / 投票 / 实时状态展示
-
IPFS 存储提案详细信息(去中心化)
3️⃣ GameFi | NFT + 激励系统实战
✅ 场景
玩家通过铸造 NFT,参与战斗或挖矿,赚取平台代币奖励
👉 类似 StepN、Axie Infinity
✅ 项目需求
-
NFT 铸造、升级
-
NFT 参与战斗 / 矿场挖矿
-
发放奖励代币
-
NFT 升级增加算力或奖励
✅ 合约结构
contracts/
├─ GameNFT.sol // 游戏 NFT
├─ MiningPool.sol // 挖矿奖励
✅ 核心合约(GameNFT.sol)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract GameNFT is ERC721URIStorage, Ownable {
uint public nextTokenId;
mapping(uint => uint) public nftLevel;
constructor() ERC721("GameNFT", "GNFT") {}
function mint() external {
_safeMint(msg.sender, nextTokenId);
nftLevel[nextTokenId] = 1;
nextTokenId++;
}
function upgrade(uint tokenId) external {
require(ownerOf(tokenId) == msg.sender, "Not your NFT");
nftLevel[tokenId]++;
}
function levelOf(uint tokenId) external view returns (uint) {
return nftLevel[tokenId];
}
}
✅ 核心合约(MiningPool.sol)
// 挖矿奖励根据 NFT 等级分配
contract MiningPool {
GameNFT public nft;
IERC20 public rewardToken;
mapping(uint => uint) public lastClaim;
constructor(address _nft, address _rewardToken) {
nft = GameNFT(_nft);
rewardToken = IERC20(_rewardToken);
}
function claim(uint tokenId) external {
require(nft.ownerOf(tokenId) == msg.sender, "Not your NFT");
uint reward = (block.timestamp - lastClaim[tokenId]) * nft.nftLevel(tokenId) * 1e18;
lastClaim[tokenId] = block.timestamp;
rewardToken.transfer(msg.sender, reward);
}
}
✅ 项目优化
-
动态调整挖矿奖励 → 激励用户长期参与
-
NFT 装备系统 → 多元玩法
-
游戏客户端集成 → Unity / Unreal
-
多链 NFT → zkSync / Arbitrum 跨链
4️⃣ Token 经济模型设计基础
设计要素 | 说明 |
---|---|
代币总量 | 固定 or 通胀 |
分配比例 | 社区、团队、投资、生态等 |
锁仓释放 | 线性释放、解锁条件等 |
流通控制 | 通缩燃烧、回购等 |
奖励机制 | 质押、分红、GameFi 挖矿 |
✅ 推荐工具
-
Tokenomics 模板(Notion/Excel)
-
Token Unlock Tracking(https://token.unlocks.app/)
-
Dune Analytics 数据展示
5️⃣ 最佳实践 & 项目迭代
✅ 最佳实践
-
先测试网 → 再主网(Goerli / Polygon / BSC)
-
多签治理 → 控制合约升级和铸币
-
代码开源 → 通过 Etherscan 验证
-
安全审计 → 自查 + 工具 + 外部审计
-
合约升级方案 → UUPS Proxy
✅ 项目迭代
-
MVP 验证 → 社区反馈
-
数据分析 → 优化机制
-
多链支持 → Layer2 / Rollup
-
DAO 社区治理升级
-
Token 经济模型优化
✅ 小结
这一章,你完成了 Web3 项目开发全流程!
✔️ DeFi 挖矿 + 质押系统
✔️ DAO 治理 + 投票执行系统
✔️ GameFi NFT 激励 + 挖矿系统
✔️ 经济模型设计思路
✔️ 主网部署、治理升级路径
🎯 课后挑战
-
基于 UniswapV2 协议,部署自己的 DEX
-
做一个 NFT 挖矿 + DAO 治理的 GameFi 项目
-
编写完整 Token 经济模型白皮书
-
主网部署 + Etherscan 验证 + Dune 看板
-
多签 + Gnosis Safe 控制治理
✅ 下一章预告|第十五章
👉 Layer2 / Rollup / zk 技术深度剖析
🚀 zkSync / StarkNet 实战
🚀 Arbitrum / Optimism 主网部署
🚀 Layer2 跨链桥、L1-L2 通信
🚀 零知识证明与隐私保护项目实战