上一篇我們發現了其實BAYC的智能合約有9成都不是自己寫的,而是使用OpenZeppelin開源函式庫輔助而成,那今天讓我們繼續往下看吧!
Ownable
,指的是接下來有些函式只能由合約作者執行BAYC_PROVENANCE
指的是整個BAYC收藏系列的雜湊,用這個值來確保沒有東西可以變動,因為只要有東西被修改整個值就會不一樣了。而startingIndex
這塊比較特殊,等等會特別跟大家說明apePrice
很明顯指的就是鑄造一枚BAYC代幣所需的價格,其單位是Wei,換算下來是0.08ETHmaxApePurchase
也很值觀的就是一次合約互動最多只能鑄造20枚BAYC代幣MAX_APES
則代表著BAYC代幣總數,不過這裡還沒有一個值saleIsActive
是一個布林值,若是「是」則大家就可以鑄造,「否」則不行。除了等銷售時間到會自動開啟外,這裡也已有一個函式可以讓合約作者直接開啟或關閉銷售狀態,應該是緊急的時候用的。REVEAL_TIMESTAMP
則是解盲的時間,這裡尚未設定constructor
這邊填入了maxNFftSupply
、saleStart
及ERC721的name, symbol
,其這些東西其實是會從這邊帶入的,所以在合約中會找不到喔!
MAX_APES
就是把前面的BAYC代幣總數帶入,而REVEAL_TIMESTAMP
的解盲時間其實就是設定成銷售後九天withdraw()
這個函式是只有合約擁有者能使用的,其就是把合約地址的錢轉到擁有人的地址reserveApes()
也是只有合約擁有者能使用的,執行一次可以直接鑄造30枚BAYC代幣,且沒有經過總數與開賣的時間限制。原意應該是想要留給團隊30隻使用,只不過沒有限制使用次數也繞過了所有檢查,目前被視為最大的漏洞。Mint(鑄造)
的函式,有人一次鑄造1枚,也有人一次鑄造2、3枚。reserveApes()
函式,合約作者可以隨時鑄造另外的30枚BAYC代幣,而這一按除了多畫30張圖,付點gas fee,就可以帶來近3百萬美金的收入...BAYC_PROVENANCE
,這個值就是為了讓大家確保沒有人可以動合約或圖片的任何東西,不過往下翻幾行我們就可以看到setProvenanceHash()
這個函式,原來合約作者也可以隨時調整這串雜湊值而不是把他寫死,這樣也顯得沒有意義了
startIndex
這區,BAYC團隊為了防止有人在鑄造期間狙擊稀有度較高的代幣,所以設計了一連串製造隨機數的函式,不過最後整個鑄造過程卻完全沒有用到這串程式碼,更讓費了gas計算一下沒有用到的東西。--
今天幾乎把BAYC的合約都講解完了,撇除OpenZeppelin函式庫的1800行程式碼,其實剩餘的200行並不難,除了有一些信任上的漏洞,還有一大串製造隨機數的函式都沒有用到...。明天我們來講解剩餘小部分的程式碼baseURI
是什麼? 以及介紹圖片到底存在哪裡吧!
<上一篇> [Day 20] 從BAYC猴子的智能合約 看懂背後運作原理(二)ERC721標準與OpenZeppelin
<下一篇> [Day 22] 從BAYC猴子的智能合約 看懂背後運作原理(四)Metadata與IPFS
參考資料: