ERC721 vs. ERC721A:批次鑄造 NFT
作者 Albert Hu
許多 NFT 創作者都知道,在 Ethereum mainnet 上部署智能合約可能會非常昂貴。
然而,智能合約部署成本並不是區塊鏈工程師和 NFT 團隊唯一需要考慮的成本。打造成功的 NFT collection或收藏頭像專案,還包括建立社群,並讓使用者能夠輕鬆鑄造、交易與使用他們的 NFT。
我們來了解一個能幫助社群節省 NFT 鑄造 gas fee 的強大 NFT 智能合約優化方式:
透過 ERC721A 合約實現批量鑄造(batch minting)!
什麼是 ERC721A?
1 月 6 日,Azuki NFT 開發團隊公開發布了 ERC721A,一個探索批量鑄造的 ERC721 NFT 標準新實作:

在說明 ERC721A 智能合約實作的部落格文章中,@locationtba 和 @2pmflow 展示了估算數據,比較透過最常用的 NFT 智能合約起始程式碼——OpenZeppelin 的 ERC721Enumerable 合約——進行批量鑄造,與使用新的 Azuki ERC721A 合約進行批量鑄造,兩者能節省多少 gas:
這個表格顯示,隨著鑄造數量增加,ERC721A 使用的 gas 是以更小的常數因子在成長。
鑄造 NFT 的 gas 成本增加幅度為:
- 使用 Azuki ERC721A 合約:每多鑄造一個 約增加 2k gas
- 使用 OpenZeppelin ERC721Enumerable 合約:每多鑄造一個 約增加 115k gas
這個結果其實非常驚人!
以透過 ERC721Enumerable 合約鑄造一個 token 的價格,使用者透過 ERC721A 合約可以鑄造多達 5 個 token(甚至可能更多)。
誰不希望使用者的鑄造費用能節省高達 80% 呢?
更棒的是:
不只個別交易的 NFT 鑄造價格會變便宜,在熱門 collection 開賣期間,Ethereum 網路的壅塞程度也會降低,gas 價格的暴漲也會減少。
相當不錯的結果。
驗證批量鑄造多個 NFT 的 gas 節省效果
我想自己驗證這個結果,所以實作了兩個基本的 NFT 合約來建立 NFT:
接著,我分別呼叫兩者的 mint 函式,並記錄每筆交易的 gas 成本。
以下是我的結果:
這些測試的程式碼可以在這個 GitHub repo 中找到:demo-erc721a
這裡鑄造多個 NFT 的 gas 成本跟 Azuki 部落格文章顯示的數字略有不同,但相當接近,而且從鑄造一個、兩個到多個的 gas fee 增幅趨勢是一致的。
我們驗證了批量鑄造 NFT 確實能節省 gas!✅
ERC721A 智能合約如何透過批量鑄造節省 gas fee?
ERC721A 做了一些假設,這些假設影響了它的智能合約設計:
- Token ID 應該永遠從 0 開始連續遞增。大多數 NFT 專案本來就是這麼做的,Azuki 也在他們的假設中明確說明了這一點。
- 降低鑄造 NFT 的 gas 成本,比優化其他任何 ERC721 呼叫都更重要。鑄造正是 Ethereum 網路壅塞發生的時刻,也是使用者對一個 NFT collection 的第一印象。鑄造過程越輕鬆,口碑就越好。
在這些假設之下,ERC721A 做了以下的合約優化:
- 減少 token metadata 的儲存浪費。
- 將 ownership 狀態更新限制為每批次鑄造只更新一次,而不是每鑄造一個 NFT 就更新一次。
我們會來看看這些優化是怎麼做到的,但在那之前,我們應該先了解哪種交易的 gas fee 成本最高。
減少發送寫入交易所需的工作量,能為使用者節省 gas
區塊鏈上的交易大致可分為兩種:寫入(write)和讀取(read)。
寫入發生在我們修改或更新區塊鏈狀態時(例如:轉帳、寫入訊息、交易 NFT)。
讀取發生在我們請求既有資料以進行查看時。
使用者為寫入函式支付的 gas fee,永遠會比讀取函式的還要多。
因此,透過減少寫入交易的數量,或是減少發送寫入交易所需的工作量——即使這會讓之後的讀取交易需要更多工作量——都能降低使用者需支付的 NFT 鑄造成本!
而這正是 ERC721A 所達成的目標。
在 NFT 鑄造這件事上:儲存越多,問題越多;儲存越少,問題越少。
很聰明,對吧?
ERC721A 合約只需要設定兩次 ownership metadata:Alice 那批一次,Bob 那批一次。
然而,這也代表當要轉移一個沒有明確設定 owner 地址的 tokenID 時,合約必須從頭跑迴圈遍歷所有 tokenID,直到找到第一個有明確 owner 地址的 NFT,才能找到有權轉移該 token 的擁有者,然後設定新的 owner——也就是說,為了維持正確的分組,ownership 狀態可能會被修改不只一次。
以下是一個測試,用來模擬轉移情境並記錄 gas 成本:
閱讀這張表格的方式是先看 x 軸,再看 y 軸,例如:
- 「批量鑄造 1 個 NFT,然後轉移 tokenID 0」,或
- 「批量鑄造 3 個 NFT,然後轉移 tokenID 1」,或
- 「批量鑄造 5 個 NFT,然後轉移 tokenID 4」
從這些結果可以看出,轉移位於較大批次中間的 tokenID(例如 t1、t2)所需的成本,比轉移批次兩端的 tokenID(例如 t0、t4)要來得高。
請注意,這個簡單的實驗只追蹤了鑄造後單次轉移的成本。
降低批量鑄造 NFT 後轉移成本的變通方法
這裡有一個有趣的解法,可以將整批 NFT 轉移的總成本降到最低(原始來源為 William Entriken @fulldecent):
- 批量鑄造時,永遠鑄造允許的最大數量的 NFT。
- 轉移時,先從編號為奇數的 token 開始,並依升序進行。
- 之後再轉移編號為偶數的 token。

