付费视频,请购买课程( ¥2,000.00 )后再观看

Vibecoding: 升级合约添加离线签名上架

9次播放
13小时前

视频 AI 总结: 视频主要讨论了智能合约的升级与新功能实现。首先,将ERC721 NFT合约改造为可升级版本,利用OpenZeppelin Upgrades库,将构造函数替换为初始化函数。其次,重点介绍了NFTMarket合约的V2升级,引入了“离线签名上架”功能。卖家只需一次性授权NFTMarket,并通过链下签名完成上架,买家购买时由后端提供签名进行验证,显著减少了链上交易次数。视频还分析了AI实现的代码,并讨论了可升级合约中存储布局(如mapping和array中的结构体)的变量添加规则,强调了向后兼容性的重要性。

关键信息:

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