관리 메뉴

즐겁게, 코드

솔리디티 - 07. 컨트랙트의 소유권 본문

💬 언어/Solidity

솔리디티 - 07. 컨트랙트의 소유권

Chamming2 2021. 4. 19. 15:46

1. 컨트랙트의 소유권

pragma solidity "^0.4.19";

contract myContract {
  function sendEther(address _address, uint _amount) external {
    send(_address, _amount);
  }
}

이더(돈)를 보내는 sendEther 라는 함수가 컨트랙트에 존재하는 상태입니다.

 

다만 sendEther는 external 로 선언되어 누구나 호출할 수 있는 상태인데요, 컨트랙트의 소유자만 특정 함수에 접근할 수 있도록 하기 위해 Ownable 이라는 라이브러리를 활용합니다.

[Ownable.sol 라이브러리 코드 전문]

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;

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

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

Ownable 라이브러리를 간단하게 설명해보겠습니다.

  1. Ownable 함수는 생성자로써 컨트랙트가 생성될 때 owner 변수를 현재 호출자의 주소로 초기화합니다.
  2. onlyOwner 함수는 함수 제어자로써, 제어자가 작용된 함수가 실행되기 전에 제어자를 호출합니다.
function Ownable() public {
  owner = msg.sender;
}

modifier onlyOwner() {
  require(msg.sender == owner);
  _;
}

이제 본격적으로 Ownable을 사용해 보겠습니다.

먼저 Ownable.sol을 불러온 뒤, 컨트랙트가 Ownable을 상속받도록 합니다.

pragma solidity "^0.4.19";
import "./ownable.sol"

contract myContract is Ownable {
  function sendEther(address _address, uint _amount) external {
    send(_address, _amount);
  }
}

이제 onlyOwner 라는 함수 제어자를 활용합니다.

function sendEther(address _address, uint _amount) external onlyOwner {
  // onlyOwner 제어자의 본문이 함수 본문에 포함된 상태라고 보시면 됩니다.
  // require(msg.sender == owner);
  send(_address, _amount);
}

이제 이더를 전송하는 sendEther 함수는 호출자가 소유권자와 동일한지 매번 자동으로 검사하게 되어, 컨트랙트의 소유권자만이 안전하게 이더를 전송할 수 있게 됩니다.

반응형
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