# web3的世界一片蛮荒-详解ERC721A

By [Jason chen](https://paragraph.com/@jason-chen) · 2022-04-11

---

写下这篇文章的原因是今天看到了最主流的协议之一ERC721改进版的ERC721A，该协议可以使得mint多个NFT时的gas费大量降低数倍，这是一个很棒的改进方式，但与此同时我感叹web3的世界一片蛮荒，因为它仅仅将之前需要for循环mint的方式改为了批量mint，这样一个看似极其微小甚至是理应如此的优化却可以解决掉每次mint多花费的数千元，可见web3的基础设施建设差到一片蛮荒，web3基建蕴含着大量的机会等待挖掘。

首先ERC721是什么？是当前月交易额达到35亿美金的NFT最常用的标准协议，它定义了一种以太坊不可分割的、具有唯一性的token交互和流通的接口规范，在该规范下NFT具有以下特性：

*   在该合约范围内唯一的token id（可以移步我之前的文章[当你在买NFT时你买到的究竟是什么](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483721&idx=1&sn=06e96729063655a2f103143b007a8707&chksm=fb043775cc73be6365d1499081073977798f86a5cba98d065bb7efdb68a9b32a91d8fce998a0&scene=21#wechat_redirect)查看详情）；
    
*   一个token id只能倍一个owner持有；
    
*   一个owner可以持有多个NFT；
    

目前绝大多数NFT的合约代码都遵循该协议，该协议中对于铸造NFT是调用\_safeMint函数来实现，需要传入的参数有2个分别为“接收者地址”和“token id”。

如下图所示，表示给合约调用者msg.sender铸造一个编号为1的token。

![](https://storage.googleapis.com/papyrus_images/38b84e3a3c05347f39854162bf0ff374d73098ee91cc7343334c7c0610d47114.png)

那如果我允许用户一次可以mint多个NFT该如何处理？使用for循环遍历要mint的数量\_mintAmount，并在第二个参数传入已经产生的NFT数量+1，已经产生的数量使用totalSupply方法来获取。

![](https://storage.googleapis.com/papyrus_images/254ab0d769d884c240576257818a4ce885856546b9368b7e6eb72319aaf30edd.png)

看到这里其实问题已经显现了，为什么这么麻烦需要遍历还要不断的调用获知已经产生的数量，其实这在web2中也没太大关系不过就是运行效率低一些，但在web3则会导致产生大量的gas费，web3的所有写入操作都需要gas费，意味着每循环一次就要缴纳一次gas费，如果用户要mint多个NFT，这个成本将非常高昂，尤其是新项目开启mint时会产生的gas war，gas费可能飙升数十倍。

要知道NFT月交易额已经达到35亿美金，每天有大量的项目在上线，作为最流行的标准协议，居然一直存在这个问题，每天会有多少web3的用户白白浪费了gas费，又会有多少web2的用户望着高昂的成本被阻挡在外面。

ERC721A提供了一种解决方案，将\_safeMint的传入的第二个参数从token id变为mint数量，从而即使一次mint多个NFT交易费用也会和仅mint一个相差无几，具体效果可见下图：

![](https://storage.googleapis.com/papyrus_images/8c02fdc9786dafac60a480218a7870b4c59935672a34a62f7a962cf27d07e3ba.png)

我亲测后确实比使用传统的ERC721降低了10倍的gas费。

![](https://storage.googleapis.com/papyrus_images/2fb872c8f703aa6f802896afb10073861505ba140d60c1ea6291d252b819035f.png)

那这背后是如何实现进行批量mint的呢？我们先来看一下传统的ERC721中\_safeMint的实现逻辑。

先进行来两次校验，分别是地址是否有效和token id是否已经存在，然后使用\_beforeTokenTransfer进行转账，从0地址将token id转至对应地址。然后维护两个全局mapping分别为\_balances和\_owners将地址持有数量+1和将token id指向地址。

![](https://storage.googleapis.com/papyrus_images/326d92e2639360a7133ce68f1f4b39fafc4e0a17e9c34c23801b0ac49152e038.png)

下图为ERC72A的\_safeMint，其使用的数据结构假设每个用户mint的token id是连续的，所以每次批量mint都只会记录用户第一个mint出来的token id。

如ABC三个地址分别进行了mint，A拥有1、2、3号NFT，B拥有4、5号NFT，C只拥有6号，则相当于记录A1，2，3，B4，5，C6，2、3、5不会存储持有人，因为会认为A至B中间的2和3是A的，B至C中间的5是B的，而传统的ERC721则会将每个id都记录对应的持有人。

![](https://storage.googleapis.com/papyrus_images/715da6015d3658e00c8f637ecfb27ca98de3f603043ccd1051454dff5d936eb2.png)

下图为ERC721A查询token id持有人的方法，可以看到先传入了一个id，对该id进行递减直到找到某个id持有人，于是就认为该持有人也是传入id的持有人。

![](https://storage.googleapis.com/papyrus_images/9f09a64a97a390fdac26a019e59ef0d104c5f2ff370adc2cae81afb02aa339c9.png)

确实要承认ERC721A会为广大用户减少大量gas费，避免gaswar，对于web3市场的繁荣是一大利好，从侧面也可以看出这样基础的、常用的功能却经历了如此之久才被更新，可见web3蕴藏的大量荒地等待被开拓，那么你们在参与web3浪潮中都遇到了什么认为不完美的地方呢？欢迎交流探讨，感兴趣可添加微信交流：cj350306878，请备注姓名、公司与来意，谢谢。

其他文章：

*   [可以退款的ERC721R会成为闯入NFT市场的鲶鱼吗？](https://mp.weixin.qq.com/s/LWNDkqrOgBkAX_-Q1ue9Vg)
    
*   [那个可以跨链的Gh0stlyGh0sts会成为下一个Azuki吗？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483939&idx=1&sn=776834ea87918d2bd1a291c99547ba45&chksm=fb04341fcc73bd09879947945e0345b1b087bf9ee2f95aa7e67ee3056acacb1abf37ccba9892&scene=21#wechat_redirect)
    
*   [如何做一个钓鱼网站偷走周杰伦的NFT？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483914&idx=1&sn=f0b64d82edb21edadac8026bf5a916c0&chksm=fb043436cc73bd2011fe5130a591631dbf837f9e64ff6b6f5d8d68a7ade097d1955d85039fc1&scene=21#wechat_redirect)
    
*   [ERC1155是什么？以阿迪达斯NFT为例解析](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483891&idx=1&sn=b83b74b1f6d34b4609886e3f3614c1cf&chksm=fb0437cfcc73bed96264b08823dba695394927e957314518a61aa24aead12d26f7c257589ba0&scene=21#wechat_redirect)
    
*   [怎么通过看懂etherscan了解NFT项目情况？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483868&idx=1&sn=59fcaf88498f5d27cbb038c3dbf17bd7&chksm=fb0437e0cc73bef614f604b7b82d31bc39804f890d50515e01a73c3f5c4678c7b9a4b3d13da4&scene=21#wechat_redirect)
    
*   [我是怎么让V神给我转了一个NFT的？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483830&idx=1&sn=e5df3cf9f507efdaea639a8d4609a913&chksm=fb04378acc73be9cbe36c0e468716be904503008083982f45cb2f740273413928c4e8ce39c4d&scene=21#wechat_redirect)
    
*   [web3的产品架构和web2到底有什么区别？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483795&idx=1&sn=f517a10415078e36920e59db5c935475&chksm=fb0437afcc73beb9c274829a5ccdf0ce404416b6f81b60c6245066ef572500d4c54bfae4c47d&scene=21#wechat_redirect)
    
*   [为什么你在opensea“铸造”的NFT不需要交gas费？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483784&idx=1&sn=b216918a73392ddbcc69efb04988da5b&chksm=fb0437b4cc73bea2e2ba60afbae55ee1d2dd5be806da89b066ab90b47b5d8352e27e086c609a&scene=21#wechat_redirect)
    
*   [如何用5行代码发行一套虚拟货币？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483772&idx=1&sn=89bedacaaa642162b8d48e5b56dc8796&chksm=fb043740cc73be56b586fe8e1ad598548ebd4181a0799014d317581a20816d21c3de1bc268fc&scene=21#wechat_redirect)
    
*   [阿狸NFT到底做错了什么？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483760&idx=1&sn=3df35eed0200d80e7957ec9b64414ace&chksm=fb04374ccc73be5a963704f3cf34b4326edf31c842e452b2c9a8dc6d29617edd57ba453705c2&scene=21#wechat_redirect)
    
*   [web3的世界一片蛮荒-详解ERC721A](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483754&idx=1&sn=c67a5ec2c70d03d4dcb786458d07860e&chksm=fb043756cc73be40027ed1d5c4132bae513b897544078592485887a1e8c4898720835260d500&scene=21#wechat_redirect)
    
*   [如何在一级市场发行NFT（2）：NFT图片生成](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483737&idx=1&sn=bf525bef38f9716fa59d38c410d7068c&chksm=fb043765cc73be731fb65d0a7a8d75136c38c5210e67cd36cc0a4bc71fa883522b2dd827a320&scene=21#wechat_redirect)
    
*   [当你在买NFT时，你买到的究竟是什么？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483721&idx=1&sn=06e96729063655a2f103143b007a8707&chksm=fb043775cc73be6365d1499081073977798f86a5cba98d065bb7efdb68a9b32a91d8fce998a0&scene=21#wechat_redirect)
    
*   [NFT的130亿美金是从哪里来的？它与虚拟货币之间的关系是什么？](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483689&idx=1&sn=6d08a4f92972073b8966b93fe0fc5a14&chksm=fb043715cc73be039d01157e1dd6a56e5bc90d2c3ae59521f373c021cef174b0fb1fcf3e4ecb&scene=21#wechat_redirect)
    
*   [如何在一级市场发行NFT系列（1）：区块链合约开发](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483687&idx=1&sn=b1843982bf62367ee59b78ddda91c3a5&chksm=fb04371bcc73be0d75bfb7272b17604139d98e2e560bdde40859af9d44a431130f80176855ea&scene=21#wechat_redirect)
    
*   [浅谈我对元宇宙、Web3、区块链与NFT的理解](http://mp.weixin.qq.com/s?__biz=MzU0MzgyNjc3MQ==&mid=2247483664&idx=1&sn=bcf16ebc64aa00b97e6da7f52f9db718&chksm=fb04372ccc73be3adc86c44daec8b0c7ab882c942ed7c0dbcd9f0683a9ba846065fe37d4877f&scene=21#wechat_redirect)
    

![](https://storage.googleapis.com/papyrus_images/464a2a534e253e74f17ee9718979a863ffd84991a35a0239b835a5f51e50109c.png)

---

*Originally published on [Jason chen](https://paragraph.com/@jason-chen/web3-erc721a)*
