本文翻译自:
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 函数。

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

我们在下面详细介绍了我们所做的三个主要优化。虽然我们试图让它尽可能清楚 - 这篇文章的其余部分确实假设您已经了解 Solidity 和 OpenZeppelin 的 ERC721 / ERC721Enumerable 实现。
IERC721Enumerable 的广泛使用的 OZ 实现包括每个令牌元数据的冗余存储。这种非规范化方法以写入函数的显着成本优化读取函数,这并不理想,因为用户不太可能为读取函数付费。此外,我们的令牌从 0 开始按顺序编号这一事实让我们从基本实现中删除了一些冗余存储。我们强烈建议所有新发布的产品如果正在寻找大赢家,请仔细检查此文件。
假设 Alice 有 2 个代币并想再购买 5 个。在 Solidity 中,更新存储值需要消耗 gas。因此,如果我们在存储中跟踪 Alice 拥有多少代币,通过一次更新将 Alice 的持有量从 2 直接更新为 7 会更便宜,而不是将该值更新 5 次(每个额外的代币一次,从 2 到 3、3到 4 等)。
虽然这是一个相对简单的概念,但 NFT 领域中的绝大多数批量 mint 还没有采用这一点,因为 OZ 默认实现不包括批量 mint API,并且很容易从货架上获取现有解决方案而不对其进行调整.我们强烈建议所有支持批量 mint 的项目都考虑这个技巧。
这在本质上与优化 2 相似。假设 Alice 想购买 3 个代币 - 代币 #100、#101 和 #102。与其将 Alice 保存为所有者 3 次(每次都花费我们gas),我们可以改为仅保存所有者值一次,在语义上暗示 Alice 拥有所有 3 个令牌。
如何?假设 Alice 铸造了代币 #100、#101 和 #102,而 Bob 铸造了代币 #103 和 #104。内部所有者状态如下所示:

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

如果我们将其实现更改为递减,直到找到明确的所有者集,ownerOf 仍能按预期工作。
虽然这些延迟的所有者写入可能仍会在代币生命周期的后期发生,但我们仍然预计从整体上节省大量的净费用,因为这会减少 mint 时的 gas 花费,从而降低 mint 时整个生态系统的集中 gas 峰值的严重性。这种优化涉及一些额外的逻辑,尤其是在传输方面,但超出了本博客的范围。合同将在 mint 时间之前公开,开发人员将很乐意回答任何问题并进行讨论!
我们相信,铸造多个 NFT 的 Gas 成本低于我们在该领域所见的任何费用。我们的外部安全顾问 (Caribou) 已审查了合同,以确保我们的方法是合理的,以便用户自信地享受这些天然气节省。所有项目都应努力最大程度地减少 gas 负担,并尽可能为其社区迈向 O(1)。我们鼓励该领域的其他项目采用 ERC721A 标准进行任何公开销售,允许在一次交易中铸造多个 NFT。有关合同的任何问题,无论是关于代码还是关于为您的项目实施它,请通过 Twitter 私信联系 @locationtba 或 @2pmflow。
Azuki 将于太平洋标准时间 1 月 12 日上午 10:00 开售,到时候见。
