상세 컨텐츠

본문 제목

솔리디티 강좌 26강 - 에러 핸들러2 assert, revert, require 0.8 버전

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 25. 12:24

본문


유튜브를 통해, 쉽고 간편하게 이해 해보아요!

https://youtu.be/BPfG3R_D9go

구독/좋아요 해주셔서 감사합니다 :) !!


 

 

안녕하세요 

 

오늘은 0.8 버전에 대해서 알아 보려고 합니다.

 

사실 0.8 버전에서 달라진점은 assert 입니다. 

 

이전 강의에서 0.4.22 ~ 0.7.x 버전 assert 는 gas를 환불 하지 않아서, 많다고 배웠습니다. 

 

그러나, 0.8 에서 부터는 달라진 점을 알 수가 있어요.

 

먼저, 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract lec26{

    function assertNow() public pure{
        assert(false);
    }
 }

지난번 강의와 동일한 assertNow()를 0.8.x 버전으로 컴파일,배포후 실행 하겠습니다.

 

가스가 확 줄어 들건 알 수 가 있습니다. 

그리고 vm error : revert 로 바뀌 어있네요 . 

 

지난번 0.7.x 버전에서 assertNow()를 실행화면입니다.

확실히 가스가 3000000 -> 21239  로 줄어들고

VM error 도 invalid opcode -> revert 로 변했음을 알 수 있어요. 

 

저도 이렇게 변한줄 몰라서, solidty documentation을 참고 하였습니다.

 

solidity documentation 0.8.7 에 의하면,

assert는 오직 내부적 에러 테스트 용도, 불변성 체크 용도로 사용 하라고 나와 있습니다.

그리고, assert가 에러를 발생시키면, Panic(uint256) 이라는 에러타입의 에러를 발생시킵니다.

이 Panic에 대해서는 다다음강의에서 try/catch문에서 설명하겠습니다.

또 assert는 왠만해서 일어 나지 않는다고 합니다, 만약 일어난다면 스마트컨트랙 내에 버그가 있으니, 수정하라고 합니다. 

 

그렇다면 패닉을 발생시키는 내부 에러는 무엇일까요?

솔리디티에서는 10가지 정도 이야기 하고 있습니다.

  1. 0x00: Used for generic compiler inserted panics.
  2. 0x01: If you call assert with an argument that evaluates to false.
  3. 0x11: If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block.
  4. 0x12; If you divide or modulo by zero (e.g. 5 / 0 or 23 % 0).
  5. 0x21: If you convert a value that is too big or negative into an enum type.
  6. 0x22: If you access a storage byte array that is incorrectly encoded.
  7. 0x31: If you call .pop() on an empty array.
  8. 0x32: If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0).
  9. 0x41: If you allocate too much memory or create an array that is too large.
  10. 0x51: If you call a zero-initialized variable of internal function type.

간단히 예를들어 4 번에 0으로 나눌시 division error를 언급하며, 7번에 배열의 길이가 0인데 pop을 하여 배열안의 값을 뽑을때도 panic이 발생한다고합니다.

 

추가적으로, require 과 revert 는 Error(string) 라는 타입의 에러를 발생시킨다고 합니다.

Error(string) 역시 다다음가의 try/catch에서 보도록 해요.

 

 

더 자세한 설명은 영상을 꼭 참고하여 주세요. 

 

관련글 더보기