當前位置:
首頁 > 最新 > 以太坊-智能合約中的assert和require的區別

以太坊-智能合約中的assert和require的區別

朋友問我一個問題:為啥下面的這筆交易耗費220多美金?

這個交易只是簡單的token轉帳,調用了Poker Chips (CHP)智能合約的轉賬函數而已。該智能合約的轉賬函數也非常簡單:

因為這筆交易遠遠在ICO(startTime)之後,所以邏輯上就是發送賬戶減幣,目標賬戶增幣。整個交易使用的gas應該不大,最多幾萬才對,為啥使用了759萬的gas,導致220美金的交易費用呢?

問題竟然在SafeMath的sub函數:

在執行這筆交易的時候,賬戶的餘額不足330個幣,導致SafeMath的sub函數中的assert異常。

從solidity的官方文檔可以查詢到:assert會耗費當前交易的所有油費,require會返回未消耗的油費。

http://solidity.readthedocs.io/en/v0.4.23/control-structures.html#error-handling-assert-require-revert-and-exceptions

總結:在token轉賬時,毫無顧忌的使用大油費,期望交易能順利執行,並退回未使用的油費是有風險的。如果token的智能合約執行中,拋出asset異常,所有的油費將給「充公」。為了避免風險,建議使用合適的油費。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 星想法 的精彩文章:

以太坊源代碼-ethash演算法介紹
以太坊源碼分析-交易到打包流程概述

TAG:星想法 |