加密貨幣弱點出現啦!工程師一時手賤,以太坊 90 億台幣當場被凍結

【我們為什麼挑選這篇文章】

一個人手殘的代價有多高?如果你是操作數位貨幣的人,代價可能非常高,這邊有個例子:輕鬆一點當場讓整個以太坊社群損失 90 億台幣。

啥?你問我怎麼辦到的?這篇文章做了深入的分析,並點出了目前數位貨幣中,以太坊的危險性,而今天的例子正是血淋淋的教材。

有沒有救?我自己去研究了一下,其實還是有的,國外這篇來自 Coindesk 的文章中,有專家提到可以使用硬分岔的方式取回,有興趣的讀者可點進去看(英文)。

仔細想想,還是把錢拿來買黃金放家裡好了……。

(責任編輯:林厚勳)

Github 用戶 devops199 今天在 Twitter 上說:「I accidentally killed it」。等大家反應過來,他的「小事故」已經「刪除」了以太坊上價值 3 億美元(約為台幣 90 億元)的代幣,代表這句話平均每個單字造成 7500 萬美元(約為台幣 22.6 億元)的損失。

 

光是 Polkadot 一個項目的一個帳號就有近 9000 萬美元(約為台幣 27 億元)消失。這條 Twitter 堪稱是今天最貴的一句話!

“我不小心删掉了(你们的3亿美元)”

事後有人問 devops199,為什麼捅這麼大一個簍子?他卻無辜地說「我是新手,正在學習。」的確,他是新手,只是在試驗剛學的智慧型合約語言。

 

編按:智慧型合約(smart contract),是一種能自動執行複雜指令的軟體程式。

這個新手捅的大簍子告訴我們:價值 300 億美元(約為台幣 9,000 億元)的以太坊智慧型合約開發如同兒戲,非常不專業。

那麼,這背後的技術失誤,究竟是怎麼回事?

為什麼錢可以「消失」?

我們都知道,數位貨幣可以高度匿名。可是匿名是雙刃劍。錢上沒寫你的名字,錢掉了你也證明不了是你的。

在數位貨幣世界中,一個「錢包」一般指一對密鑰。公鑰是錢包的「帳號」,可以隨便宣傳,別人可以往裡面打錢。比如下面是我的一個以太坊錢包公鑰,歡迎大家隨時匯錢進來!

0xD69b30FAdf81882253329Ab0149131c67602eEd1

可是,要想從帳號中拿錢出來,你必須得有帳號的私鑰。那麼問題來了:

如果我忘記了帳號私鑰怎麼辦?

回答是:

那麼再也沒人能夠動那個錢包中的錢,那些錢從世界上「消失」了。

中本聰曾經說過「消失的比特幣讓所有其他人的比特幣更值錢一點(因為供給少了)。把你丟失的比特幣當作對社區的捐贈吧!」。

Lost coins only make everyone else’s coins worth slightly more.  Think of it as a donation to everyone. — Satoshi Nakamoto

多重簽名的智慧型合約

這個帳戶密鑰對個人來說挺實用。可是對於公司來說有點難用。首先密鑰切忌亂傳,只能一個人知道。但是一個人掌握全公司數千萬美元的帳戶是一件很危險的事(且不說貪污挪用,就想想個人或者家人被綁架的風險)。

所以有聰明人利用以太坊的「智慧型合約」機制開發了一個智慧型合約可以支援多重簽名的帳號。這個帳戶沒有自己的秘鑰。從帳戶中提錢需要智慧型合約同時驗證幾個人的秘鑰。真是一個聰明的解決方法!

顯然,很多融資項目都需要這樣的智慧型合約。所以其開發者 Parity 把它放在以太坊公鏈上,作為一個「庫函數」讓大家自由調用。所以,很多 ICO 融資項目,包括 parity 自己的幾個大項目,用的智慧型合約帳戶都是通過調用這個庫實現的。

兩個「小」錯誤

