Function Modifier in Solidity

Sigrid Jin
5 min readJan 10, 2022

--

Modifiers — View and Pure

What’s this?

Solidity에는 Function Modifier라는 개념이 있는데, 함수에 대한 보조 역할(auxiliary works)을 해주는 녀석이다. 굳이 말하면 보조 함수라고 할 수 있는데, 원함수에 제약을 걸어주거나 부가적인 기능을 붙여준다. 영어 문법을 보면 동사에 조동사가 붙는 것과 유사한 개념이라고 본인은 이해했다.


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

위의 코드를 보자. modifier라는 키워드가 들어가고, 아래에 require를 통해 괄호 안의 조건을 만족하지 못하면 Exception을 뱉어내도록 제약조건을 걸었다. 만약 컨트랙트 함수를 실행한 현재 어드레스의 주소(msg.sender)가 이 컨트랙트의 owner라고 정의된 함수와 같은지 조건을 확인한다.

만약 같다면, 원함수로 돌아가 계속 함수를 실행할 것이다. 그렇지 않으면, 원함수의 동작은 멈출 것이다. 위 코드에서 언더스코어는 require를 실행한 다음, 원함수로 복귀하라는 뜻이다. 언더 스코어 부분에서 onlyOwner가 수식하는 원함수를 다시 실행시킨다.

function modifier는 함수를 간결하게 정의하고, 필요한 제약조건을 재사용하는데 굉장히 유용한 기능이라고 생각된다.

View and Pure

view는 읽기 전용 함수라는 사실을 명시하는 키워드다. view 키워드가 붙은 함수는, 데이터를 읽기만 하지 쓰거나 덮어쓰지 않는다.


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

상기 함수를 참고하면, addressToKitty라는 mapping(dictionary라고 생각하면 된다.) 에서 msg.sender, 즉 현재 컨트랙트를 실행한 사용자 주소로 하는 key를 value로 읽어 return하는 함수이다. 즉, 읽기라는 하나의 역할만 수행하는 함수이다.

pure는 순수함수를 의미한다. 외부 값을 가져와서 해당 값에 대한 변경을 수행하지 않고, 함수의 파라미터만 활용해서 연산을 진행한 뒤 필요한 값을 리턴하는 함수이다. 입력값만 활용해서 출력값을 반환하는 함수를 의미한다.

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

상기 함수를 참고하면, 함수의 파라미터만을 활용하여 값을 연산한 뒤 출력값을 리턴하고 있다. 이 과정에서 함수 외부의 값은 전혀 활용하지 않았다.

Examples on CryptoKitties

크립토키티의 예시를 통하여 살펴보자.

크립토키티에는 onlyCEO라는 modifier가 있는데, 오직 크립토키티의 CEO 주소와 현재 컨트랙트 실행한 사람의 주소가 일치한 경우에만 함수 실행을 지속하게 만들겠다는 강력한 의지를 보여주고 있다.

크립토키티에는 setCEO, setCFO, setCOO 모두 onlyCEO modifier를 사용하고 있다. 즉, C-Level를 정하기 위해서는 반드시 CEO 계정으로 접속해야 한다는 뜻이다.

public 등 접근제어자 키워드 뒤에 modifier의 이름을 넣어준다. 여러 개의 modifier를 적용하고자 한다면, 그 순서대로 띄어쓰기로 구분해서 그저 나열해주면 된다.

만약 function modifier가 없었다면, 일일이 하기의 구문을 넣어줘야 했을 것이다.

require(msg.sender === ceoAddress);

따라서, function modifier는 컨트랙트 코드의 재사용성을 높여주는 유용한 도구라고 결론지을 수 있다.

--

--

Sigrid Jin

Software Engineer at Sionic AI / Machine Learning Engineer, Kubernetes. twitter.com/@sigridjin_eth