Solidity function modifier

nujabes403
4 min readMar 30, 2018

--

부제: ‘view’ & ‘pure’

솔리디티에는 function modifier라는 개념이 있다.

말 그대로 함수에 붙어서 함수에 어떤 제약을 걸어주기도 하고 부가적인 기능을 만들어준다.(함수를 꾸며준다.)

정의하는 방법은 함수를 정의하는 것과 비슷하다.

modifier onlyOwner() {
require(msg.sender == owner);
_;
}

function 이라는 keyword 대신 modifier가 들어가고 언더스코어 _ 가 들어간다. 앞서 말했듯, modifier는 함수를 꾸며주는데 꾸며준 다음에 본래 함수를 어디서 실행할지 결정해야 한다. 이 때 이 ‘어디서 실행할 지' 결정해주는 것이 저 언더스코어 _ 이다. (placeholder라고도 함)

위의 정의된 onlyOwner라는 modifier를 보면,

require(msg.sender == owner); 를 통해, 현재 컨트랙트의 함수를 실행한 어드레스의 주소(msg.sender)가 이 컨트랙트에 owner라고 정의된 주소와 같느냐를 물어본다. 그 후에 언더스코어 _; 가 등장한다. 이 때 바로 이 언더스코어 부분에서 onlyOwner가 꾸며준 함수가 실행되는 구조로 동작한다.

modifier는 위에서 정의한 것과 같이 개발자가 직접 만들어 줄 수도 있는데, 기본적으로 built-in 된 modifier 역시 존재한다.

대표적으로 많이 쓰는 function modifer는 viewpure 이다.

view 는 쉽게 말해서 “이 함수는 읽기전용이다." 라는 의미와 같다. 이 함수를 실행하는데에 있어서 어떤 데이터를 쓰거나, 덮어 쓰는 것 없이, 단지 읽기만 하는 함수이다.

function getKittyName() view {
return addressToKitty[msg.sender];
}

(위의 함수는 addressToKitty mapping에서 msg.sender를 key로 하는 value를 단순히 return 해주는 함수이다. 즉, 단지 addressToKitty[msg.sender]라는 값을 ‘읽기'만 하고 있다.)

pure는 순수함수를 의미하는데, 순수함수란 side effect(외부 값을 가져와서 그에 대해서 변경시키는 행위)가 전혀 없이, 오로지 그 함수의 parameter만을 이용해서 값을 return하는 함수이다.

function doCrazyMath(int num1, int num2, int num3) pure {
return (num1 + num2 * num3 % num1) * (num2 * num3) + num3;
}

(위의 함수는 별 이상한 연산을 한 값을 return 하지만, 결국 함수의 parameter num1, num2, num3만을 이용해서 값을 return 하고, 함수 외부에 있는 값은 전혀 가져와서 사용하지 않았다.)

function modifier는 함수를 간결하게 정의하는데에 굉장히 유용하다.

실제 크립토키티의 컨트랙트 소스코드를 보면 훨씬 더 이해하기가 쉽다.

modifier onlyCEO

크립토키티에는 onlyCEO 라는 이름의 modifier가 있다. 이름에서 바로 짐작할 수 있듯이, “오직 크립토키티의 CEO만 이 함수를 실행할 있다”는 제약조건을 걸어준다.

onlyCEO 실제 사용례

위에서 정의된 onlyCEO가, 각각 setCEO, setCFO, setCOO 함수의 modifier로 붙어있다. 이는 즉, CEO를 정하고 CFO를 정하고 COO를 정하는 함수는 오직 CEO만 할 수 있다는 뜻이다.

이런 modifier가 없었다면 위 모든 함수에서

require(msg.sender === ceoAddress);

구문을 모두 넣어줘야한다.

하지만, 솔리디티는 function modifier라는 편리한 도구를 이용해서 코드를 가독성 높고 간결하게 작성할 수 있게 해준다. :)

--

--