블록체인 개발자 면접 과정에서 관련 질문을 받았는데, 답변을 하긴 했는데 정확히 맞는지 모르겠다.
개발 팀장님 : 솔리디티 에러 처리에서, 가스비를 되돌려 주는 에러처리는요?
나 : 음.... revert와 require?
다시 복기해보자.
0.8 이후로 assert도 환불이 되니, 일부러 컴파일 버전을 낮게 해서 실험해보자.
조건문이 false일 경우, 에러를 발생시킨다.
testAssert 함수를 실행했더니, 당연히 assert가 걸릴 것이고,
아래 num, testNum 상태는 바뀌지 않는다.
참고
gas : tx에서 소비된 총 가스 양 (트랜잭션 처리 + 함수 실행 비용)
Transaction Cost : 트랜잭션 전체 비용 (가스 비용 * 가스 가격)
Execution Cost : 컨트랙트 함수 실행 비용
revert는 입력 자체로 오류가 발생하기 때문에 일반적으로 if와 함께 쓴다.
revert가 발생하면 모든 가스 비용을 환불 받는다.
assert와 달리 transaction cost, execution cost가 매우 매우 적게 든다.
물론 revert도 가스를 소모하기 때문에, 해당 가스값만 받고 나머지 비용은 돌려주는 것이다.
revert + if = require
라고 생각하면 된다.
0.8.0 이하 버전 (0.8.0 포함)
assert()의 가스비 환불이 안되고 Panic이라는 에러 타입도 존재하지 않습니다.
0.8.x (0.8.0 제외)
assert()에서도 가스비 환불이 됩니다. 그리고 공식문서에서는 오직 내부적 에러 테스트 용도 및 불변성 체크 용도로 사용하라고 적혀있습니다.
또한, assert()로 인해 에러가 발생하면 Panic 에러타입을 발생시킵니다.
이제 assert도 가스비를 비슷하게 소모한다.
그러나 내부 에러 테스트 용도로만 사용하라고 적혀있다.
즉, 상용화를 위해 배포시엔 쓰지 말라는 뜻이다.