Solidity로 Smart Contract 구축하기2 - Data Type과 단위

2022. 8. 26. 15:32Block Chain

Solidity를 공부하면서 D_One님의 유투브를 참고하면서 공부하였습니다.

D_One님의 인프런 무료 강의도 있으니 참고하시면 좋을 것 같습니다.

 

D_One

솔리디티

 

이번 포스팅에서는 Solidity의 자료형(Data Type)과 단위에 대해 알아보겠습니다.

 

Data Types

Solidity의 자료형은 크게 보면 Value Types, Reference Types, Mapping Types 이렇게 3가지로 나눠 볼 수 있습니다.

1. Value Types

The following types are also called value types because variables of these types will always be passed by value.

 

Solidity 공식 문서에서는 Value types를 위와 같이 소개하고 있습니다. Value Types는 함수의 인자로 넘어갈 때 항상 passed by value로 값을 넘기기 때문에 Value Types입니다.

Value Types에는 Booleans, Integers, Fixed-size byte arrays, Address 등이 있습니다. 이 외에도 Fixed Point Numbers 등 여러 가지가 있지만 여기서는 아래 4가지만 알아보도록 하겠습니다.

  • Booleans
    • bool을 이용해 선언하며 true 혹은 false 가 값으로 들어갈 수 있습니다.
    • 사용 가능한 Operators : !(부정), &&(and 연산자), ||(or 연산자), ==(equality), !=(inequality)가 있습니다.
  • Integers
    • int : 부호가 있는 정수(signed integers) / uint : 부호가 없는 정수(unsigned integers)
    • int8 : -2^7 ~ 2^7 - 1 / uint8 : 0 ~ 2^8 - 1
    • int256 : -2^255 ~ 2^255 - 1 / uint256 : 0 ~ 2^256 - 1
    • 8~256 사이의 8로 나누어 떨어지는 숫자로 자료형 생성 가능(i.e., int32, uint64)
    • 숫자를 생략하고 int/uint를 적으면 int256/uint256을 나타냅니다.
    • 비교 연산자(<, <= , ==, !=, >=, >), 비트 연산자(&, |, ^, ~), 쉬프트 연산자(<<, >>), 사칙연산(+, -, *, /), Modulo(%), Exponentiation(**) 모두 연산 가능합니다. 
  • Fixed-size byte arrays
    • bytes1, bytes2, bytes3, ..., bytes32
    • 비교 연산자(<, <= , ==, !=, >=, >), 비트 연산자(&, |, ^, ~), 쉬프트 연산자(<<, >>), 인덱스 접근(i.e., bytes32 x → x[k]로 k번째 바이트 호출 가능, 0 <= k <32) 가능합니다.
    • Dynamically-sized bytes arrays는 Value Type이 아니므로 밑에서 알아보도록 하겠습니다.
  • Address
    • address : 다른 언어에는 없는 개념으로 지갑 혹은 계약의 주소를 나타냅니다.(20 byte value, size of an Ethereum address)
    • address payable : address와 같지만 transfersend가 추가되었습니다.

2. Reference Types

Values of reference type can be modified through multiple different names.

 

Solidity 공식 문서에서는 Reference Types는 여러 가지 이름으로 바뀔 수 있다고 합니다. 그 이유는 아래에서 설명드리겠습니다.

Reference Types는 Structs, Arrays, Maapings 이렇게 크게 3가지로 구성되어 있습니다. 

  • Structs
    • Solidity에서는 사용자가 새로운 타입을 정의할 수 있는 struct를 제공합니다.
    • 아래 예시 코드는 Solidity의 공식 문서에서 발췌한 것입니다. 아래와 같은 방법으로 새로운 변수 타입인 Funder를 생성할 수 있습니다.
struct Funder {
    address addr;
    uint amount;
}
  •  Arrays
    • T[](i.e., uint[], bytes1[][]
    • compile-time에 고정된 사이즈를 가질 수도 있고, 동적인 사이즈를 가질 수 있습니다.
    • Dynamically-sized byte array인 bytes와 string이 Arrays에 해당하며 Refernce Type입니다.
  • Mappings
    • mapping(KeyType => ValueType)
    • key-value 쌍으로 어떤 데이터든 저장할 수 있으며 가장 많이 사용되는 Reference Type입니다.
    • 역시나 Solidity 공식 문서에서 발췌하였습니다. 다음과 같이 mapping을 사용합니다.
contract MappingExample {
    mapping(address => uint) public balances;

    function update(uint newBalance) public {
        balances[msg.sender] = newBalance;
    }
}

Ether Units

Solidity의 Ethereum 통화 단위에는 3가지가 있습니다.

  1. wei : 1 wei는 1을 나타냅니다.
  2. gwei : 1 gwei는 10^9(1e9)을 나타냅니다.
  3. ether : 1 ether는  10^18(1e18)을 나타냅니다.

따라서 1,000,000,000 wei == 1 gwei 이고, 1,000,000,000,000,000,000 wei == 1 ether 입니다.

// SPDX-License-Identifier: GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract test {
    uint256 public weiTemp = 1 wei;
    uint256 public gweiTemp = 1 gwei;
    uint256 public etehrTemp = 1 ether;
}

위와 같은 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

 

finneyszabo라는 단위도 있었지만 0.7.0 버전 이후 사라졌습니다.

Time Units

Solidity의 시간 단위에는 seconds, minutes, hours, days, weeks 이렇게 5가지가 있습니다.

// SPDX-License-Identifier: GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract test {
    uint256 public seoncdsTemp = 1 seconds;
    uint256 public minutesTemp = 1 minutes;
    uint256 public hoursTmep = 1 hours;
    uint256 public daysTemp = 1 days;
    uint256 public weeksTemp = 1 weeks;
}

위와 같은 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

 

years와 같은 경우 윤달로 인해 모든 연도가 365일이 아닌 경우가 있어 0.5.0 버전 이후 사라졌습니다. 비슷한 이유로 윤초로 인해 하루가 24시간이 아닌 날도 있어 days 또한 정확하지 않습니다. 따라서 Oracle의 정확한 시간 라이브러리가 업데이트 되어야합니다.

 

다음 포스팅에서는 Solidity의 function에 대해 알아보겠습니다.

 

감사합니다.