這個策略之所以有效,是因為它強制填入了 \_addressData 的 mapping,使得後續的轉移執行成本更低。
使用 ERC721A 合約的 NFT 專案範例
- @AzukiZen
- @cerealclubnft
- @TheLostGlitches
- @standardweb3
- @KittyCryptoGang
- @XRabbitsClub
- @WhaleTogether
- @pixelpiracynft
- @dastardlyducks
- @MissMetaNFT
- @StarcatchersNFT
- @LivesOfAsuna
- @richsadcatnft
- @themonkeypoly
- @womenofcrypto_
- @TravelToucans
- @HuhuNFT
用於批量鑄造 NFT 的 ERC721A 替代方案
對於更願意嘗試新事物的人,也可以花點時間看看一個更_新_的 ERC721 標準優化方案,稱為 ERC721Psi:

我們不會在本文深入探討 ERC721Psi,但如果你感興趣,想進一步了解它的運作方式,歡迎在推特上私訊我 @thatguyintech,我會另外寫一篇深入介紹的文章!
我們甚至可以進一步探索使用 Alchemy 部署一些範例專案。
ERC721A 合約仍然算是 NFT 嗎?
簡短的答案是:是的,ERC721A 合約絕對是 NFT。
任何實作了 ERC721 token 標準或 ERC1155 介面的合約,都被視為 non-fungible token(不可替代代幣)或 semi-fungible token(半同質化代幣)。
ERC721A 是 ERC721 標準的一種延伸與優化。
ERC721Enumerable 和 ERC721Psi 也是如此。
它們都屬於 ERC721 家族!
如何銷毀(burn)ERC721A token
當你想要處理掉錢包中的某個 NFT 或 token,但不想把它送給其他人,也不想出售時,可以把它發送到一個沒有人使用的特定錢包地址,藉此銷毀它。
很多人喜歡使用相同的 burn 地址,因為它們容易記住。
例如,0 地址:
0x0000000000000000000000000000000000000000
然而,對於 ERC721A NFT 來說,你不能把 token 轉移到 0 地址來銷毀 NFT,因為批量鑄造中的大多數 token 預設就是對應到 0 地址。
選擇另一個地址來銷毀你的 ERC721A NFT 就沒問題了!
例如,另一個常見的 burn 地址是「0xdead」地址:0x000000000000000000000000000000000000dEaD
你會使用 ERC721A 合約來批量鑄造你的 NFT 嗎?
ERC721A 合約是一種強大的方式,能幫助你的社群節省 gas 成本,並透過批量鑄造 NFT,避免 Ethereum 網路出現不必要的壅塞。
歡迎告訴我們你正在打造什麼樣的 NFT 專案,以及我們能提供什麼協助!我們有各種工具能協助你部署、監控、通知,以及行銷你的下一個 NFT collection。
別再猶豫,發推特給我們 @Alchemy,或是傳訊息來聊聊吧!
相關總覽

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。


