Prototype Ghost
귀신일지
Prototype Ghost
전체 방문자
오늘
어제
  • 분류 전체보기 (29)
    • Hacking (1)
      • CTF (0)
      • Wargame (0)
      • Review (1)
    • C (12)
      • Crypto (12)
    • C++ (4)
    • Python (1)
    • Swift (1)
    • Blockchain (9)
      • Solidity (9)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 정보보안
  • 복호화
  • 접근제어
  • solidity
  • Bitcoin
  • 프로그래밍
  • C++
  • 암호화
  • 이더리움
  • 솔리디티
  • 보안
  • c언어
  • openssl
  • 암호화폐
  • 비트코인
  • 블록체인
  • Blockchain
  • C
  • 리눅스
  • ethereum

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Prototype Ghost

귀신일지

Solidity : assert, revert, require 그리고 modifier
카테고리 없음

Solidity : assert, revert, require 그리고 modifier

2023. 6. 12. 23:45

시작하며


  오늘은 assert, revert, require와 midifier에 대해서 설명하겠다. assert와 revert, require는 모두 특정 조건을 만족시키지 않아 트랜잭션을 실패로 만들어야 할 때, 오류를 발생시키는 기능을 한다. modifier는 이들을 보다 체계적으로 이용할 수 있도록 도와주는 키워드이다. 각각의 특징을 확인하고, 코드로 살펴보자.

 

1. assert, revert, require


먼저 서로의 차이에 대해 짚어보자.

1. assert : gas를 모두 소비한 후, 조건이 충족되지 않을 경우(false일 경우) 에러를 발생시킨다.

2. revert : 조건 없이 에러를 발생시키고 gas를 환불시켜준다.

3. require : 조건이 만족하지 않으면(false일 경우) 에러를 발생시키고, gas를 환불시켜준다.

 

각각 어떻게 사용하는지 코드로써 확인해보자.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract errorHandleEx{
    function assertFunc(uint a) public pure{
        assert(a == 9);
    }

    function revertFunc(uint a) public pure{
        if(a != 9){
            revert("a isn't 9");
        }
    }

    function requireFunc(uint a) public pure{
        require(a==9, "a isn't 9");
    }
}

  위는 세개의 키워드를 각각 개별함수로 만들어 테스트하기 위해 작성한 코드이다. 각각의 결과를 확인하면서 비교해보자.

1. assert : assertFunc()를 보면 파라미터 a가 9인지 아닌지에 대한 bool값을 인자로 받아 false이면 에러를 발생시킨다. 즉 파라미터에 bool을 줘야한다. 파라미터가 10이었기 때문에 우측하단은 assertFunc(10)에 대한 결과이며, 결과를 보면 에러가 발생한 것을 알 수 있다.

 

2. revert : 무조건 에러를 발생시킨다. 이때 파라미터의 문자열이 결과에 출력된다. revertFunc()를 보면 if문에서 9가 아닐 경우 revert로 "a isn't 9"를 에러로 출력하는 것을 알 수 있다. 우측하단은 revertFunc(10)의 결과이다.

 

3. require : requireFunc()를 보면 require의 첫번째 인자는 조건(즉 bool값), 오른쪽 인자에는 문자열이 있는 것을 볼 수 있다. 조건이 false일 경우 에러를 발생시키며 두번째 문자열을 통해 에러문구를 보여준다. 우측하단은 requireFunc(10)의 결과로 "a isn't 9"가 출력된 것을 볼 수 있다.

 

위 예제로 각각의 사용법과 차이점을 알 수 있을 것이다.

 

2. modifier


modifier는 조건을 검사한 후 함수를 실행시킬 수 있도록 하는 등 굉장히 유용한 기능이다. 어떤 식으로 사용하는지 바로 알아보자.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract errorHandleEx{

    modifier check9(uint a){
        require(a==9, "a isn't 9");
        _;
    }
    
    function modifierTestFunc(uint a) check9(a) public pure returns(uint){
        return a;
    }
}

위의 코드를 보면 modifier라는 키워드로 modifier를 정의할 수 있다. check9이라는 이름의 modifier는 uint a를 매개변수로 받고 require를 통해 a가 9인지 검사한다. a가 9가 아니면 에러가 발생하고 a가 9가 아니면 "_;" 문구가 실행된다. 여기서 "_;"는 이 모디파이어를 적용한 함수의 실행을 뜻한다. 즉 a가 9가 맞다면 해당 모디파이어를 적용한 함수를 실행시키라는 이야기가 된다. 

modifierTestFunc()함수를 보면 check9 modifier를 적용한 것을 알 수 있다. 함수의 매개변수 a를 check9 modifier로 넘겨 해당 파라미터가 9인지 검사하고, 9가 맞다면 함수 내부가 실행되는 것이다. 결과를 확인해보자.

먼저 파라미터를 10으로 지정하고 modifierTestFunc()를 호출하면 modifier에 의해 에러가 발생하는 것을 볼 수 있다.

반면 a를 9로 했을 경우 modifier에서 require를 통과한 후 _;가 수행, 즉 함수 내부가 수행되어 a가 리턴되는 것을 볼 수 있다. 우측하단이나 좌측하단을 보면 9가 리턴된 것을 볼 수 있다.

 

마치며


  오늘은 솔리디티에서 에러를 다루는 방법에 대해 알아보았다. assert는 가스를 다 소모하기 때문에 테스트하는 용도로만 사용되어야 한다. 각각의 사용법과 차이점을 잘 익히고, 또 modifier를 통해 코드의 안정성을 높이는 방법에 대해 익히면 좋을 것 같다.

다음 시간에는 이러한 modifier를 통해 컨트랙트를 deploy한 사람만 호출할 수 있는 함수를 만들어보도록 하겠다.

 

참고자료

https://www.yes24.com/Product/Goods/111099912

 

솔리디티 프로그래밍 완벽 가이드 - YES24

개발 경험이 없어도 쉽게 블록체인과 솔리디티를 이해할 수 있습니다!솔리디티는 스마트 컨트랙트를 구현하는 언어이며, 스마트 컨트랙트는 블록체인에서 작동하는 프로그램이다. 『솔리디티

www.yes24.com

https://chancoding.tistory.com/179

 

[Solidity] 기본 문법 (2) - Error Handler - require, revert, assert, try-catch

Errer Handler 종류는 네 가지가 있음 require, revert, assert, try/catch assert : gas를 다 소비한 후, 특정 조건이 부합하지 않으면 (false일 때) 에러를 발생시킨다. revert : 조건 없이 에러를 발생시키고, gas를

chancoding.tistory.com

 

728x90
반응형
    Prototype Ghost
    Prototype Ghost

    티스토리툴바