ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Enum & Interface & Library & Import
    Block-Chain/Solidity 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);
      }
    }

     

     

     

     

     

    'Block-Chain > Solidity' 카테고리의 다른 글

    Send Ethereum  (0) 2023.04.04
    Modifier & SPDX  (0) 2023.03.22
    에러 핸들러  (0) 2023.03.07
    조건문 & 반복문  (0) 2023.02.15
    Mapping & Array & struct(구조체)  (0) 2023.01.16

    댓글

Designed by Tistory.