예를들어, 저희는 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";
}