함수 제어자(function modifier)

vencott·2021년 5월 19일
0

1. 접근 제어자(visibility modifier) : 함수가 언제, 어디서 호출될 수 있는지를 제어

  1. private : 컨트랙트 내부의 다른 함수들에서만 호출 가능
  2. internal : private과 비슷하지만, 해당 컨트랙트를 상속하는 컨트랙트에서도 호출 가능
  3. external : 오직 외부 컨트랙트에서만 호출 가
  4. public : 컨트랙트 내외부 모두, 어디에서든 호출 가능

2. 상태 제어자(state modifier) : 함수와 블록체인의 상호작용 제어

  1. view : 해당 함수를 실행해도 어떤 데이터도 저장/변경되지 않음
  2. pure : 해당 함수가 어떤 데이터도 블록체인에 저장하지 않을 뿐만 아니라, 블록체인으로부터 어떤 데이터도 읽지 않음

위 둘은 컨트랙트 외부에서 불렸을 때 가스를 전혀 소모하지 않음(하지만 다른 함수에 의해 내부적으로 호출됐을 경우에는 가스를 소모)

3. 사용자 정의 제어자(user defined modifier) : 사용자가 직접 어떤 함수의 제어에 영향을 주는 제어자 정의

modifier onlyAgeAbove(uint _age) {
    require(user.age >= _age);
    _;
}

function smoke() external view onlyAdult(20) { // 위 제어자들을 모두 혼용해서 사용 가능
    doSomke();
}

4. payable 제어자 : 이더를 받을 수 있는 특별한 함수 유형

이더리움에서는, 돈(이더), 데이터(transaction payload), 그리고 컨트랙트 코드 자체 모두 이더리움 위에 존재하기 때문에, 함수를 실행하는 동시에 컨트랙트에 돈을 지불하는 것이 가능하다

contract OnlineStore {
  function buySomething() external payable {
    require(msg.value == 0.001 ether); // msg.value로 컨트랙트에 0.001 ether가 왔는지 확인
    transferThing(msg.sender); 
  }
}

//javascript
OnlineStore.buySomething({from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001)})

만약 함수가 payable로 표시되지 않았는데 이더를 보내려 한다면, 함수에서 트랜잭션을 거부

5. require()과 assert()

두 함수 모두 조건을 만족하지 않으면 에러를 발생

  • require : 함수 실행이 실패하면 남은 가스를 사용자에게 되돌려 준다
  • assert : 함수 실행이 실패해도 남은 가스를 사용자에게 되돌려 주지 않는다

즉, 대부분의 코드에 require를 쓰지만 assert는 일반적으로 코드가 심각하게 잘못 실행될 때 사용(uint 오버플로우 같은)

profile
Backend Developer

0개의 댓글