1、本课学习目标
- 理解去中心化众筹的业务模型与关键边界条件(目标、截止时间、退款/领取)
- 能从零实现一个支持多 Campaign 的众筹合约(以太币版本)
- 设计安全的资金流(pull-over-push、checks-effects-interactions、重入保护)
- 用 Foundry 写完整测试(创建 Campaign、认购、退回、提取)
2、关键设计点
- Campaign 状态机
Active(正在进行,可 pledging)Successful(达到目标,所有人可领取)Failed(截止且未达到目标,支持退款)Withdrawn(创建者已领取资金)
- 谁可以做什么
- 任意地址可以创建 Campaign(或限定为合约 Owner)
- 任意地址在活动期间可 pledge(支付 ETH)
- 创建者在活动结束且目标达成后可 claim(提取所有资金)
- 投资者在活动结束且目标未达成后可 refund(取回自己投入)
- 资金流安全原则
- Pull over Push:优先把退款/领取弧度做成可提款模式(用户调用提取),不要把外部合约回调放在自动转账中
- Checks-Effects-Interactions:先改变合约状态再进行外部调用
- 重入防护:使用互斥锁或 OpenZeppelin 的
ReentrancyGuard - 检查零地址、金额、截止时间合理性
- 时间处理
- 使用
block.timestamp;注意矿工可微调时间(可被操纵 ~900s),对大额攻击场景需谨慎
- 使用
- Gas / DoS 风险
- 不要在单笔函数里遍历大量数组(避免被 gas 限制 DOS)
- 使用 mapping 存储出资详情,避免遍历退款列表
3、简单实现
src/SimpleCrowdfunding.sol: