un.Block 区块链周报 #33:ERC-721A
March 6th, 2022

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

📧 Emailunblocketh@gmail.com

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

视觉设计:Jenny

特别鸣谢:

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

版权所有 ©️un.Block 2021

Subscribe to un.Block
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from un.Block

Skeleton

Skeleton

Skeleton