可是,我們回憶一下,這個智能合約一開始並不是庫函數。只是後來出於方便,追求效率,要「彎道超車」,被大家當成庫函數用了。

作為一個獨立的智慧型合約,它有兩個特性是萬萬不該在「庫函數」中出現的:

  • 它可以有一個「擁有者」,而且設置「擁有者」的操作函數沒有任何保護。
  •  「擁有者」可以刪除這個智慧型合約。

我們現在知道 devops199 歪打誤撞地把自己設成了這個「庫函數」的擁有者,然後刪除了這個庫函數。造成的結果是,所有依賴這個庫函數的智慧型合約都無法工作了,這些智慧型合約對應的帳號也都鎖死了,其中的錢沒有人能動了。

未來的希望

可是,系統不都是人設計的嗎?為什麼不能進去人為改一下軟體,把刪除的智慧型合約恢復一下?

區塊鏈的重要特點是「去中心化」與「不可逆」。如果人可以改,又沒有權威中心,那是聽誰的,怎麼改呢?而且你憑什麼說這是個程式的「錯誤」?也許別人程式就是這麼設計的,你理解不了其中的深意而己?

智慧型合約的一個重要特點是「代碼就是法律」。現實生活中,律師經常鑽法律的漏洞。在區塊鏈世界,工程師鑽代碼的漏洞,不也是合理的嗎?區塊鏈世界有自己的規則與邏輯。

不過,對於在這個事件中「消失」了 3 億美元的項目而言,希望還是有的。在以太坊開發的計劃圖上,有一個已經擱置了一年多,優先等級不高的小項目:回收被智慧型合約凍住的資金(見 EIP156)。

當然這個「回收」具體怎麼做沒人知道,似乎在今天之前也沒人仔細想過。要有優秀工程師能解決這個問題,相信 1000 萬美元(約為 3 億台幣)的獎金不是夢。只是千萬不要又引入一個更壞的 bug。

我們學到了什麼?

這一次出問題的 Parity 是以太坊生態中最有能力的軟體開發公司之一。它不但開發了不少以太坊核心軟件,而且做了不少銀行的應用。不過,犯這種低級錯誤真是堪憂。

這個出問題的軟件是幾百人用來管理資金的開源軟件。Linus Torvalds 說過:在很多眼球的觀注下,所有的軟體錯誤都很膚淺。這裡顯然沒有發生。

不過更深層的問題是為什麼以太坊的智慧型合約總是錯誤百出?以太坊的圖靈完備虛擬機聽上去很好,可是很難編譯。有經驗的工程師都知道,用彙編語言是寫不出安全的現代程式的。安全的軟體一定是基於現代的編程語言與框架產生的。而以太坊在系統設計上的「不專業」已經是不爭的事實。

所以,區塊鏈要有真正企業級的應用,我們必須在「改進智慧型合約」這個方向上創新。比如在區塊鏈上引入經過多年實戰檢驗的企業級軟體框架。我個人認為,這是區塊鏈發展的主要方向之一。

未來 2020 年,區塊鏈將成為生活中再普遍不過的技術!
提早跨進未來新生活,就來參加 Connect 2020!

報名頁面:https://techorange.kktix.cc/events/connect-2020

——

(本文經合作夥伴 雷鋒網 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈 “我不小心删掉了(你们的3亿美元)”  〉,首圖截圖來源:CryptoShirt.io 官方網站。)

延伸閱讀

比特幣究竟有多值錢?全球貨幣排行榜大公開:比特幣流通市值大輸台幣 20 名
【電視記者銃康人】法國播比特幣介紹片,錢包密鑰沒遮好一秒損失三萬台幣
【在金庫的才算幣?】央行總裁彭淮南不承認比特幣:怕洗錢要列管

戰鬥民族不屑用比特幣!俄羅斯推出自有加密貨幣,不過卻一點都不「去中心化」
究竟比特幣在夯什麼?這 6 本私藏好書,讓你一次搞懂區塊鏈新時代