본문 바로가기
솔리디티/크립토좀비

레슨3 챕터7, 8, 9 - 함수 보안, 인수를 받는 함수제어자(modifier)

by 멸치김밥 2022. 2. 17.

함수 접근 제어자들에 다시 복습

  • public

다른 컨트랙트에서도 호출할 수 있게 된다

 

  • private

해당 함수가 속해있는 컨트랙트에서만 호출할 수 있고 다른 컨트랙트에서는 사용할 수 없다.

 

  • internal

해당 함수가 속한 컨트랙트와 해당 컨트랙트를 상속받는 컨트랙트에서만 사용할 수 있고

그외의 상속받지 않은 다른 컨트랙트에서는 사용할 수 없다. 

 

  • external

함수가 있는 컨트랙트 내부에서는 사용할 수 없고 다른 컨트랙트에서만 사용할 수 있다.

 


 

함수 제어자도 복습

  • 함수제어자(modifier)

이 함수 제어자를 이용하면 특정 함수가 실행될 때 함수 제어자를 거쳐서 함수된다.

함수제어자의 내부를 보면 _; 라는 문구를 마지막에 넣는데

이건 해당 함수가 실행되기 전에 함수제어자가 먼저 실행되고, _; 를 만나면 해당함수로 다시 되돌아간다는 뜻이라한다.

 

함수제어자도 함수처럼 매개변수(인수)를 가질 수 있다.

modifier 함수제어자라네(uint 휘뚜루, uint 마뚜루, uint 나뚜루) {
	require(휘뚜루+마뚜루 >= 나뚜루);
    _;
}

이런식으로 함수 제어자의 역할을 한층 더 맛깔나게 만들 수 있다.

  modifier aboveLevel(uint _level, uint _zombieId) {
    require(zombies[_zombieId].level >= _level);
    _;
  }

이전 챕터에서 만든 함수 제어자를 이용하여 챕터9의 답인

좀비 레벨 2 이상일 때 이름 변경기능

좀비 레벨 20 이상일 때 DNA 변경기능을 만든다


챕터7 전

  // 1.
  function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) public {
  
  // 2.
  
  // 3.

// 1. 이 컨트랙트 또는 상속된 컨트랙트 안에서만 사용되게 internal 함수로 변경
function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) internal {

// 2. 좀비를 공격 시킬 때 쿨타임이 다 되었는지 확인하기
require(_isReady(myZombie));

// 3. 좀비를 공격하고 나서 쿨타임 주기
_triggerCooldown(myZombie);

챕터 8 답

  // 
  modifier aboveLevel(uint _level, uint _zombieId) {
    require(zombies[_zombieId].level >= _level);
    _;
  }

챕터 9 답

  // 좀비 이름 임의로 바꿔주는 함수 / 좀비레벨이 2 이상인지 함수제어자로 확인함
  function changeName(uint _zombieId, string _newName) external aboveLevel(2, _zombieId) {
    // 사용자와 이름 바꾸려는 좀비의 주인이 같은지 확인
    require(msg.sender == zombieToOwner[_zombieId]);
    // 해당 좀비의 이름을 바꾸려는 이름(_newName)으로 변경
    zombies[_zombieId].name = _newName;
  }

  // 좀비의 DNA를 임의로 바꿔주는 함수 / 좀비레벨이 20이상인지 함수제어자로 확인
  function changeDna(uint _zombieId, uint _newDna) external aboveLevel(20, _zombieId) {
    // 사용자와 이름 바꾸려는 좀비의 주인이 같은지 확인
    require(msg.sender == zombieToOwner[_zombieId]);
    // 해당 좀비의 DNA를 바꾸려는 DNA(_newDna)로 변경
    zombies[_zombieId].dna = _newDna;
  }

댓글