[Solidity] 에러 처리 : assert, revert, require

드림보이즈·2023년 9월 11일
0

Smart Contract

목록 보기
2/11
post-thumbnail

학습 배경

블록체인 개발자 면접 과정에서 관련 질문을 받았는데, 답변을 하긴 했는데 정확히 맞는지 모르겠다.

개발 팀장님 : 솔리디티 에러 처리에서, 가스비를 되돌려 주는 에러처리는요?
나 : 음.... revert와 require?

다시 복기해보자.

솔리디티 에러 처리 함수 3개 (v0.8 이전)

0.8 이후로 assert도 환불이 되니, 일부러 컴파일 버전을 낮게 해서 실험해보자.

1. assert(조건문)

조건문이 false일 경우, 에러를 발생시킨다.

testAssert 함수를 실행했더니, 당연히 assert가 걸릴 것이고,
아래 num, testNum 상태는 바뀌지 않는다.

그런데 아래 로그를 보니, gas와 transaction cost가 발생한다.

참고
gas : tx에서 소비된 총 가스 양 (트랜잭션 처리 + 함수 실행 비용)
Transaction Cost : 트랜잭션 전체 비용 (가스 비용 * 가스 가격)
Execution Cost : 컨트랙트 함수 실행 비용

2. revert("오류 메시지")

revert는 입력 자체로 오류가 발생하기 때문에 일반적으로 if와 함께 쓴다.
revert가 발생하면 모든 가스 비용을 환불 받는다.

assert와 달리 transaction cost, execution cost가 매우 매우 적게 든다.

물론 revert도 가스를 소모하기 때문에, 해당 가스값만 받고 나머지 비용은 돌려주는 것이다.

3. require(조건, "오류메시지")

revert + if = require
라고 생각하면 된다.

++ 0.8.x 이후 업데이트

0.8.0 이하 버전 (0.8.0 포함)
assert()의 가스비 환불이 안되고 Panic이라는 에러 타입도 존재하지 않습니다.
0.8.x (0.8.0 제외)
assert()에서도 가스비 환불이 됩니다. 그리고 공식문서에서는 오직 내부적 에러 테스트 용도 및 불변성 체크 용도로 사용하라고 적혀있습니다.
또한, assert()로 인해 에러가 발생하면 Panic 에러타입을 발생시킵니다.

이제 assert도 가스비를 비슷하게 소모한다.
그러나 내부 에러 테스트 용도로만 사용하라고 적혀있다.
즉, 상용화를 위해 배포시엔 쓰지 말라는 뜻이다.

profile
시리즈 클릭하셔서 카테고리 별로 편하게 보세용

0개의 댓글

관련 채용 정보