un.Block

Posted on Mar 06, 2022Read on Mirror.xyz

un.Block 区块链周报 #33:ERC-721A

ERC-721 Variant

随着 NFT 的繁荣,我们终于看到一些项目方对 ERC-721 提出了更新。对于一个 NFT 团队来说,技术大概率不是他们的长处,但还是让我们来看看他们对 ERC-721 有一些什么样的想法

各位开发过 NFT,并且用 ERC-721 标准进行开发的读者们用的是什么库呢?我们一般第一选择是 Openzeppelin 的库,但 Openzeppelin 的 tokenURI 规范和 Opensea 并不是非常的兼容。Openzeppelin 要求平台在访问元数据时,自动为 tokenURI 加上 .json 的后缀。然而 Opensea 并不遵守这个规范,隔壁 Rarible 倒是遵守了这个规范。因此我经常会这样魔改一下:

import "@openzeppelin/contracts/utils/Strings.sol";

string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));

ERC-721A

Azuki 推出了完全兼容 ERC-721 的 ERC-721A,并支持使用 NPM 进行安装,作为库导入到自己编写的合约里。目前在官方给出的清单中,有将近 40 个项目使用了 ERC-721A,例如 Cereal Club,X Rabbit Club,The Women of Crypto 等。除了单纯的 ERC721A,Azuki 还推出了两个变种,ERC721A Burnable 和 ERC721A Owners Expicit。如果你想要使用 ERC-721A 进行开发,需要注意的的是 ERC-721A 并没有类似 Openzeppelin 那样的完整 API 文档。

在 ERC-721A 中,Azuki 的改进有两点:

  1. Mint 1 个 NFT 和 Mint 多个 NFT 手续费几乎一样
  2. 降低 Mint 的基础手续费

Azuki 还将 ERC-721A 和 ERC-721 Enumerable 的 Mint 手续费做了比较:

从数字上来看,基础 Mint 手续费降低了一倍,每多 Mint 一个,ERC-721A 只会增加些许的手续费。

为了达到这点 Azuki 在代码层面做了这几个主要改动:

  1. 删除 ERC-721 Enumerable。ERC-721 Enumerable 以更昂贵的 Mint,大大增加了读取速度。Azuki 认为如果 TokenId 是有顺序的,我们可以手动遍历,因此 ERC-721 Enumerable 是没有必要的。
  2. 支持 Batch Mint,并且只进行一次更新。例如 Alice Mint 了 3 个 NFT。常规的合约会对 Alice 的 Balance 进行 3 次更新。从 0 → 1,1 → 2,2 → 3。然而 Azuki 只进行了一次更新,即 0 → 3。以太坊的写操作非常昂贵,因此这个方法可以为我们省下不少的手续费。
  3. 对于一次 Mint,不管 Mint 了几只,ERC-721A 也仅仅需要一次写入来更新所有这些 NFT 的所有者。如果一个用户拥有连续的三个 NFT,那么在存储中只有第一个的所有者是他,后面两个则为初始的 0 地址。因此 Azuki 在读取 NFT 的所有者函数中又额外的逻辑。

根据项目自己的一些需求,Azuki 对通用库进行了一些修改,来实现在特定场景的手续费降低。例如第三条就牺牲了读取的性能。这里的大部分优化都存在 Tradeoff。

📔 相关阅读:

如果你喜欢本期内容,️欢迎点赞分享给你觉得有需要的人。

🚏Find us

💻 Website: unblock256.com

✈️ Telegram: un.Block Weekly

🕊️ Twitter: @unBlock256

📧 Email[email protected]

📤 分发渠道:知乎 | Notion | Substack | Medium | Mirror | RSS | 即刻 | 微信订阅

视觉设计:Jenny

特别鸣谢:

本文非商业目的转载授权遵循 CC BY-NC 4.0 协议

版权所有 ©️un.Block 2021