header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
掃碼下載APP
Partnered With:

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

閱讀本文需 6 分鐘
本文介紹solidity三種拋出異常的方法:error,require和assert,並比較了三種方法的gas消耗。
原文標題:《 Solidity 極簡入門: 15. 異常 》
原文作者:0xAA     


我最近在重新學 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。


原文鏈接


歡迎加入律動 BlockBeats 官方社群:

Telegram 訂閱群:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App

Twitter 官方帳號:https://twitter.com/BlockBeatsAsia

举报 糾錯/舉報
選擇文庫
新增文庫
取消
完成
新增文庫
僅自己可見
公開
保存
糾錯/舉報
提交