본문 바로가기
솔리디티/크립토좀비

레슨3 챕터4, 5, 6 - 가스(gas) / 시간 단위(Time units)

by 멸치김밥 2022. 2. 17.

이더리움에서는 코드에 따라 가스를 사용하고 이 가스는 한도(Limit)도 정해질 수 있으며 이더리움 화폐 ETH로 구매해서 지불하게 된다.

이는 누군가가 악의적으로 네트워크를 방해할 목적으로 반복문같은 자원소모가 큰 연산을 쓰지 못하게 막는 역할을 한다.

아무리 많은 연산을 시켜도 가스 한도 내에서만 작동할 수 있고,

그만큼 자신의 돈(ETH)을 지불해야해서

부자부자하지 않으면 금전적으로 부담이 가기 때문에 악당님이 굳이 그러려고 하지않을거시다

 

참고로 위의 내용들은 이더리움 메인넷에 해당하고 사이드체인이라는 공간에는 메인넷과는 다른점이 있나보다

 

아무튼 가스가 소모되는데에는 이것저것 조건이 있는데(storage에 쓰인것인지... 등)

다른 변수들은 uint256이던 uint8이던 같은 비용의 가스를 소모하지만

구조체(struct) 안에 uint가 있는 경우 작은크기의 uint가 가스를 적게 소모한다고 한다.

또한 여러개의 구조체 안에 uint가 여러개 있을 경우 같은 종류끼리 순서를 붙여서 만들면 가스를 적게 소모한다고 한다.

struct NormalStruct {
  uint a;
  uint b;
  uint c;
}

struct MiniMe {
  uint32 a;
  uint32 b;
  uint c;
}

// `mini`가 `normal`보다 가스를 적게 사용한다.
NormalStruct normal = NormalStruct(10, 20, 30);
MiniMe mini = MiniMe(10, 20, 30);

위와 같은 경우 mini의 구조체가 uint256대신 uint32가 두개 쓰인것, 또 uint32 두개를 나란히 선언해 묶은것으로

normal보다 가스를 적게 사용한다고 한다.


  • 시간 단위(Time units)

솔리디티에서 기본으로 제공하는 시간 단위계가 있다

now 변수는 현재 유닉스 타임스탬프 값을 제공한다. 

초, 분, 시간, 일, 주, 연의 단위도 제공한다. (seconds, minutes, hours, days, weeks, years)

 

이를 이용하여 크립토 좀비에서 좀비가 공격을 할 경우 쿨타임 1일이 생기게끔 만들 수 있다.

(쿨타임 = 현재시각 + 1일) 같은 형태로..

 


챕터 4 답

        uint32 level; // 좀비 레벨
        uint32 readyTime; // 좀비 공격 쿨타임

챕터5 전

    // 1. 
    
    
    // 2. 
    uint id = zombies.push(Zombie(_name, _dna)) - 1;

    // 1. 쿨타임 하루
    uint cooldownTime = 1 days;
    
    // 2. 수정한 구조체에 맞게 레벨(1)과 현재로부터 하루 뒤인 공격 쿨타임을 가진 좀비 생성
    uint id = zombies.push(Zombie(_name, _dna, 1, uint32(now + cooldownTime))) - 1;

챕터6 답

  // 1. 쿨타임 부여하는 함수
  function _triggerCooldown(Zombie storage _zombie) internal {
    // 해당 좀비(구조체)에게 현재시간으로부터 하루만큼(cooldownTime)의 쿨타임을 부여
    _zombie.readyTime = uint32(now + cooldownTime);
  }

  // 2. 쿨타임 완료됐는지 알아보는 함수
  // 매개변수로 좀비 하나를 넣으면
  function _isReady(Zombie storage _zombie) internal view returns (bool) {
      // 쿨타임이 끝났는지 확인해서 true/false 반환
      return (_zombie.readyTime <= now);
  }

 

댓글