智能合约设计(六)
一、信用卡授权与交易安全
1.1 授权机制
在智能合约中,授权机制类似于信用卡的授权流程:
- 工作原理:无密码信用卡授权(
approve)后,spender可在额度上限(allowance)内调用transfer进行扣币 - 额度检查:每次扣款会检查
allowance是否充足 - 额度管理:非无限授权时,扣款后
allowance会相应减少
1.2 安全意义
授权机制提供了重要的安全保障:
- 防止误操作和保障交易安全
- 类似银行卡先设定额度再消费的模式
- 避免直接划款导致的资金损失
1.3 诈骗风险警示
⚠️ 重要提醒:演示授权时曾因在假网址进行
approve操作导致资金被转走。请务必谨慎对待授权操作,确认网站真实性。
二、课程作业安排
2.1 本周作业:红包应用开发
开发一个完整的红包展示应用,具体要求如下:
- [ ] 使用 React 前端展示 ERC-20 name
- [ ] 编写红包合约并能够默写
- [ ] 前端连接合约,开发交互界面
- [ ] 实现发红包功能
- [ ] 实现抢红包功能
- [ ] 使用带
index的事件 - [ ] 部署到测试链
- [ ] 开源合约代码
2.2 下周作业:Web3 大学雏形
开发一个 Web3 大学的基础版本,包含以下功能模块:
- [ ] 部署平台币(一登币)
- [ ] 开发课程相关合约
- [ ] 创建课程功能
- [ ] 定制价格机制
- [ ] 购买代币和课程并授权
- [ ] 作者兑换收益功能
提示:可根据个人经验选择合适的着手点。作业涉及较多 Web3 概念,讨论时注意信息安全。
三、Web3 大学项目详解
3.1 项目背景
问题:
- 慕课等平台要求讲师实名授课,存在一定限制
- 大学教授有知识变现需求但缺少合适平台
解决方案:
- 提出匿名知识分享且能带来收益的平台概念
- 曾获得 150 万美元融资(因个人原因搁置)
- 现作为实战项目进行开发
3.2 核心模块
视频学习模块:
- Slogan:"Learn to Earn"(学习即收益)
- 用户激励:用户学习即可获得一登币奖励
- 教师激励:老师发布课程也有相应奖励
- 平台份额:初始化 Mint 一登币时为平台预留份额
NFT 证书系统:
- 学完课程奖励不可转让的 NFT
- 积累一定数量的 NFT 可获得工作推荐机会
3.3 技术实现
架构设计:
| 存储位置 | 内容 |
|---|---|
| 链下 | 视频内容 |
| 链上 | 购买记录、金融逻辑、资产信息 |
登录与验证:
- 采用 MetaMask 登录
- 通过签名验证用户身份
- 链上主要存储金融逻辑和资产信息
四、编程语言特性
4.1 函数重载
编译型语言(如 Solidity):
- 可通过编译器实现函数重载
- 函数编译后签名不同,编译器自动识别
TypeScript:
- 可实现伪重载
- 写法更美观,但最终编译为一个函数
- 重载主要为满足不同业务场景需求
4.2 抽象类与虚方法
抽象类特点:
- 可包含虚方法(virtual methods)
- 与
interface的区别:可以实现方法 - 子类重写方法时可加
override关键字
注意:不同语言对抽象类和虚方法的实现有所差异。
五、合约相关技术
5.1 函数选择器
- 函数编译后有对应的函数选择器
- 可通过特定语法调用
- 了解其编码地址即可使用
5.2 ABI(应用二进制接口)
定义:
- 一种 JSON 格式的接口描述
用途:
- 用于对智能合约公共事件和方法进行编码和解码
- 与挖矿计算哈希时的编码对应
- 编译后的 ABI 供前端使用
5.3 calldata
特性:
- 底层数据传输类型
- 参数只读,不可修改、不可扩容
- 指向外部调用传入的数据
优势:
- 不做内存拷贝,节省 gas
- 适合
external函数入参 - 可与
memory替换使用
5.4 合约调用合约
三种调用方式:
Import + New 方式
- 类似 JavaScript 的 import 和 new
- 需要代码仓库在一起
继承调用
- 类似 JavaScript 继承语法
- 适合有继承关系的合约
接口 + 地址调用
- 通过接口和合约地址调用
- 适用于线上已部署的合约
- 可使用
delegatecall或call方式处理特殊需求
总结
本节课程涵盖了智能合约开发的多个重要方面,从安全授权机制到实际项目开发,从语言特性到技术实现细节。通过 Web3 大学项目的实战演练,可以深入理解区块链应用的完整开发流程。