Solidity 솔리디티 강좌 25강 : 에러 핸들러 - assert, revert, require (0.4.22 ~ 0.7.x 버전)

flowing1ife·2023년 7월 7일
0

[ Solidity 깨부수기 ]

목록 보기
25/29
post-thumbnail

Solidity 솔리디티 강좌 25강 : 에러 핸들러 - assert, revert, require (0.4.22 ~ 0.7.x 버전)
이번엔 solidity의 0.4.22 ~ 0.7.x 버전, 에러 핸들러에 대해 알아보도록 하자.


에러 핸들러 (0.4.22 ~ 0.7.x 버전)

📌 Solidity

require : 특정한 조건에 부합하지 않으면 에러를 발생시키고 gas를 환불 시켜줌
revert : 조건없이 에러를 발생시키고 gas를 환불 시켜줌
assert : gas를 다 소비한 후 특정한 조건에 부합하지 않으면 에러를 발생 ( gas 환불 x )

// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;

contract lec25{
    function assertNow() public pure{
        assert(false); //test 용
    }

    function revertNow() public pure{
        revert("error"); //if or require 통해 조건 붙임 
    }

    function requireNow() public pure{
        require(false, "error now!"); //if or require 통해 조건 붙임 
    }
}

위의 3개의 함수 모두 에러가 발생하도록 코드를 작성하였다. 이제 함수를 호출 시 결과를 살펴보도록 하자.

1. require

👉 결과

274 gas 만 소비되고 우리가 작성한 error message가 함께 뜬다. 274 gas 만 소비된 이유는 함수 실행에만 gas가 소비되고 나머지 에러 발생 gas는 환불이 되었기 때문이다.

2. revert

👉 결과

코드를 살펴보면 false 명시 없이 우리가 작성한 error message와 함께 에러를 발생시킨 것으로 보아서 조건 없이 에러를 발생시킨다는 것을 알 수 있다. 그리고 require 과 마찬가지로 gas가 환불 된 것을 알 수 있다.

3. assert

👉 결과

2978936 gas를 소비한 것을 보아서 위의 require, revert와 다르게 가스를 환불해주지 않는다는 것을 알 수 있다.

조건이 붙은 에러 핸들러

// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;

contract lec25{

    function onlyAdults(uint256 _age) public pure returns(string memory){
        if(_age < 19){
            revert("You are not allowed to pay for the cigarette");
        }
        return "Your payment is succeeded";
    }

    function onlyAdults2(uint256 _age) public pure returns(string memory){
        require(_age > 19,"You are not allowed to pay for the cigarette");
        
        return "Your payment is succeeded";
    }
}

위의 두 함수는 모두 나이가 19세 미만이면 "You are not allowed to pay for the cigarette" error message와 함께 에러를 발생시킨다.

onlyAdults 함수는 revertonlyAdults2 함수는 require로 구현하였다.
여기서 중요한 점은 revert의 경우, if문이 참이면 에러를, require의 경우, 조건이 거짓이면 에러를 발생시킨다는 점이다.


👉 결과

둘 다 15를 인자값으로 전달하니 모두 에러를 발생시킨 것을 알 수 있다.


출처 및 참고 자료

profile
👩🏻‍💻 Backend Engineer, Contract Developer

0개의 댓글