본문 바로가기

:D/block chain

[Solidity] Private / Public / Internal / External

 

 

솔리디티에서 함수는 기본적으로 public으로 선언됨.

 즉, 누구나 (혹은 다른 컨트랙트) 컨트랙트의 함수를 호출하고 코드를 실행할 수 있음.

 이는 컨트랙트를 공격에 취약하게 만들 수 있음.

그래서 기본적으로 함수를 private로 선언하고 공개할 만한 함수만 public으로 선언

 

 

uint[] numbers;

function _addToArray(uint _number) private {
  numbers.push(_number);
}

 

 

private는 컨트랙트 내의 다른 함수들만이 이 함수를 호출하여 numbers 배열로 무언가를 추가할 수 있다는 것을 의미.

(함수 인자명과 마찬가지로 private 함수명도 언더바(_)로 시작하는 것이 관례)

 

 

 


 

 

Internal과 External

 

public과 private 이외에도 솔리디티에는 internal과 external이라는 함수 접근 제어자가 있다.

internal은 함수가 정의된 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능하다 점을 제외하면 private과 동일.

 

external은 함수가 컨트랙트 바깥에서만 호출될 수 있고 컨트랙트 내의 다른 함수에 의해 호출될 수 없다는 점을 제외하면 public과 동일.

interal이나 external 함수를 선언하는 건 private과 public 함수를 선언하는 구문과 동일

 

 

 

contract Sandwich {
  uint private sandwichesEaten = 0;

  function eat() internal {
    sandwichesEaten++;
  }
}

contract BLT is Sandwich {
  uint private baconSandwichesEaten = 0;

  function eatWithBacon() public returns (string) {
    baconSandwichesEaten++;
    // eat 함수가 internal로 선언되었기 때문에 여기서 호출이 가능하다 
    eat();
  }
}