menu-icon
anue logo
鉅樂部鉅亨號鉅亨買幣
search icon
區塊鏈

Solidity極簡入門|第十五講:異常

BlockBeats 律動財經 2022-07-26 16:03

cover image of news article
律動財經圖片

我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每周更新 1-3 講。

所有代碼和教程開源在 github:github.com/AmazingAng/WTFSolidity

這一講,我們介紹 solidity 三種拋出異常的方法:error,require 和 assert,並比較三種方法的 gas 消耗。

異常

寫智能合約經常會出 bug,solidity 中的異常命令幫助我們 debug。

Error

Error 是 solidity 0.8 版本新加的內容,方便且高效(省 gas)的向用戶解釋操作失敗的原因。人們可以在 contract 之外定義異常。下面,我們定義一個 TransferNotOwner 異常,當用戶不是代幣 owner 的時候嘗試轉賬,會拋出錯誤:


在執行當中,error 必須搭配 revert(回退)命令使用。  



我們定義了一個 transferOwner1() 函數,他會檢查代幣的 owner 是不是發起人,如果不是,就會拋出 TransferNotOwner 異常;如果是的話,就會轉賬。

Require

require 命令是 solidity 0.8 版本之前拋出異常的常用方法,目前很多主流合約仍然還在使用它。他很好用,唯一的缺點就是 gas 隨著描述異常的字符串長度增加,比 error 命令要高。使用方法:require(檢查條件,」異常的描述」),當檢查條件不成立的時候,就會拋出異常。

我們用 require 命令重寫一下上面的 transferOwner 函數:


Assert

assert 命令一般用於程序員寫程序 debug,因為他不能解釋拋出異常的原因(比 require 少個字符串)。他的用法很簡單,assert(檢查條件),當檢查條件不成立的時候,就會拋出異常。

我們用 assert 命令重寫一下上面的 transferOwner 函數:


三種方法的 gas 比較

我們比較一下三種拋出異常的 gas 消耗,方法很簡單,部署合約,分別運行寫的 transferOwner 函數的三個版本。

error 方法 gas 消耗:24445require 方法 gas 消耗:24743assert 方法 gas 消耗:24446

我們可以看到,error 方法 gas cost 最少,其次是 assert,require 方法消耗 gas 最多!因此,error 既可以告知用戶拋出異常的原因,又能省 gas,大家要多用!

總結

這一講,我們介紹 solidity 三種拋出異常的方法:error,require 和 assert,並比較了三種方法的 gas 消耗。結論:error 既可以告知用戶拋出異常的原因,又能省 gas。

原文連結

暢行幣圈交易全攻略,專家駐群實戰交流

▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!

前往鉅亨買幣找交易所優惠






Empty