以太坊-智能合約中的assert和require的區別
最新
05-17
朋友問我一個問題:為啥下面的這筆交易耗費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:星想法 |