상세 컨텐츠

본문 제목

Solidity - Error

Programming Language/Solidity

by Yongari 2022. 12. 27. 19:32

본문

 

 

 

Error

An error will undo all changes made to the state during a transaction.
오류가 발생하면 트랜잭션 중에 상태가 변경된 내용이 모두 취소됩니다.

You can throw an error by calling require, revert or assert.
require, revert 또는 assert를 호출하여 오류를 발생시킬 수 있습니다.

  • require is used to validate inputs and conditions before execution.
    require는 실행 전에 입력 및 조건을 검증하는 데 사용됩니다.
  • revert is similar to require. See the code below for details.
    revert는 require와 유사합니다. 자세한 내용은 아래 코드를 참조하십시오.
  • assert is used to check for code that should never be false. Failing assertion probably means that there is a bug.
    assert는 절대 false가 아니어야 하는 코드를 확인하는 데 사용됩니다. 주장이 실패했다는 것은 아마도 버그가 있다는 것을 의미할 것이다.

Use custom error to save gas.
사용자 정의 오류를 사용하여 가스를 절약합니다.

 

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Error {
    function testRequire(uint _i) public pure {
        // Require should be used to validate conditions such as:
        // - inputs
        // - conditions before execution
        // - return values from calls to other functions
        // Require는 다음과 같은 조건을 검증하는 데 사용되어야 한다.
        // - 입력
        // - 실행 전 조건
        // - 호출에서 다른 기능으로 값 반환
        require(_i > 10, "Input must be greater than 10");
    }

    function testRevert(uint _i) public pure {
        // Revert is useful when the condition to check is complex.
        // This code does the exact same thing as the example above
        // 되돌리기는 확인 조건이 복잡할 때 유용합니다.
        // 이 코드는 위의 예제와 정확히 동일한 작업을 수행합니다.
        if (_i <= 10) {
            revert("Input must be greater than 10");
        }
    }

    uint public num;

    function testAssert() public view {
        // Assert should only be used to test for internal errors,
        // and to check invariants.
        // Assert는 내부 오류를 테스트할 때만 사용해야 합니다.
        // 그리고 불변량을 확인한다.
        
        // Here we assert that num is always equal to 0
        // since it is impossible to update the value of num
        // 여기서 우리는 num이 항상 0과 같다고 주장한다.
        // num 값을 업데이트할 수 없기 때문에
        assert(num == 0);
    }

    // custom error
    // 커스텀 에러 
    error InsufficientBalance(uint balance, uint withdrawAmount);

    function testCustomError(uint _withdrawAmount) public view {
        uint bal = address(this).balance;
        if (bal < _withdrawAmount) {
            revert InsufficientBalance({balance: bal, withdrawAmount: _withdrawAmount});
        }
    }
}

 

다음은 다른 예제다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Account {
    uint public balance;
    uint public constant MAX_UINT = 2 ** 256 - 1;

    function deposit(uint _amount) public {
        uint oldBalance = balance;
        uint newBalance = balance + _amount;
		
        
        // balance + _amount does not overflow if balance + _amount >= balance
        // 잔액 + _금액 > = 잔액일 경우 잔액 + _금액이 초과되지 않습니다.
        require(newBalance >= oldBalance, "Overflow");

        balance = newBalance;

        assert(balance >= oldBalance);
    }

    function withdraw(uint _amount) public {
        uint oldBalance = balance;

        // balance - _amount does not underflow if balance >= _amount
        // balance - _amount does not underflow if balance >= _amount
        require(balance >= _amount, "Underflow");

        if (balance < _amount) {
            revert("Underflow");
        }

        balance -= _amount;

        assert(balance <= oldBalance);
    }
}

 

Try on Remix

 

Remix - Ethereum IDE

 

remix.ethereum.org

 

출처 : https://solidity-by-example.org/error/

'Programming Language > Solidity' 카테고리의 다른 글

Solidity - Events  (0) 2022.12.29
Solidity - Function Modifier  (0) 2022.12.28
Solidity - View and Pure Functions  (0) 2022.12.27
Solidity - Fuction  (0) 2022.12.26
Solidity - Data Locations  (0) 2022.12.25

관련글 더보기