상세 컨텐츠

본문 제목

솔리디티 강좌 30강 - modifier 모디파이어

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 29. 10:12

본문


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

https://youtu.be/t57iKLHAw3M

 

- YouTube

 

www.youtube.com

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


 

 

 

안녕하세요 

 

오늘은 modifier(모디파이어)에 대해서 알아보려고 합니다.

 

이 모디파이어는 지난번 강의때 배운 에러핸들러 require와 같이 쓰인답니다.

 

예를들어, 저희는 100개의 함수가 있는데, 그 100개의 함수들은 나이가 성인인지 아닌지 체크를 해야하는 require가 필요 하다고 가정 해볼게요.

 

각 함수마다 당연히 require(_age>19, "You are under 18 years old")를 하나하나 일일히 써져야 겠죠.

즉 reqire 100 개를 써져야합니다. 

 

그러다가, 나이 제한이 바뀌었네요.

19세 미만이 아니라 20세 미만으로요. 

 

그럴경우, 저희는 각 함수의 require 마다  require(_age>20, "You are under 18 years old") 라고 고쳐져야 겠네요.

무려 100 번이나 고쳐져야 하네요.

 

이러한 불편함을 극복하기 위해서는 modifire를 써져야합니다. 

 

자 그러면 modifer안에다가,  require(_age>19, "You are under 18 years old") 하나만 정의해주면,

각 함수에 modifire 명만 넣어 주면 된답니다. 

그러고, 19세 미만에서 20세 미만으로 변경한다면, modifire 안에 정의된 require 만 고쳐주면 끝입니다. 

 

자 본격적으로 modifire에 대해서 보겠습니다. 

 

// 파라미터 값이 없는 경우   
   modifier 모디파이어명{
         revert 나 require
         _;
    }
 
 // 파라미터 값이 없는 경우
    modifier 모디파이어명(파라미터){
          revert 나 require
         _;
    }

자 위와 같이 두가지의 경우가 나와요.

모디파이어가 파라미터값이 없을때와 있을때입니다.

 

없을때는, 그냥 () 도 안써져도 된답니다.

 

자 예시로 알아볼게요.

 

파라미터가 없는 modifier 경우

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract lec27{
    
    modifier onlyAdults{
         revert("You are not allowed to pay for the cigarette");
         _;
    }
  
    function BuyCigarette() public onlyAdults returns(string memory){
        return "Your payment is scceeded";
    }   
    
}

위에 onlyAdults 라는 모디파이어를 생성하였습니다.

그 안에는, revert 에러 핸들러가 있습니다.

이 모디파이어가 실행이되면 바로 에러가 나는걸 짐작할 수 있겠죠.

 

BuyCigarette() 함수 접근제한자 public 바로 옆에 modifire 명 onlyAdults를 명시를 해줘야 modifire가 잘 작동합니다.

그런데, modifire 안을 보면 _; 라는걸 볼 수 가 있어요.

 

_;의미는, 이 부분에 함수를 넣는다 라는 뜻입니다. 

 

다시 말하자면   

    function BuyCigarette() public onlyAdults returns(string memory){

        revert("You are not allowed to pay for the cigarette");
        return "Your payment is scceeded"; // 모디 파이어의 _; 이 부분.
    }

 

이런식으로 되겠네요.

 

자 그러면 BuyCigarette() 함수를 실행과 동시에 revert로 인해 에러가 생길것입니다. 

 

파라미터가 있는 modifier 경우

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract lec27{

    modifier onlyAdults2(uint256 _age){
         require(_age>18,"You are not allowed to pay for the cigarette");
         _;
    }

    function BuyCigarette2(uint256 _age) public onlyAdults2(_age) returns(string memory){
        return "Your payment is scceeded";
    }
  
}

파라미터가 없는 예제와 매우 유사한 예제입니다.

여기서는 modifier인 onlyAdults2는  uint256 타입인 _age 파라미터를 받습니다.

 

이 _age를 받고 18세 미만이라면 require를 통해서 에러를 발생시킵니다.

 

Buycigarette2(uint256 _age) 는 당연히 _age 파라메터가 필요할 것 입니다. 

왜냐하면, modifire는 _age 파라메터를 필요로 하기 때문입니다. 

즉, 저희가  Buycigarette2 을 실행하기위해 _age를 넣는다면, 그 _age는 onlyAdults2(_age) 라고 명시하여 

넣어 주어야합니다. 

다시말하자면, 저희는 현재,  Buycigarette2 _age 라는 파라메터 값을 onlyAdults2 라는 모디파이어에  _age 넣어준것입니다.  

 

그러면, Buycigarette2(uint256 _age) 는 실질적으로 이렇게 작동하게 되겠네요.

    function BuyCigarette2(uint256 _age) public returns(string memory){
        require(_age>18,"You are not allowed to pay for the cigarette");
        return "Your payment is scceeded";
    }

 

더 자세한 설명은 영상 참고 바랍니다. 

관련글 더보기