【Assert】

assert() 必須指被用來檢測內部錯誤,意思就是用來測試或 debug,並且用來檢測不變量(不該被改變的常數等)。

以下的例子是 num 這個變數必須只為 0,在我們的預想之中它得是個常數不該被更改,所以為了確認我們沒有忽略它被改變的情況,這裡加上 assert()num 被改變時使程式強制中止。

pragma solidity ^0.8.11;

contract error {
    function testAssert(uint _i) public view {
        assert(_i == 0);
    }
}

Asserted 會被觸發的情況及性質如下:

  • assert(X) 當X 之值為false

  • 踩到了超出範圍的 index

  • 除以0或取除以0之餘數(5/0 or 23%0)

  • 位元移動運算(Byteshifting)時位移量為負

  • 轉換負值或過大的數字成enum資料結構

Assert 和 Require的比較

  • require面對Revert operation(0xfd) 時會送回剩餘的gas

  • assert面對Invalid operation(0xfe) 時會消耗全部的gas

  • Assert 用於檢測完全不該在合約裡出現的情況

  • Require 用來檢測使用者的輸入等錯誤情況

Last updated