Solidity에서 요구 vs 주장

2921 단어 errorssolidityweb3
Solidity 버전 0.4.10에서 assert(), require() 및 revert() 함수가 도입되었습니다.
assert 및 require는 조건을 확인하는 편의 함수입니다. 조건이 충족되지 않으면 예외가 발생합니다.
  • require는 실행 전에 입력 및 조건의 유효성을 검사하는 데 사용됩니다.
  • assert는 절대로 false가 되어서는 안 되는 코드를 확인하는 데 사용됩니다. 어설션 실패는 아마도 버그가 있음을 의미합니다.
  • revert()가 실행을 중단하고 상태 변경을 되돌리는 데 사용됨

  • 통사론


    assert(bool condition)Panic 오류를 유발하므로 조건이 충족되지 않으면 상태 변경 복귀가 내부 오류에 사용됩니다.
    require(bool condition) 조건이 충족되지 않으면 되돌려 입력 또는 외부 구성 요소의 오류에 사용됩니다.
    require(bool condition, string memory message) 조건이 충족되지 않으면 되돌려 입력 또는 외부 구성 요소의 오류에 사용됩니다. 오류 메시지도 제공합니다.
    revert() 실행 중단 및 상태 변경 되돌리기
    revert(string memory reason) 실행을 중단하고 상태 변경을 되돌려 설명 문자열 제공

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.10;
    
    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(_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.
    
            // Here we assert that num is always equal to 0
            // since it is impossible to update the value of 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});
            }
        }
    }
    
    


    * Assert와 Require In Solidity의 주요 차이점
    *
  • ** assert 및 require 함수의 동작**

  • assert() ** 및 require() ** 함수는 Solidity의 오류 처리 측면의 일부입니다. Solidity는 상태 반전 오류 처리 예외를 사용합니다.

    즉, 오류가 발생하면 해당 호출 또는 하위 호출에서 계약에 대한 모든 변경 사항이 실행 취소됩니다. 또한 오류를 표시합니다.
    둘 다 조건을 확인하고 충족되지 않으면 오류가 발생한다는 점에서 매우 유사합니다.
  • 가스 유틸리티

  • 둘 사이의 큰 차이점은 **assert() **함수가 거짓일 때 남은 가스를 모두 사용하고 변경된 모든 내용을 되돌린다는 것입니다.

    한편, ** require() ** 함수는 거짓일 때 계약에 대한 모든 변경 사항을 되돌리지만 우리가 지불하겠다고 제안한 나머지 가스 요금은 모두 환불합니다.
    이는 디버깅 및 오류 처리를 위해 개발자가 사용하는 가장 일반적인 Solidity 기능입니다.

    결론

    오류를 처리하기 위해 Solidity는 문제를 일으킬 수 있는 변경 사항을 취소합니다.

  • assert는 내부 오류를 확인합니다. 분석 조건이 필요합니다.
  • Solidity 되돌리기가 생성하는 예외에 오류 문자열이 포함될 수 있음
  • 좋은 웹페이지 즐겨찾기