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

레슨3 챕터2, 3 - 소유 가능한 컨트랙트, 함수제어자(modifier)

by 멸치김밥 2022. 2. 17.

external 함수는 누구든지 사용할 수 있는 함수다.

이것을 소유자만 사용할 수 있도록 만들 수 있다.

 

이를 위해 만들어져있는 OpenZeppelin라는 솔리디티 라이브러리에 있는 Ownable 컨트랙트를 가져와서 살펴보자

  • Ownable.sol
// Ownerable 계약에는 소유자 주소가 있으며 기본 권한 제어 기능을 제공하므로
// "사용자 권한"의 구현이 간소화됩니다.
contract Ownable {
  address public owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  // Ownerable 생성자(constructor)는 계약의 원래 '소유자'를 발신자 계정으로 설정합니다.
  function Ownable() public {
    owner = msg.sender;
  }

  // 소유자가 아닌 다른 계정에서 호출하면 안됨.
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  // 현재 소유자가 권한을 newOwner에게 이전한다
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

 

  • 함수제어자(modifier)

위 Ownable.sol에 보면 함수형태로 modifier라고 정의된 것이 있따.

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

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

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


챕터2 답 수정전

// 1. 

// 2. 
contract ZombieFactory {

수정 후

// 1. import
import "./ownable.sol";

// 2. 상속
contract ZombieFactory is Ownable {

챕터3 답 전

  function setKittyContractAddress(address _address) external {
    kittyContract = KittyInterface(_address);
  }

  // Ownable 컨트랙트의 onlyOwner 함수제어자를 추가했다
  function setKittyContractAddress(address _address) external onlyOwner {
    kittyContract = KittyInterface(_address);
  }

댓글