ddd009

ddd009

twitter

名詞 合約分析

最近在學習 eth 上的智能合約開發,本文主要是對 Lil Nouns 合約的學習總結。你將了解到 Nouns 拍賣的過程, 如何將 NFT svg 以節省 gas 的方式完全存放在鏈上,以及如何在下一輪拍賣前提前獲取到 Nouns 的 traits(並且我製作了一個可以實時獲取下一個 lil Nouns traits 的工具)

拍賣合約#

參與過 Lil Nouns 拍賣的朋友會知道,每一輪拍賣結束後需要有人手動去 settle,當你點擊官網上的 Pick the next lil Noun 按鈕後,會喚起你的錢包去調用 NounsAuctionHouse 合約的 settleCurrentAndCreateNewAuction (), 這個函數進行了兩個操作,首先調用_settleAuction () settle 上一輪拍賣,如果這一輪沒有人出價那麼會把這輪的 lil noun 銷毀,如果有人出價,那麼會把 lil noun 轉到 winner 的錢包。最後會把 bid 資金轉給 lil nouns dao。

_

下面看一下 createAuction 的實現。創建 auction 時首先會 mint 一個新的 noun(這裡除了每第 10 和第 11 個 lil noun,都會 mint 給 auction 合約), 並將返回的 noun id 作為參數更新當前的 auction 變量狀態,同時會更新開始結束時間,將 settled 變量設置為 false。

image

在用戶進行出價時,必須大於等於前一個人的出價的 105%(第四個 require)。首先會把前一個出價人的 eth 還回去,然後會在 auction 變量中記錄當前的出價人和出價。最後如果是在拍賣結束前 90s 出價,會讓當前拍賣延長 90s

image

seed 合約#

下面說一下 mint 時 nouns 的 traits 是如何確定的。nouns 是使用前一個區塊的 blockhash 和前一個 nounId 作為 seed 生成偽隨機數,然後使用把這個偽隨機數對各個 trait 的總量取模作為該 trait id 的值。當然每次會把偽隨機數進行右移,不然在不同 trait 總量相同時生成的 trait id 總是相同的

image

既然是偽隨機數,那麼我們就可以對下一個 nouns 的 traits 進行預測,只要遵守上面代碼的算法,我們就能得到正確的 traits。為了方便大家我製作了一個可以實時看到下一個 lil noun 的網站,只要輸入上一個拍賣的 lil noun 的編號就能看到下一個 lil noun 的樣子當然你要保證自己 settle auction 的交易被當前區塊打包才行。

https://lil-nouns-predict.vercel.app

最後講一個非常酷的 trick,大家都知道 eth 上的存儲是非常貴的,所以 nft 項目方大多選在將 nft metadata 存放在 ipfs 等平台上。Nouns 使用了@0xsequence的 SSTORE2 合約來優化 gas。SSTORE2 選擇把數據編碼成字節碼部署成智能合約,在讀取的時候直接讀取合約的 EXTCODECOPY (第一次知道這種騷操作),唯一的缺點是不能像狀態變量一樣修改,很適合存儲靜態的數據。這樣寫入和讀取數據的 gas 都能得到可觀的優化。

subscribe://

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。