安全的智能合約

雖然以太坊本身的技術沒有問題,不代表在其之上寫出的智能合約沒有bug,事實上,已經發生過很多次了。如果寫出健壯的智能合約成為了一個研究方向,沒有bug的程序是不可能存在的,所有健壯性策略的目標都是緊急規避和減小損失,而不是100%安全。

智能合約一些常見的bug

overrun bug

假設一個合約是這么寫的

 contract money {
        mapping(address=>uint) book

        ...
        function withDraw() {
               if(book[msg.sender] > 0){
                      if(msg.sender.call.value(book[msg.sender])()) {
                             book[msg.sender] = 0;
                      }
               }
        }
 }

然后攻擊者是這么寫的

  contract attack {
        uint times;
        function() {
               if(times == 0) {
                     money.withDraw();
               }
        }
  }

然后如果attack主動去call一次money.withDraw(),看看會發生什么?

transaction refuse

假設我們寫了一個拍賣合約,每當當前出價最高者被超過時,就將他所出的份額返還,該怎么寫?
如果寫成:

  ...
  if(被超過){
        lastwinner.send(lastbid);
  }

而某一個bidder的code是這樣的:

  contract bidder {
       function() {
          throw;
       }
  }

ok,如果這個bidder不幸的成為了暫時的winner,你就會發現,沒有任何一個人能出價超過它了,因為所有的超過他的出價交易都會被cancel掉

智能合約安全策略

停止開關

這個策略是用一個Emergency的modifier,緊急情況下可以停止某些智能合約功能。code如下:

modifiler stopInEmergency {if (!stopped) _ }
modifier onlyInEmergency {if(stopped) _ }

contract XX {
       function normal() stopInEmergency {}
       function destroy() onlyInEmergency {}
}

損失最小化

損失最小化策略主要是在合約的各個功能點處設立保護屏障,比如如果你在寫一個涉及轉賬的合約,那么在轉賬功能里就可以設置最大額度,如果超過這個額度,就需要合約管理員去approve,或者延遲發送。

bug獎券

這個是一個很奇妙的策略,就是讓你的智能合約可以很容易被別人部署,然后一旦有bug發現,就會給予發現者一點獎勵。

先檢查,再生效,最后才交互

任何一個函數,首先需要檢查各種條件并盡早報錯,然后讓函數應有功能生效,最后才是去與外界接口交互。
因為如果不提前生效改變自己的狀態,在與外界交互時它們就可能通過進一步觸發用合約不正確的狀態去執行一些操作。

pull over push

假設我們寫了一個拍賣合約,每當當前出價最高者被超過時,就將他所出的份額返還,該怎么寫?
如果寫成:

  ...
  if(被超過){
        lastwinner.send(lastbid);
  }

而某一個bidder的code是這樣的:

  contract bidder {
       function() {
          throw;
       }
  }

ok,如果這個bidder不幸的成為了暫時的winner,你就會發現,沒有任何一個人能出價超過它了,因為所有的超過他的出價交易都會被cancel掉。

原因是我們的函數里有對send的依賴,而這個是不安全的,正確的做法是出價被超過時,僅僅將他的出價打個標記,讓出價者自己去call某一個withdraw函數把自己的份額拿回來。


QQ群:654894791

微信公眾號: 94ETH

官網: https://www.94eth.com

頭條號: 周期與泡沫


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380