[Solidity] 함수 제어자 (function modifier)

yooni·2022년 3월 22일
0
post-thumbnail

함수 제어자 (function modifier)

function test() external view customModifier payable {
  /* ... */
}

위와 같이 함수를 정의할 때, external, view, customModifier, payable은 모두 함수 제어자이다.



1. 접근 제어자 (visibility modifier)

해당 함수가 언제, 어디서 호출될 수 있는지 제어한다.

  • private
    컨트랙트 내부의 다른 함수들에서만 호출될 수 있다.

  • internal
    private과 비슷하지만 해당 컨트랙트를 상속하는 컨트랙트에서도 호출될 수 있다.

  • external
    오직 컨트랙트 외부에서만 호출될 수 있다.

  • public
    함수 내외부 모두에서, 어디서든 호출될 수 있다.



2. 상태 제어자 (state modifier)

블록체인과 상호작용 하는 방법에 대한 것이다.

  • view, constant
    해당 함수를 실행해도 어떤 데이터도 저장/변경되지 않는다.

  • pure
    해당 함수가 어떤 데이터도 블록체인에 저장하지 않을 뿐만 아니라, 블록체인으로부터 어떤 데이터도 읽지 않는다.

view, pure 모두 컨트랙트 외부에서 호출되었을 때 가스를 전혀 소모하지 않는다. 하지만 동일 컨트랙트 내의 다른 함수에 의해 내부적으로 호출되었을 경우에는 가스를 소모한다.



3. 사용자 정의 제어자

직접 원하는 논리대로 제어자를 정의하여 함수에 적용할 수도 있다.

// 메시지를 보낸 사람이 owner와 같은지 확인하는 제어자 정의

modifier onlyOwner () {
	require(msg.sender == owner);
  	_; // _;와 항상 함께 쓰인다.
}



4. payable 제어자 💰✨

함수 호출을 통해 이더리움을 받을 수 있는 특별한 함수 유형을 정의한다. 함수가 실행되는 동시에 컨트랙트 계정(CA)에 돈을 지불할 수 있다. payable을 작성하지 않은 함수에서는 이더를 보낼 수 없다.

contract OnlineStore {
  function buySomething() external payable {
    require(msg.value == 0.001 ether);
    transferThing(msg.sender);
  }
}

❗️ address 변수 타입에서의 payable

payable은 가상화폐로 접근하기 위한 키워드이다. payable 키워드는 함수 제어자로 쓰일 수 있을 뿐만 아니라, address 타입의 변수와도 함께 쓰일 수 있다. address payable은 지불 가능한 주소 타입을 의미한다. address payable 타입 변수는 이더를 전송할 수 있는 함수인 send()transfer()를 내장한다.

// owner라는 payable한 address 선언
address payable owner;

// to라는 payable한 address를 인자로 갖는 function 선언
function func(address payable to) public { /* ... */ } 



📌 Reference
https://cryptozombies.io/ko/course

profile
멋쟁이 코린이

0개의 댓글

관련 채용 정보