Block-Chain/Solidity

Enum & Interface & Library & Import

WebDevLee 2023. 4. 24. 17:51

Solidity의 Enum, 인터페이스, 라이브러리, 임포트에 대해 정리하였습니다.

 

 


< Enum >

enum은 사람이 읽을 수 있게, 개발자에 의해 정의된 상수세트 타입입니다.

특정한 상태/조건을 나타내기 위해 사용합니다.

 

  • 한 개의 enum당 256개까지 저장할 수 있고, 0~255까지 부여(uint8 = 0 ~ 255)
    -> 상수세트이기에 enum은 uint로 변환하여 사용 가능
enum{

}

 

 

Ex)

enum CarStatus {
  TurnOff,
  TurnOn,
  Driving,
  Stop
}

CarStatus public carStatus;

constructor() {
  carStatus = CarStatus.TurnOff;
}

event carCurrentStatus(CarStatus _carStatus, uint256 _carStatusInInt);

function turnOnCar() public {
  require(carStatus == CarStatus(0), "To turn on, your car must be turned off");
  carStatus = CarStatus(1);
  emit carCurrentStatus(carStatus,uint256(carStatus));
}

function DrivingCar() public {
  require(carStatus == CarStatus.TurnOn, "To drive a car, your car must be turned on");
  carStatus = CarStatus.Driving;
  emit carCurrentStatus(carStatus,uint256(carStatus));
}

function StopCar() public {
  require(carStatus == CarStatus.Driving, "To drive a car, your car must be turned on");
  carStatus = CarStatus.Stop;
  emit carCurrentStatus(carStatus,uint256(carStatus));
}

function turnOffCar() public {
  require(carStatus == CarStatus.TurnOn 
          || carStatus == CarStatus.Stop , "To turn off, your car must be turned on or driving");
  carStatus = CarStatus.TurnOff;
  emit carCurrentStatus(carStatus,uint256(carStatus));
}

function CheckStatus() public view returns(CarStatus) {
  return carStatus;
}

 

 


< Interface >

Interface는 스마트컨트랙트 내에서 정의되어야 할 필요한 것들을 말합니다.

 

interface특징

  • 함수는 external로 표시
  • enum, struct 가능
  • 변수, 생성자(constructor) 불가능

 

Ex)

interface ItemInfo {
  struct item {
    string name;
    uint256 price;
  }
  function addItemInfo(string memory _name, uint256 _price) external;
  function getItemInfo(uint256 _index) external view returns(item memory);
}

contract lecture39 is ItemInfo {
  item[] public itemList;
  function addItemInfo(string memory _name, uint256 _price) override public {
    itemList.push(item(_name, _price));
  };
  function getItemInfo(uint256 _index) override public view returns(item memory) {
    return itemList[_index];
  }
}

 

 


< library >

라이브러리는 다른 종류의 스마트 컨트랙트입니다.

 

< 라이브러리 사용의 이점과 제한사항 >
이점
1. 재사용 : 블록체인에 라이브러리가 배포되면, 다른 스마트컨트랙트들에 적용가능.

2. 가스 소비 줄임 : 중복되는 코드는 라이브러리를 사용하면 되기 때문에, 스마트컨트랙트의 사이즈/길이가 작아져 가스 소비를 줄일 수 있음.

제한사항
1. fallback 함수 불가 -> 라이브러리는 이더를 갖고 있을 수 없음.

2. 상속 불가
3. payable 함수 정의 불가

 

Ex)

library SafeMath {
  function add(uint8 a, uint8 b) internal pure returns (uint8) {
    require(a + b >= a, "SafeMath: addition overflow");
    return a + b;
  }
}

contract lecture40 {
  using SafeMath for uint8;
  uint8 public a;
  
  function becomeOverflow(uint8 _num1, uint8 _num2) public {
    a = SafeMath.add(_num1, _num2);
  }
}

 

 


< import >

다른 장소에 있는 컨트랙트를 불러와 사용하기 위해 import를 사용합니다.

 

Ex)

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol";

contract lec41 {
  using SafeMath for uint256;
  uint256 public a;
  uint256 public maximum = 2**256 - 1;
  function becomeOverflow(uint256 _num1, uint256 _num2) public {
    a = _num1.add(_num2);
  }
}