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);
}
}