ERC721A詳解

打破傳統思維,為消費者省下千萬美元的協議

Greg Shen
Jun 12, 2022

前言

之前答應朋友要寫一篇解釋 ERC721A的文章,偷懶了這麼久,還是該把它補完,今天突然想寫就來寫完它吧!

幸運的是,我在重看 ERC721A合約發現他在三天前剛好優化一次,下面的解說我也會放新版合約,說不定我是台灣第一個發現這件事的(?

在講解 ERC721A之前,先來探討一下 ERC721是什麼~

再等等,先講一下 ERC跟 EIP是什麼好了!

EIP, ERC解釋

首先,EIP(Ethereum Improvement Proposals)字面上的意思就是以太坊改進方案

EIP官網的banner

我們可以看到改進方案牽涉到這麼多面向,包含核心、網路、介面,然後ERC也出現在上面,所以 ERC其實就是 EIP的一個子集合,ERC(Ethereum Request for Comment)主要就是在建立 token的標準,其中 ERC20(Ethereum Request for Comment 20)就是我們熟知的同質化代幣,為什麼叫同質化?因爲同樣單位的同種代幣的價值、性質都是一樣的。

ERC721又是什麼?

大家或多或少都聽過 ERC721是 NFT(Non-Fungible Tokens),也就是非同質化代幣,這個協議與 ERC20不同,ERC20代幣最多可以切割到小數點後十八位(也可以到小數點後一位,看你怎麼寫),但 ERC721每一個的最小單位就是1,並且會給每個 token不同的ID。可能會有人特別喜歡 ID 777或是 8888,這時候不同ID可能就會有不同價值,這時候再讓它 point到不同的圖,每個NFT的價值差異就出來了。

再深入一點說,ERC721這個規範下的NFT具有以下特性:

  1. 在合約範圍內的每個 NFT都有唯一的 ID
  2. 一個 token ID只能被一個只能被一個 owner持有
  3. 一個 owner可以持有多個 NFT

目前絕大多數 NFT的智能合約都遵循 ERC721,該協議中對於鑄造NFT是調用 _safeMint來實現,需要傳入的參數分別為“接收者地址”和“token id”。

_safeMint function of ERC721

那如果我允許用戶一次可以mint多個NFT該如何處理?使用for循環要mint的數量 _mintAmount,並在第二個參數傳入已經產生的NFT數量+1,這邊已經產生的數量使用totalSupply方法來獲取。

其實問題已經很明顯了,為什麼這麼麻煩,不僅需要迴圈還要不斷調用已經產生的數量,其實這在 web2中不過就是運行效率低一些,但在 web3則會產生大量的 gas fee, web3的所有寫入操作都需要 gas fee,意味著每循環一次就要繳納一次 gas fee,如果用戶要 mint多個 NFT,這個成本將非常高昂,尤其是新項目開放 mint時會產生的 gas war, gas費可能飆升數十倍。

ERC721A提供了一種解決方案,將 _safeMint的傳入的第二個參數從 token ID變為mint數量,從而即使一次 mint多個 NFT交易費用也會和僅 mint一個相差無幾,具體效果可見下圖,Gas Saved的確隨著 mint數量明顯增長:

AZUKI官方所提供圖片

那這背後是如何實現進行批量 mint的呢?我們先來看一下傳統的 ERC721中_safeMint的邏輯

先進行兩次檢查,分別是地址是否有效及 token ID是否已經存在,然後使用 _beforeTokenTransfer進行轉賬,從0地址將 token ID轉至對應地址。然後更新兩個全局 mapping分別為 _balances和 _owners將地址持有數量+1和將token id指向 owner地址。

_mint function of ERC721

下圖為 ERC721A的 _mint,它會代入 minter與數量共兩個參數,而它只會將第一個tokenID記錄owner,後續的tokenID並不會直接記錄owner,而是會將它的使用權給予前一個被抓到的owner,並且用_currentID去記錄原本累積到的tokenID數字加上這次所mint的數量,讓下一個minter從這_currentID之後開始mint,其實這段看不懂也沒關係,因為我自己寫完也覺得寫得很不清楚…讓我們直接看例子…

舉例來說,若甲乙丙三個地址分別進行 mint,甲擁有1、2、3號NFT,乙擁有4、5號NFT ,丙只擁有6號,則相當於記錄甲1,2,3 ,乙4,5,丙6 。2、3、5不會儲存 owner,因為這個協議的_packedOwnershipOf function會認為甲至乙中間的2和3是甲的,乙至丙中間的5是乙的,而傳統的ERC721則會將每個 ID都記錄對應的持有人。

_mint function of ERC721A

下圖為ERC721A查詢token ID持有人的方法,可以看到先傳入了一個token ID,再對該 ID進行遞減直到找到某個 ID持有人,剛剛所經過的tokenID的持有人就屬於這個持有人。

_packedOwnershipOf function of ERC721A

ERC721A在原本的機制上稍作改變就可以為 NFT 領域中省下不少會花在 gas fee 的錢,除了保護使用者的荷包,也令這些原本會送給礦工的錢繼續留在 NFT 市場中。

從這個案例中,我們可以發現區塊鏈生態中仍有許多值得我們優化的作法,一但被市場認同便有一飛沖天的可能性。

以上就是ERC721A的介紹啦!希望有幫助到讀者!

追蹤以獲得更新通知,歡迎隨時聯繫我

Email: gregshen0925@gmail

Telegram: @gregshen0925

歡迎追蹤 :)

--

--