介绍 ERC721A:一种改进的ERC721实现

本文翻译自:

https://www.azuki.com/erc721a

简介

  • ERC721A 是 IERC721 的一种实现,在单笔交易中 mint 多个 NFT 可显著节省 gas。

  • Azuki 合约将使 mint 多个 NFT 的成本与 mint 单个 NFT 的成本基本相同。

  • 我们与外部安全顾问 (Caribou) 合作,以确保我们的方法是可行的。

  • 我们鼓励更广泛的社区采用这种实施方式来为他们的用户节省 gas 成本。

起因

几个月来,以太坊的 Gas 价格一直居高不下,开发社区需要适应。当流行的 NFT 项目开始出现时,gas 价格飙升,导致整个生态系统支付数百万的 gas 费用来进行交易。在 Azuki,我们正在与我们的社区一起为 Metaverse 建立一个品牌。开发团队的重点是优化我们的合约,并使我们的社区在 mint 时尽可能少地花费 gas 费用。

我们没有使用 OpenZeppelin 流行的 IERC721 和 IERC721Enumerable 默认实现,而是编写了我们的版本(在本文的其余部分,我们将其称为 ERC721A)并很高兴地宣布,Azuki 合约的确能够实现 mint 多个 NFT 与 mint 单个 NFT 的 gas 成本相同。

性能比较

我们比较了 mint 的 gas 成本和价格,比较了 OpenZeppelin 的 ERC721Enumerable 与 ERC721A。在我们的比较中,使用了相同的应用程序逻辑,唯一的区别是调用了 _safeMint 函数。

post image

假设成本时 300 gwei 和 3500 美元/ETH。这些只是估计值,很难预测 mint 时的 gas 和 eth 价格(目前在撰写本文时为 120 gwei)。

post image

这是如何实现的?

我们在下面详细介绍了我们所做的三个主要优化。虽然我们试图让它尽可能清楚 - 这篇文章的其余部分确实假设您已经了解 Solidity 和 OpenZeppelin 的 ERC721 / ERC721Enumerable 实现。

优化 1 - 从 OpenZeppelin (OZ) ERC721Enumerable 中删除重复存储

IERC721Enumerable 的广泛使用的 OZ 实现包括每个令牌元数据的冗余存储。这种非规范化方法以写入函数的显着成本优化读取函数,这并不理想,因为用户不太可能为读取函数付费。此外,我们的令牌从 0 开始按顺序编号这一事实让我们从基本实现中删除了一些冗余存储。我们强烈建议所有新发布的产品如果正在寻找大赢家,请仔细检查此文件。

优化 2 - 每批铸币请求更新一次所有者的余额,而不是每个铸币的 NFT

假设 Alice 有 2 个代币并想再购买 5 个。在 Solidity 中,更新存储值需要消耗 gas。因此,如果我们在存储中跟踪 Alice 拥有多少代币,通过一次更新将 Alice 的持有量从 2 直接更新为 7 会更便宜,而不是将该值更新 5 次(每个额外的代币一次,从 2 到 3、3到 4 等)。

虽然这是一个相对简单的概念,但 NFT 领域中的绝大多数批量 mint 还没有采用这一点,因为 OZ 默认实现不包括批量 mint API,并且很容易从货架上获取现有解决方案而不对其进行调整.我们强烈建议所有支持批量 mint 的项目都考虑这个技巧。

优化 3 - 每个批处理 mint 请求更新一次所有者数据,而不是每个 minted NFT

这在本质上与优化 2 相似。假设 Alice 想购买 3 个代币 - 代币 #100、#101 和 #102。与其将 Alice 保存为所有者 3 次(每次都花费我们gas),我们可以改为仅保存所有者值一次,在语义上暗示 Alice 拥有所有 3 个令牌。

如何?假设 Alice 铸造了代币 #100、#101 和 #102,而 Bob 铸造了代币 #103 和 #104。内部所有者状态如下所示:

post image

这里的关键是,如果我们想查看谁拥有 #102,我们实际上不需要将 Alice 显式设置为 #102 的显式所有者来执行此操作。我们可以更改 ownerOf 函数来执行以下操作:

post image

如果我们将其实现更改为递减,直到找到明确的所有者集,ownerOf 仍能按预期工作。

虽然这些延迟的所有者写入可能仍会在代币生命周期的后期发生,但我们仍然预计从整体上节省大量的净费用,因为这会减少 mint 时的 gas 花费,从而降低 mint 时整个生态系统的集中 gas 峰值的严重性。这种优化涉及一些额外的逻辑,尤其是在传输方面,但超出了本博客的范围。合同将在 mint 时间之前公开,开发人员将很乐意回答任何问题并进行讨论!

写在最后

我们相信,铸造多个 NFT 的 Gas 成本低于我们在该领域所见的任何费用。我们的外部安全顾问 (Caribou) 已审查了合同,以确保我们的方法是合理的,以便用户自信地享受这些天然气节省。所有项目都应努力最大程度地减少 gas 负担,并尽可能为其社区迈向 O(1)。我们鼓励该领域的其他项目采用 ERC721A 标准进行任何公开销售,允许在一次交易中铸造多个 NFT。有关合同的任何问题,无论是关于代码还是关于为您的项目实施它,请通过 Twitter 私信联系 @locationtba@2pmflow

Azuki 将于太平洋标准时间 1 月 12 日上午 10:00 开售,到时候见。