# ZombieClub Launch ### 白名單的驗證方式 1. 在合約指定簽章者地址,然後用對應的私鑰off-chain生成簽章,在mint時,再於合約中驗證簽章是否正確 2. 以白名單地址建立Merkel tree,mint時以Merkle tree proof檢查地址是否在白名單內 3. 將白名單地址全部寫在合約中,直接驗證 第三種方式明顯非常沒效率,而第一種、第二種各有優缺點,在這次ZombieClub的發行中,我們是採用第一種方式。 白名單鑄造階段,在合約中會紀錄每個地址已經鑄造過幾個token,並在生成簽章中使用到允許鑄造的數量,而不再額外儲存其他驗證相關的資訊,達到安全目的的同時,不花費更多的手續費! ### 公售時的做法 1. 依然檢查簽章,在生成簽章的過程中,不論地址為何,都當作白名單,並搭配reCAPTCHA防止機器人 2. 記錄使用過的簽章,這是要避免科學家使用同一個簽章以腳本大量鑄造的方法,有了這個檢查每次鑄造都需要通過完成reCAPTCHA再取得新的簽章,當然如果有個人聘僱了一些人同時幫他操作,這就不在討論範圍了 在公售前與公售時,我們都非常密切關注伺服器以及鏈上的狀態,在公售還沒開始時,伺服器收到了每秒數次的query,並且在公售後,reCAPTCHA回報的異常使用者佔了約50%(白名單時只有1%),可以說是非常驚人,也說明了reCAPTCHA確實有發揮效果;而鏈上也有些人一直嘗試以奇怪的方式鑄造,可能是自行調整參數或是用了一些腳本,我們無從得知,當然這些都失敗了,例如: https://etherscan.io/tx/0xa06aaa74957f1dd5ac06b034b510a192662f2b09a6b7f1a79c99e6a0197aaeba https://etherscan.io/tx/0x9ed03adba7abb26733dbe6cf698e752a6fa0320bd59c4bfecbe2450f6f636a94 https://etherscan.io/tx/0xc5e8426fa1b5b1304484a37220ec7c35605304a26c8e36724a417a8189d00707 https://etherscan.io/tx/0x129d3f13910c2cc060cdc334cccba51333bd7df0ddbb3946f0c771d969f840b3 ### 白名單與公售為何會有Gas的差異 前面已經說明的我們的作法,為了防止科學家大量鑄造,我們在公售時,多儲存了簽章的資訊,在區塊鏈上寫入/儲存資料是需要一定成本的,這也是為什麼公售時,消耗的"gas"(gas fee = gas x gas price)會略高於白名單鑄造。 ### 為什麼正常操作卻發生"out of gas"的問題 在錢包收到發送交易的指令時,錢包會根據合約估計一個gas limit,而當這個gas limit低於真正會花費的gas時,就會出現這個錯誤,並且手續費被消耗掉。首先有兩個技術點必須說明: 1. 智能合約只負責邏輯的處理,並不能做對gas limit的調整 2. 前端可以做,但我們並沒有限制gas limit的大小 所以可以確定這是錢包估計不正確所導致,一個好的作法是找出所有可能的花費,盡可能高估實際花費的gas,並設定更高的gas limit,所以常常會看到某些交易gas limit與實際消耗的gas有不小的差距,像是這個我們隨機找個交易(實際花費大約只有估計的一半): https://etherscan.io/tx/0xcd268d85a7f322457f5ca9cb75aafaf63b39004b1d57027472cce291ddd4c227 如何估計gas limit根據不同錢包可能有不同作法,這我們無法干涉,也有可能是錢包版本太舊,導致其估計的不正確。 ### 為什麼有人在公售前就鑄造到? 有些人可能發現到,第一個鑄造到的人時間是在公售前2秒,如下圖: ![](https://i.imgur.com/Te08mWb.png =500x) 這個時間是礦工填上去的時間,這個填寫數值可能會與實際時間有誤差,但實際上#5406這個token是在公售後才鑄造到的,我們已經在合約上做正確的限制以及簽名伺服器只在公售時才開啟,並且在public sale時,不斷監控剩餘數量,其沒有提前減少的現象發生,這些各位可以放心,我們團隊也在合約部署後就立刻完成了設定公售時間,如以下transaction: https://etherscan.io/tx/0x116a255dd56425afa968f473bf9049ee63d1871489383f8ec84419ce99559f8f ### 真的有防到科學家嗎? 以往一些熱門的NFT公售,都會有科學家以腳本搭配超高的gas price大量鑄造,造成其中一個錢包大量持有,或是大量transaction用了一樣的參數,而一般人都搶不到的問題,我們並沒有限制在公售時一個錢包只能鑄造一隻,但我們希望大家都能公平的鑄造,以下是實施措施的整理: 1. 以recapcha搭配簽章防止機器人 2. 簽章有效時間是一個小時,所以我們將白名單鑄造結束時間與公售開始時間拉開一個小時的間距,在白名單鑄造結束時,關閉簽章伺服器,並更換簽章私鑰以及地址,確保科學家無法以白名單鑄造時獲得的簽章,用在公售時大量鑄造。 3. 為了防止流量瞬間衝高,我們將伺服器設計為不使用資料庫、不連結區塊鏈查詢資料,程式將所有設定存於記憶體中使用,降低伺服器負擔。 我們也分析了公售時地址與鑄造的數量關係,以下為將公售的NFT在鑄造完的那個block進行快照,統計每個地址鑄造到幾個的關係圖: ![](https://i.imgur.com/09Xg17U.png =500x) 我們可以看到其實大部分地址都只鑄造到一個,並且每一個鑄造都用了不同的參數,這是我們樂見且預期的效果,公售的本質就是一種博弈,若要達到first come first serve的效果,只有完全的中心化才能做到,我們已經盡力做到最好,確保公平性以及體驗,希望大家可以理解!