Solidity에서 modifier란 무엇인가?
작성자 Frederik B
Solidity는 스마트 컨트랙트를 구현하기 위한 객체 지향의 고수준 언어입니다. Solidity를 배우는 과정에서 다른 함수의 동작을 수정하는 특별한 유형의 함수인 modifier를 접하게 될 것입니다.
이 글에서는 Solidity modifier가 무엇을 하는지 설명하고, modifier의 유형을 소개하며, 사용 방법을 보여드립니다. 이 글을 다 읽고 나면 Solidity modifier를 인식하고 사용 방법을 이해할 수 있게 될 것입니다.
Solidity modifier는 무엇을 하는가?
modifier는 다른 함수의 동작을 수정하는 데 사용되는 특별한 Solidity 함수 유형입니다. 예를 들어, 개발자는 함수 실행을 허용하기 전에 특정 조건이 충족되는지 확인하기 위해 modifier를 사용할 수 있습니다.
modifier는 인자를 받을 수 있고 반환 타입을 가질 수 있다는 점에서 함수와 유사합니다. modifier는 또한 서로 연결될 수 있는데, 이는 하나의 함수에 여러 개의 modifier를 사용할 수 있다는 의미입니다.
하지만 modifier는 컨트랙트 로직만 수정할 수 있으며, struct를 포함한 컨트랙트의 storage는 수정할 수 없습니다. modifier는 개발자가 작성해야 하는 보일러플레이트 코드의 양을 줄여주고, Solidity 코드의 가독성을 높여줄 수 있습니다.
Solidity 함수에 여러 개의 modifier를 사용할 수 있는가?
예, 개발자는 하나의 Solidity 함수에 여러 개의 modifier를 사용할 수 있습니다. 여러 개의 modifier는 쉼표로 구분됩니다. 여러 modifier를 사용할 때 한 가지 중요하게 유의할 점은 modifier의 순서가 중요하다는 것입니다. 목록에서 첫 번째 modifier가 먼저 실행되고, 두 번째 modifier가 그다음에 적용되는 식입니다.
예를 들어, 사용자가 인증되었는지 확인하는 modifier와 사용자가 특정 리소스를 볼 권한이 있는지 확인하는 또 다른 modifier가 있다면, 이 modifier들이 적용되는 순서에 따라 사용자가 해당 리소스를 볼 수 있는지 여부가 결정됩니다.
Solidity modifier의 유형에는 어떤 것들이 있는가?
Solidity modifier에는 gate check, prerequisite, filter, 재진입 공격 방지의 네 가지 큰 범주가 있습니다.
1. Gate check
"gate check"는 함수 실행을 허용하기 전에 특정 조건이 참인지 확인하는 modifier입니다.
예를 들어, 사용자가 자신의 계좌에서 돈을 인출할 수 있게 해주는 함수가 있다고 할 때, 함수가 실행되기 전에 개발자는 사용자의 계좌에 인출할 만큼 충분한 돈이 있는지 확인하고 싶을 수 있습니다. 이 확인 작업이 gate check modifier로 간주됩니다.
gate check의 또 다른 예로는 사용자가 특정 리소스를 볼 수 있도록 허용하기 전에 사용자가 인증되었는지 확인하는 함수가 있습니다.
2. Prerequisite
"prerequisite"는 특정 조건이 참인지 확인하는 대신, 함수가 실행될 환경을 설정하는 modifier입니다.
예를 들어, Solidity 개발자는 함수를 실행하기 위해 일정량의 Ether가 함께 전송되어야 하는 함수를 사용할 수 있습니다. 이 경우, prerequisite는 Ether 잔액을 설정하는 함수가 됩니다.
3. Filter
"filter"는 특정 조건이 참인지 확인하고, 참이면 함수 실행을 허용하는 modifier입니다. 조건이 참이 아니면 함수는 실행되지 않습니다.
조건이 참이더라도 함수 실행을 자동으로 허용하지 않는 gate check와 달리, filter는 조건이 참이면 함수 실행을 허용합니다.
4. 재진입 공격 방지
재진입 공격은 악의적인 행위자가 재귀 호출을 통해 함수를 여러 번 실행하여 이를 악용하려는 유형의 공격입니다.
예를 들어, 사용자가 자신의 계좌에서 돈을 인출할 수 있게 해주는 함수가 있다고 상상해 보세요. 재진입 공격자는 실제로 계좌에 있는 것보다 더 많은 돈을 인출하기 위해 이 함수를 여러 번 호출하려고 시도할 수 있습니다.
재진입 공격을 방지하려면, 함수가 재귀적으로 호출되고 있는지 확인하는 modifier를 사용할 수 있습니다. 만약 그렇다면, 함수는 실행되지 않습니다.
require와 Solidity modifier의 관계는 무엇인가?
require는 modifier와 종종 상호 교환적으로 사용되는데, 둘 다 함수 실행을 허용하기 전에 특정 조건이 참인지 확인할 수 있게 해주기 때문입니다. 지정된 조건이 참이 아니면, 컴파일러가 오류를 발생시킵니다.
예를 들어, 다음 문장은 오직 owner만 함수와 상호작용할 수 있도록 require 키워드를 사용합니다:
require와 Solidity modifier 사이에는 몇 가지 중요한 차이점이 있습니다:
- modifier는 함수가 실행될 환경을 설정하는 데 사용될 수 있습니다 (prerequisite의 경우처럼)
- _require_는 특정 조건이 참인지 확인하는 데만 사용될 수 있습니다
- modifier는 오버라이드될 수 있습니다
- _require_는 오버라이드될 수 없습니다
Solidity는 Vyper와 비교하여 modifier를 어떻게 처리하는가?
Vyper는 Ethereum 스마트 컨트랙트 개발을 위한 파이썬 스타일 언어로, 보안을 강화하기 위해 modifier를 사용하지 않는 것을 포함해 몇 가지 트레이드오프를 취합니다. 대신, 개발자는 함수 내에서 인라인 체크와 assert를 사용하도록 되어 있으며, 스마트 컨트랙트를 수정할 때도 함수의 일부로 명시적으로 변경을 가하도록 되어 있습니다.
modifier를 사용할 수 없게 만든 Vyper의 선택은 스마트 컨트랙트의 감사 용이성을 높이는데, 이는 읽는 사람이 함수가 무엇을 할지 알기 위해 modifier를 함수 주위에 두고 머릿속으로 그려볼 필요가 없기 때문입니다.
modifier 오버라이딩이란 무엇인가?
"virtual" 키워드는 파생 컨트랙트에서 modifier가 오버라이드될 수 있음을 나타내는 데 사용될 수 있습니다. 예를 들어, "myModifier"라는 modifier를 가진 "Base Contract"라는 컨트랙트가 있다고 상상해 보세요. 그리고 "Base Contract"를 상속하는 "Derived Contract"라는 컨트랙트도 있습니다.
"Base Contract"가 "virtual"로 표시되어 있다면, 파생 컨트랙트에서 오버라이드될 수 있습니다. 이는 컨트랙트가 커스터마이징을 허용하는 라이브러리의 맥락에서 자주 사용됩니다.
modifier는 상속과 어떻게 작동하는가?
상속은 컨트랙트의 속성과 프로퍼티를 확장할 수 있게 해주며, modifier의 맥락에서 상속은 새로운 modifier를 추가하거나 기존 modifier를 오버라이드할 수 있게 해줍니다. 이는 앞 섹션에서 다룬 virtual 키워드로 수행할 수 있습니다.
아래의 간단한 구현은 상속과 modifier가 함께 작동하는 방식을 보여줍니다:
이 예시에서 contract B는 contract A를 상속합니다. 두 컨트랙트 모두 "X"라는 modifier를 가지고 있습니다. 하지만 contract B에서는 이 modifier가 "override"로 표시되어 있으며, 이는 contract A의 modifier를 오버라이드한다는 것을 나타냅니다.
Solidity에서 modifier를 사용하는 방법
modifier를 사용하려면 먼저 컨트랙트에서 modifier 함수를 정의해야 합니다. modifier는 "_;"라는 특별한 기호를 사용하는데, modifier의 조건이 충족될 때만 함수 본문이 삽입됩니다.
아래 컨트랙트는 modifier를 사용하는 방법을 보여줍니다:
위 예시에서 이 컨트랙트는 "onlyOwner"와 "costs"라는 두 개의 modifier를 가지고 있습니다.
첫 번째 modifier는 _msg.sender_가 컨트랙트의 owner인지 확인하고, 두 번째 modifier는 _msg.value_가 특정 가격 이상인지 확인합니다.
이 두 modifier 모두 컨트랙트의 어떤 함수에도 사용할 수 있습니다.
Solidity modifier에 대해 계속 배우기
modifier는 다른 함수의 동작을 수정하는 데 사용되는 함수입니다. modifier를 사용하면 작성해야 하는 보일러플레이트 코드의 양을 줄일 수 있고, Solidity 코드의 가독성을 높일 수 있습니다.
Solidity modifier에 대해 계속 배우고 Solidity 개발자가 되는 방법을 알아보려면, Alchemy University의 7주 과정 Ethereum Developer Bootcamp에 자리를 확보하세요. 원래 ChainShot 팀이 만든 이 무료 Solidity 크래시 코스는 Solidity를 배우는 가장 좋은 방법입니다. 개발이 전반적으로 처음인 개발자라면, Alchemy University의 3주 과정 JavaScript 크래시 코스가 Ethereum 부트캠프를 시작하기 전 훌륭한 사전 준비 과정이 될 것입니다.
관련 개요

블록체인 매직을 만드세요
Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.


