標準的 ERC721 因為是透過一個 mapping 把 tokenId 跟 address 連結在一起,因此在鑄造與儲存資訊時,就會是使用以下的方式來實作:
Token ID | Owner |
---|---|
0 | Alice |
1 | Bob |
2 | Alice |
3 | Alice |
4 | hydai |
5 | hydai |
每一個 Token ID 都必然會對應到一個 Owner,因此在鑄造的時候每購買一個 NFT 就得花費一次寫入的成本。
而 ERC721A 的改進就從這裡切入,試圖提供一個減少燃料手續費的解決方案。
X 代表留空
Token ID | Owner |
---|---|
0 | Alice |
1 | X |
2 | X |
3 | Bob |
4 | hydai |
5 | X |
今天當我們一次性購買多個 NFT 時,ERC721A 不再每個 Token ID 都寫入擁有者資訊,而是把它留空。
比如說 Alice 購買 3 個 NFT,他就把 Token ID 0
的擁有者設定成 Alice
但把 1
與 2
留空,因此當我們在查詢 1
與 2
時,他只需要往前找到第一個不為空的擁有者即可。
這樣的好處就是把購買 N 個 NFT 需要的 N 次寫入改成只需寫入 1 次,節省了 (N-1) 次寫入的燃料費用。
基本可以發現鑄造越多省越多。
X 代表留空
Token ID | Owner |
---|---|
0 | Alice |
1 | X |
2 | X |
3 | X |
4 | hydai |
5 | X |
但這樣的表示法在交易時要怎麼處理呢?
我們以上面的表格為例,若 Alice 要將 2
賣給 hydai
,這時需要做兩件事情:
2
的擁有者改成 hydai
3
的擁有者依然為 Alice
,因此需要多寫入一次 Alice
這個擁有者資訊到 3
的格子裡Token ID | Owner |
---|---|
0 | Alice |
1 | X |
2 | hydai |
3 | Alice |
4 | hydai |
5 | X |
這時的燃料花費就會比普通的 ERC721 多一次的寫入。
在實作上,選擇 ERC721、ERC721 Enumeration、ERC721A 等其實都是取捨問題。
只想做最基礎的功能,選 ERC721。
不管儲存的代價,想要在查詢方面容易,選 ERC721 Enumeration。
想要在鑄造時省錢,但交易時會貴一點,選 ERC721A。