付费视频,请购买课程( ¥2,000.00 )后再观看
Vibecoding: 升级合约添加离线签名上架
9次播放
13小时前
视频 AI 总结: 视频主要讨论了智能合约的升级与新功能实现。首先,将ERC721 NFT合约改造为可升级版本,利用OpenZeppelin Upgrades库,将构造函数替换为初始化函数。其次,重点介绍了NFTMarket合约的V2升级,引入了“离线签名上架”功能。卖家只需一次性授权NFTMarket,并通过链下签名完成上架,买家购买时由后端提供签名进行验证,显著减少了链上交易次数。视频还分析了AI实现的代码,并讨论了可升级合约中存储布局(如mapping和array中的结构体)的变量添加规则,强调了向后兼容性的重要性。
关键信息:
- ERC721 NFT合约升级为可升级版本:
- 使用OpenZeppelin Upgrades库,继承
Upgradeable合约。 - 将原构造函数逻辑迁移到
initialize函数中。 - 部署脚本需使用
Upgrades.deployProxy来部署代理合约。 - 原合约中的
immutable变量需要改为普通变量,因为构造函数不再用于初始化。
- 使用OpenZeppelin Upgrades库,继承
- NFTMarket V2升级:引入离线签名上架功能:
- V1痛点: 卖家上架NFT需要两次链上交易(
Approve Token ID+List),效率低。 - V2方案:
- 卖家只需一次性调用
SetApprovalForAll授权NFTMarket合约。 - 卖家通过链下签名(包含Token ID、价格、Deadline等信息)完成上架,签名存储在后端数据库。
- 买家购买时,前端从后端获取该签名,并调用NFTMarket的
buy方法。 - 合约在
buy方法中验证签名的有效性,通过后执行NFT转移。
- 卖家只需一次性调用
- 优点: 显著减少卖家链上交易次数,提升用户体验,并可通过Deadline实现自动下架。
- V1痛点: 卖家上架NFT需要两次链上交易(
- AI实现代码分析与改进建议:
- AI在实现NFTMarket V2时,直接修改了现有
permitBuy函数的签名结构,导致与V1版本不兼容。 - 建议: 应创建新的函数(如
permitBuyV2)来处理新逻辑,以保持向后兼容性,避免破坏现有用户的使用方式。
- AI在实现NFTMarket V2时,直接修改了现有
- 可升级合约的存储布局考量(面试题):
mapping中struct添加变量: 只能在struct的末尾添加新变量,不能在中间添加,否则会导致数据错位。array中struct添加变量: 通常不允许在array中的struct添加变量,因为会导致整个数组的数据错位。特殊情况(如字节对齐未填满)下可能允许,但不推荐。- 存储槽位预留: 过去使用
gap变量预留存储槽位,现在推荐使用命名空间(namespace)方式管理存储。