Solidity 솔리디티 강좌 25강 : 에러 핸들러 - assert, revert, require (0.4.22 ~ 0.7.x 버전)
이번엔 solidity의 0.4.22 ~ 0.7.x 버전, 에러 핸들러에 대해 알아보도록 하자.
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개의 함수 모두 에러가 발생하도록 코드를 작성하였다. 이제 함수를 호출 시 결과를 살펴보도록 하자.
👉 결과
274 gas 만 소비되고 우리가 작성한 error message가 함께 뜬다. 274 gas 만 소비된 이유는 함수 실행에만 gas가 소비되고 나머지 에러 발생 gas는 환불이 되었기 때문이다.
👉 결과
코드를 살펴보면 false
명시 없이 우리가 작성한 error message와 함께 에러를 발생시킨 것으로 보아서 조건 없이 에러를 발생시킨다는 것을 알 수 있다. 그리고 require
과 마찬가지로 gas가 환불 된 것을 알 수 있다.
👉 결과
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
함수는 revert
로 onlyAdults2
함수는 require
로 구현하였다.
여기서 중요한 점은 revert
의 경우, if문이 참이면 에러를, require
의 경우, 조건이 거짓이면 에러를 발생시킨다는 점이다.
👉 결과
둘 다 15를 인자값으로 전달하니 모두 에러를 발생시킨 것을 알 수 있다.
출처 및 참고 자료