유튜브를 통해, 쉽고 간편하게 이해 해보아요!
구독/좋아요 해주셔서 감사합니다 :) !!
안녕하세요
오늘은 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가지 정도 이야기 하고 있습니다.
- 0x00: Used for generic compiler inserted panics.
- 0x01: If you call assert with an argument that evaluates to false.
- 0x11: If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block.
- 0x12; If you divide or modulo by zero (e.g. 5 / 0 or 23 % 0).
- 0x21: If you convert a value that is too big or negative into an enum type.
- 0x22: If you access a storage byte array that is incorrectly encoded.
- 0x31: If you call .pop() on an empty array.
- 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).
- 0x41: If you allocate too much memory or create an array that is too large.
- 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에서 보도록 해요.
더 자세한 설명은 영상을 꼭 참고하여 주세요.