Ethereum智能合約的實際情況

作者:David Gerard 2017.7.24 英文版

如果你懷疑在不存在的王國的虛擬王座上花費加密幣在你的管轄範圍內是非法的,請避免參與(並向你的政治代表投訴)。 –引自以太坊上連鎖自動龐氏騙局應用: 以太王"1

幾十年來,智能合約只是一個有趣的假想。當區塊鏈出現時,智能合約的倡導者對區塊鏈的不可更改性非常感興趣。在比特幣上有一些智能合約的實驗,但以太坊幾乎是第一個在區塊鏈上編寫和運行計算機程序的實用平臺。

人類執行要求完美的任務能力是很差的。但是,當編程錯誤產生嚴重後果時,通常的做法是讓自己更難射中自己的腳:函數式編程語言、形式化方法、代碼的數學驗證、不要使用完整的計算機語言(避免圖靈完備性),等等。Szabo在2002年寫了一些要求和一個簡單的例子語言。2

當你有多個智能合約相互作用時,這一點尤其重要–大規模的併發編程,未知的可能有敵意的程序會調用你的函數。

以太坊忽略了這一切。它的標準合約語言Solidity是一種基於網絡編程語言JavaScript的程序性語言–使初學者儘可能容易編寫他們的第一個智能合約。它包含了許多結構,誤導了來自JavaScript的程序員,使其自尋煩惱。3 它不適合concurrency,而且很危險(/e.g./,Solarstorm漏洞4),儘管這是一個具體的預期使用案例。

有無窮無盡的指南教編寫以太坊的安全智能合約,但/大多數/以太坊合約都忽略了這些指南,其後果顯而易見。5

以太坊的智能合約甚至比非金融商業代碼還要糟糕;截至2016年5月,以太坊合約平均每1000行代碼有100個明顯的錯誤(明顯到機器都能發現)。6 (作爲比較,微軟代碼平均每1000行有15個bug,NASA代碼每50萬行約0個)。

由於加密幣愛好者已經自我選擇了輕信,他們寫的第一個智能合約是連環信、彩票和自動龐氏騙局。這些都很好地證明了正確編碼的要求,第一次,每一次:

  • 賭場的僞隨機數生成器的代碼裏有隨機種子,所以任何人都可以重新創建精確的隨機數序列。7
  • GovernMental龐氏騙局本來要支付1100個ETH,但由於一個編碼錯誤,這需要的gas超過了交易的最大可能gas。現在以太坊被永遠地卡在那裏了。8
  • 許多計劃由於錯誤而耗盡了gas /e.g./以太坊之王。9
  • Rubixi Ponzi:代碼中的錯誤,從其他合同中複製粘貼而來,允許任何人成爲所有者並拿走錢財。10
  • 有個騙局只支付給該計劃的創造者,因爲對代碼的隨意檢查看起來像是一個變量名稱中的錯字。11 毫無疑問,這只是一個意外,我敢肯定。

自動龐氏騙局在2017年幾乎沒有那麼時髦;大部分的努力都投入到管理ICO代幣的智能合約中。然而,正如The DAO所顯示的,編碼質量一如既往地“好”。



  1. 以太坊之王。“一個生活在區塊鏈上的以太坊合約,它將使你成爲國王或女王,可能授予你財富,並將使你的名字不朽。” ↩︎

  2. “分析合同的標準化語言”。2002. ( 檔案↩︎

  3. Massimo Bartoletti, Tiziana Cimoli. “A survey of attacks on Ethereum smart contracts”。第六屆安全與信任原則國際會議(POST),歐洲軟件理論與實踐聯合會議,2017年4月。 ↩︎

  4. “Solarstorm: 以太坊的Solidity語言的安全漏洞,而不僅僅是DAO。” 。Blockstack博客,2016年6月21日。 ↩︎

  5. Zikai Alex Wen和Andrew Miller。“Scanning Live Ethereum Contracts for the ‘Unchecked-Send’ Bug”。/Hacking Distributed/(博客),2016年6月16日。“經檢查,沒有一個通過我們啓發式檢查的Solidity程序實際應用了推薦的最佳實踐,即直接測試調用棧。” ↩︎

  6. “Ethereum合約將成爲黑客的糖果”。/Blockchain, Bitcoin and Business/ (blog), 18 May 2016. ↩︎

  7. “Ethereum合約安全:一個Ethereum輪盤。” 博客文章,2015年8月14日。 ↩︎

  8. Ethererik。“GovernMental的1100 ETH彩金支付被卡住了,因爲它使用了太多的gas”。Reddit /r/ethereum, 26 April 2016. ↩︎

  9. https://www.kingoftheether.com/postmortem.html 死後調查(2016年2月)/King of the Ether./ ↩︎

  10. “嗨!我的名字是Rubixi。我是一個新的以太坊Doubler。現在我的新家 – Rubixi.tk”。Bitcointalk.org比特幣論壇 > 替代加密貨幣 > 市場(替代幣) > 服務公告(替代幣),2016年4月11日。 ↩︎

  11. Vitalik Buterin。“主網中’祕密solitidy’編碼的現場例子”。Reddit /r/ethereum, 10 April 2016. ↩︎