因為一個程序 bug,直接損失了 2.2 億人民幣。。。
這是近幾天發生在 NFT 圈子裡的一件事,某項目方因為自己的程序代碼出錯,導致鎖定的 11539.5 個 ETH(以太坊代幣)無法取出。
按照目前的價格,這些 ETH 總價值 2.2 億人民幣,妥妥肉疼。

NFT是非同質化代幣,屬於區塊鏈領域的一種應用,可以理解為一種虛擬的數字資產。
比如,你購買了一張 NFT 頭像,那這張圖片在網絡世界裡就唯一屬於你。即便大家可以複製拷貝,但所有權歸屬於你。
這次出事的是一個叫Akutar 的 NTF 項目方,他們發起了一個 NFT 產品售賣,採用的是荷蘭式拍賣法。
所謂荷蘭式拍賣法,就是由高到低出價的拍賣方式,這和傳統的遞增叫價拍賣方式有所不同。
舉個例子,假設一件產品的定價是 10000 元,想買入的就直接按照這個價格下單。如果最終成交價是 8000 元,那項目方會退你 2000 元。
設計這種規則的目的其實也是激勵用戶早點下單,因為早買晚買都不虧,加上 NFT 限量,就更提升了購買者的動機。
很快,這個項目就完成了 3400 萬美元的預定銷售額。
接下來,就是項目方履行後續環節了,退款和提現。
按照規則,項目方需要先退回最終成交價和定價之間的差額給用戶,然後才能自己提走項目售賣收益。
為了確保公平,也表態自己不會跑路的決心,項目方在智能合約里規定了需要先完成差價退款才能提現。
智能合約,可以理解成鎖定在區塊鏈中的一個事先定好的規則,任何人都無法篡改,只會被自動執行。
於是,在智能合約代碼里就有這麼一個判斷條件。

懂點技術的讀者知道,這是一段函數代碼,這個函數的作用是項目方用來提現的。
其中被紅框標記起來的是一個判斷條件,refundProgress>=totalBids,問題也恰恰出在這裡。
按照定義,變量refundProgress表示已經完成的用戶退款數,而變量totalBids表示所有用戶下單的 NFT 總數。
因為一個用戶可以購買多個 NFT,所以 totalBids 的數值一定是大於或等於 refundProgress 的。
也就是說,不可能出現像智能合約代碼中 refundProgress >= totalBids 的情況。
因此,當代碼執行到這裡的時候,這個判斷條件始終不會成立,後面的合約代碼就無法執行。
看懂的讀者應該知道了,這個 bug 的關鍵點就是這兩個變量之間的判斷符號寫反了。
程序員寫的是>=,而正確的應該是寫成<=。
用戶無法獲得退款,項目方也無法提現。
對用戶來說,雖然不能獲得退款,但至少還是買到了 NFT。但對於項目方來說,這價值 2.2 億人民幣的收益就直接被永久鎖定了,無法提走。
在區塊鏈的世界裡,這些代幣就永久不會被其他人取出,和銷毀沒什麼區別。
項目方相當於手持了一個永遠不會被打開的錢包,縱使腰纏萬貫,但也僅僅是一個賬面數字,沒有使用價值。
一個符號,價值 2.2 億,可以說是一個驚天 bug 了。
可能有人會說了,上線前難道不經過測試麼,這麼大的項目竟然犯這種低級錯誤。
那麼,這是誰的鍋?
首先,項目方在設計智能合約時一定會提前定義好規則,然後交給程序員去實施。上線前,也會經過測試和驗收。
其次,程序員在代碼中寫入這個規則時,也一定是建立在理解這個規則的前提下。可能是手抖,可能是粗心,恰好就把判斷符號寫反了。
另外,測試在上線驗收環節,可能沒有進行極端情況測試,只是按照一個人買一個 NFT 的場景完成了測試。
最後,項目方驗收時,以為能跑通全流程就沒問題了。
項目上線後,在生產環境出現了一個人買多個 NFT 的情況,bug 被觸發。
在我看來,問題的核心起點在程序員,驗收不嚴謹的責任在測試,而最終對外背鍋的一定是項目方。
這不是某一個人的鍋,而是一口大鍋罩在了整個項目組頭上。
這樣的問題在平時產品開發中其實並不少見,因為一個判斷條件的失誤,輕則引起功能異常,重則導致巨大的經濟損失。
如果你們感興趣,可以自己去查一下過去這些年因為程序 bug 導致產品重大損失的案例,其實有不少。
那些厲害的程序員之所以貴,也是有原因的。
如果為了省錢招了一些三流程序員填坑,或許只會給你挖出更大的坑。
這個世紀什麼最貴?
人才!

················· 唐韌出品 ·················
溫馨提示
關注【擴展迷Extfans】
閱讀更多精彩內容