[크립토좀비] 레슨3. 고급 솔리디티 개념 - 가스

가영·2021년 4월 9일
0

솔리디티

목록 보기
4/7
post-thumbnail

가스(Gas)

우리는 onlyOwner 제어자를 활용해서 다른 사용자들의 남용 걱정없이 DApp의 핵심적인 부분을 업데이트할 수 있게 되었다!!

지금부터는 솔리디티의 또 다른 특징인 가스에 대해 공부해보자 💨

가스: 이더리움 DApp이 사용하는 연료

솔리디티에서는 DApp의 함수를 실행할 때마다 가스를 지불해야한다. 이 가스는 이더리움의 화폐인 💸이더(ETH)💸로 살수 있다. 한마디로, DApp함수를 실행하려면 사용자들은 이더를 소모해야한다!

함수를 실행하는데 얼만큼의 가스가 필요한지는

함수의 로직이 얼마나 복잡한 지에 따라 달라진다.

각각의 연산은 소모되는 가스 비용이 있고, 그 연산을 수행하는 데에 소모되는 컴퓨팅 자원의 양이 이 비용을 결정한다.

함수를 실행한다 👉🏻 을 쓴다

이기 때문에, 이더리움에서 코드 최적화는 다른 프로그래밍 언어들에 비해 훨씬 더 중요해진다! 만약 우리가 작성한 코드가 엉망이라면 사용자들은 함수를 실행하기 위해 원래 필요한 돈보다 더 쓰게 될거고, 만약 그런 사용자가 수천 명이 된다면 그런 불필요한 비용이 수십 억 원이 될 수도 있을 것이다.


가스는 왜 필요한가?

이더리움은 어떤 사용자 한명이 함수를 실행할 때, 네트워크상의 모든 개별 노드가 함수의 출력값을 검증하기 위해 그 함수를 실행해야한다. 이런 작업은 이더리움이 데이터를 보존하고 누군가 조작할 수 없게 하는 근본이다.

근데, 이러한 이더리움을 누군가 DoS 공격을 한다면?

👉🏻 안 그래도 한 번의 함수를 돌리는 데 여러 자원을 사용하는 이더리움에게는 치명적일 것이다!

그래서 이더리움 개발자들은 연산 처리에 비용이 들도록 만들었고, 사용자들은

  • 저장공간
  • 연산 사용 시간

에 따라 비용을 지불하게 됐다.

근데 사이드체인 이라는 거에서는 꼭 그렇지도 않다는 참고가 있었다.

참고: 사이드체인에서는 반드시 이렇지는 않다네. 크립토좀비를 만든 사람들이 Loom Network에서 만들고 있는 것들이 좋은 예시가 되겠군. 이더리움 메인넷에서 월드 오브 워크래프트 같은 게임을 직접적으로 돌리는 것은 절대 말이 되지 않을 걸세. 가스 비용이 엄청나게 높을 것이기 때문이지. 하지만 다른 합의 알고리즘을 가진 사이드체인에서는 가능할 수 있지. 우린 다음에 나올 레슨에서 DApp을 사이드체인에 올릴지, 이더리움 메인넷에 올릴지 판단하는 방법들에 대해 더 얘기할 걸세.


가스를 아끼기 위한 구조체 압축

레슨 1에서 우리는 uint에 다른 타입들이 있다는 것을 배웠다. (uint8, uint16, ...)

기본적으로 이런 하위 타입들을 쓰는 것은 아무 변화도 가져오지 않는다. 왜냐면 솔리디티에서는 타입의 크기에 상관없이 256비트의 저장공간을 미리 잡아놓기 때문이다.

하 지 만 ❗ 구조체 안에서라면 이야기가 달라진다.

만약 우리가 구조체 안에 여러 개의 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); // good!

0개의 댓글