# ERC721A 的改進

ERC721A 官方說明 (opens new window)

標準的 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 但把 12 留空,因此當我們在查詢 12 時,他只需要往前找到第一個不為空的擁有者即可。 這樣的好處就是把購買 N 個 NFT 需要的 N 次寫入改成只需寫入 1 次,節省了 (N-1) 次寫入的燃料費用。

# 與 Enumeration 相比節省的費用

基本可以發現鑄造越多省越多。

# 交易時的代價

X 代表留空

Token ID Owner
0 Alice
1 X
2 X
3 X
4 hydai
5 X

但這樣的表示法在交易時要怎麼處理呢? 我們以上面的表格為例,若 Alice 要將 2 賣給 hydai,這時需要做兩件事情:

  1. 2 的擁有者改成 hydai
  2. 由於 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。

Last Updated: 2023/1/12 上午6:20:49