iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Web 3

NFT、區塊鏈、比特幣,這些到底是什麼?? 讓我們從頭認識這些酷東西吧! 發出屬於自己的NFT!系列 第 21

[Day 21] 從BAYC猴子的智能合約 看懂背後運作原理(三)其實BAYC的合約有漏洞!

  • 分享至 

  • xImage
  •  

上篇回顧

上一篇我們發現了其實BAYC的智能合約有9成都不是自己寫的,而是使用OpenZeppelin開源函式庫輔助而成,那今天讓我們繼續往下看吧!


進入BAYC合約

https://ithelp.ithome.com.tw/upload/images/20221003/20152537mJMuUyxnCx.png

  1. 首先映入眼簾的當然是Solidity的版本
  2. 往下看看到合約的開頭後面有個Ownable,指的是接下來有些函式只能由合約作者執行
  3. BAYC_PROVENANCE指的是整個BAYC收藏系列的雜湊,用這個值來確保沒有東西可以變動,因為只要有東西被修改整個值就會不一樣了。而startingIndex這塊比較特殊,等等會特別跟大家說明
  4. apePrice很明顯指的就是鑄造一枚BAYC代幣所需的價格,其單位是Wei,換算下來是0.08ETH
    maxApePurchase也很值觀的就是一次合約互動最多只能鑄造20枚BAYC代幣
    MAX_APES則代表著BAYC代幣總數,不過這裡還沒有一個值
  5. saleIsActive是一個布林值,若是「是」則大家就可以鑄造,「否」則不行。除了等銷售時間到會自動開啟外,這裡也已有一個函式可以讓合約作者直接開啟或關閉銷售狀態,應該是緊急的時候用的。
    https://ithelp.ithome.com.tw/upload/images/20221003/20152537PQaO1dJppi.png
    REVEAL_TIMESTAMP則是解盲的時間,這裡尚未設定
  6. constructor這邊填入了maxNFftSupplysaleStart及ERC721的name, symbol,其這些東西其實是會從這邊帶入的,所以在合約中會找不到喔!https://ithelp.ithome.com.tw/upload/images/20221003/20152537wrKeCQuDJR.png
  7. MAX_APES就是把前面的BAYC代幣總數帶入,而REVEAL_TIMESTAMP的解盲時間其實就是設定成銷售後九天
  8. withdraw()這個函式是只有合約擁有者能使用的,其就是把合約地址的錢轉到擁有人的地址
  9. reserveApes()也是只有合約擁有者能使用的,執行一次可以直接鑄造30枚BAYC代幣,且沒有經過總數與開賣的時間限制。原意應該是想要留給團隊30隻使用,只不過沒有限制使用次數也繞過了所有檢查,目前被視為最大的漏洞。
    https://ithelp.ithome.com.tw/upload/images/20221003/20152537Iau2LaFjhY.png
    可以看到上傳合約後,團隊就使用了這個函式鑄造30枚BAYC,且在開始販售狀態後,有不少人執行了Mint(鑄造)的函式,有人一次鑄造1枚,也有人一次鑄造2、3枚。

BAYC的合約問題

  • 其中第一個最大的問題就是前面提到的第九點reserveApes()函式,合約作者可以隨時鑄造另外的30枚BAYC代幣,而這一按除了多畫30張圖,付點gas fee,就可以帶來近3百萬美金的收入...
  • 其次就是上面提到的第三點BAYC_PROVENANCE,這個值就是為了讓大家確保沒有人可以動合約或圖片的任何東西,不過往下翻幾行我們就可以看到setProvenanceHash()這個函式,原來合約作者也可以隨時調整這串雜湊值而不是把他寫死,這樣也顯得沒有意義了https://ithelp.ithome.com.tw/upload/images/20221003/20152537EgHJmdlGc8.png
  • 一樣是第三點的startIndex這區,BAYC團隊為了防止有人在鑄造期間狙擊稀有度較高的代幣,所以設計了一連串製造隨機數的函式,不過最後整個鑄造過程卻完全沒有用到這串程式碼,更讓費了gas計算一下沒有用到的東西。
    https://ithelp.ithome.com.tw/upload/images/20221003/20152537iJkwV0ZI5I.png
  • 最後是小問題點而已,不知道為什麼BAYC團隊不把第七點解盲的時間直接計算好放上去,而要每次進行計算現在是否符合時間,一樣浪費了gas fee。

--

小結

今天幾乎把BAYC的合約都講解完了,撇除OpenZeppelin函式庫的1800行程式碼,其實剩餘的200行並不難,除了有一些信任上的漏洞,還有一大串製造隨機數的函式都沒有用到...。明天我們來講解剩餘小部分的程式碼baseURI是什麼? 以及介紹圖片到底存在哪裡吧!

<上一篇> [Day 20] 從BAYC猴子的智能合約 看懂背後運作原理(二)ERC721標準與OpenZeppelin
<下一篇> [Day 22] 從BAYC猴子的智能合約 看懂背後運作原理(四)Metadata與IPFS


參考資料:


上一篇
[Day 20] 從BAYC猴子的智能合約 看懂背後運作原理(二)ERC721標準與OpenZeppelin
下一篇
[Day 22] 從BAYC猴子的智能合約 看懂背後運作原理(四)Metadata與IPFS
系列文
NFT、區塊鏈、比特幣,這些到底是什麼?? 讓我們從頭認識這些酷東西吧! 發出屬於自己的NFT!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言