嘟嘟房 NFT 這次出包問題的核心, isWhitelisted 的 function。而真正儲存在區塊鏈的變數是 whitelistedAddresses,他是一個 Array 裡面塞滿了所有的白名單。在智能合約裡面用 for loop 去一個一個檢查資料,如果當 array 資料少的時候沒什麼太大問題,但如果白名單增長了,那問題可就大了! 本文由 FulyAI 創辦人 Rex Chen 撰稿。
(前情提要:嘟嘟房 NFT 白名單出包?網爆料「花上百美元手續費還失敗」,官方回應:Gas Limit 設太低)
嘟嘟房 3/11 早上 10:00 開放白名單可以去 mint,但是幾乎所有人有白名單的全部都 mint 失敗!!
這是嘟嘟房的智能合約地址
https://etherscan.io/address/0xae122962331c2b02f837b2aa501d3c5d903ed28a#code
根據合約可以看得出來他的 preSaleMint,有做檢查判斷是否 isWhitelisted
這是這次出包問題的核心, isWhitelisted 的 function
而真正儲存在區塊鏈的變數是 whitelistedAddresses,他是一個 Array 裡面塞滿了所有的白名單
在智能合約裡面用 for loop 去一個一個檢查資料,如果當 array 資料少的時候沒什麼太大問題,但如果白名單增長了,那問題可就大了。
根據合約 transaction 可以看出所有的白名單有 898 筆,寫入這些白名單資料花費了 0.689 以太的手續費,真是爆多啊
https://etherscan.io/tx/0x8c259c8b199826c9820c72c608fa61e52b687877e416073f9daa97138bfb2301
如果你運氣很好的你白名單在前面的順位,恭喜你可以用很低的 gas fee 去 mint 到,如果你在後面的話你就衰小了。
這些是剛開始所有的失敗交易紀錄,其實不知道為什麼有些人要偷跑先 mint,都有白名單了 XD,但他這個項目比上次偷跑賣光的 Yolocat 09哥合約好一點,他有設定 preSaleStart <= block.timestamp,所以基本上是不可能可以偷跑去 mint。
延伸閱讀:幣圈奇聞!「開賣前 1分鐘,完售」,陳零九YOLO Cat NFT入帳數千萬,地板價漲至9ETH
由於他有設定 preSaleStart <= block.timestamp
這時間換算台灣時間就是早上十點
這是第一筆真的交易失敗的交易紀錄,他是在白名單裡面的 258 號,算是比較中間的,這時候的 Gas Limit 是設定 420,000,因為 Gas Limit 設定太少,所以他 out of gas。
這是第一筆成功 mint 到的人,他在白名單裡面編號是第4號 XD,運氣超好,所以他只有花了 16.93 美元的手續費就 mint 到了,以太坊最近很冷清,這時候的 Base gas fee 才 32 Gwei,這樣子的手續費是正常的。
我們來看後來項目方手動調整到 Gas Limit 2 百萬,還是有人失敗,因為他在白名單裡面編號是 869 號,真是有夠衰小,花了 144.99 美元的手續費,還是 out of gas。
所以問題是什麼呢?
Gas Limit 設定太小是第一點,但正常自己用 metamask 都可以進階去手動調整,應該不是什麼太大問題
真正的問題在用 for loop 去爬 array,造成越後面順位的人手續費就越高,會是等比級數的成長,很恐怖,前面的人就很 lucky。
那這樣的問題該怎麼解決呢?
比較簡單的做法就是不要用 array 去存,用一個 mapping 去存這個地址是這個地址是白名單
然後判斷的時候直接判斷,就不用一個 for loop 去跑
但缺點是設定白名單一樣成本很高,但至少不會造成用戶去 mint 的時候成本很高!
所以現在主流做法都是用 merkle tree 的方式來實作白名單,好處是修改名單方便,也不用這麼高的手續費,小弟最近也剛研究完而已 XD,有任何寫錯的地方都歡迎技術交流。
📍相關報導📍
陳零九IG直面YOLO Cat NFT爭議:將補償所有人共7萬鎂Gas Fee、抽3隻貓
江振誠 NFT 爆合約漏洞「超額鑄造」!EchoX呼籲退還、勿在二級市場購買惹議
讓動區 Telegram 新聞頻道再次強大!!立即加入獲得第一手區塊鏈、加密貨幣新聞報導。
LINE 與 Messenger 不定期為大家服務