본문 바로가기

:D/block chain

[Solidity] 가스(Gas)

 

 

 

 


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

솔리디티에서는 DApp의 함수를 실행할 때마다 가스 라고 불리는 화폐를 지불해야 함

사용자는 이더(ETH)를 이용해서 가스를 사기 때문에, DApp 함수를 실행하려면 사용자들은 ETH를 소모해야 함.

 

함수를 실행하는 데에 얼마나 많은 가스가 필요한지는 그 함수의 로직(논리 구조)이 얼마나 복잡한지에 따라 달라짐.

각각의 연산은 소모되는 가스 비용(gas cost)이 있고, 그 연산을 수행하는 데에 소모되는 컴퓨팅 자원의 양이 이 비용을 결정. 예를 들어 storage에 값을 쓰는 것은 두 개의 정수를 더하는 것보다 훨씬 비용이 높음. 함수의 전체 가스 비용은 그 함수를 구성하는 개별 연산들의 가스 비용을 모두 합친 것과 같음

 

함수를 실행하는 것은 사용자들에게 실제 돈을 쓰게 하기 때문에, 이더리움에서 코드 최적화는 다른 프로그래밍 언어들에 비해 훨씬 더 중요함. 내 코드가 엉망이라면 그만큼 사용자들이 함수를 실행하기 위해 일종의 할증료를 더 내야하기 때문.

 

 

 

 

 

 

가스는 왜 필요한가?

 

 

이더리움은 크고 느린, 하지만 굉장히 안전한 컴퓨터와 같다고 할 수 있다.

내가 어떤 함수를 실행할 때, 네트워크상의 모든 개별 노드가 함수의 출력값을 검증하기 위해 그 함수를 실행해야 한다.

모든 함수의 실행을 검증하는 수천 개의 노드가 바로 이더리움을 분산화하고, 데이터를 보존하며 누군가 검열할 수 없도록 하는 요소이다.

이더리움을 만든 사람들은 누군가가 무한 반복문을 써서 네트워크를 방해하거나, 자원 소모가 큰 연산을 써서 네트워크 자원을 모두 사용하지 못하도록 만들길 원했다. 그래서 그들은 연산 처리에 비용이 들도록 만들었고, 사용자들은 저장 공간 뿐만 아니라 연산 사용 시간에 따라서도 비용을 지불해야 한다.

 

 

사이드체인에서는 반드시 이렇지는 않음. 이더리움 메인넷에서 월드 오브 워크래프트 같은 게임을 직접적으로 돌리는 것은 절대 말이 되지 않음. 가스 비용이 엄청나게 높을 것이기 때문. 하지만 다른 합의 알고리즘을 가진 사이드체인에서는 가능할 수 있음. 

 

 

 

 

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

 

기본적으로 uint8, uint16, uint32, 기타 등등의 하위 타입들을 쓰는 것은 아무런 이득이 없음. 

왜냐하면 솔리디티에서는 uint의 크기에 상관없이 256비트의 저장 공간을 미리 잡아놓기 때문

예를 들자면, uint(uint256) 대신에 uint8을 쓰는 것은 가스 소모를 줄이는 데에 아무 영향이 없음.

 

하지만 예외가 있는 경우가 있는데 struct의 안에서의 경우

 

구조체 안에 여러개의 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);

 

 

이런 이유로, 구조체 안에서는 가능한 한 작은 크기의 정수 타입을 쓰는 것이 좋음.

 

또한 동일한 데이터 타입은 하나로 묶어놓는 것이 좋음. 즉, 구조체에서 서로 옆에 있도록 선언하면 솔리디티에서 사용하는 저장 공간을 최소화함. 예를 들면 uint c; uint32 a; uint32 b; 라는 필드로 구성된 구조체가 uint32 a; uint c; uint32 b; 필드로 구성된 구조체보다 가스를 덜 소모함. uint32 필드가 묶여있기 때문 

 

 

 

 

 

 

 

 

' :D > block chain' 카테고리의 다른 글

UNISWAP 2 : 유니스왑의 컨트랙트 자세히 알아보기  (0) 2022.03.14
UNISWAP 1 : 유니스왑이란?  (0) 2022.03.14
[Solidity] 컨트랙트의 불변성  (0) 2022.02.16
[Solidity] Storage vs Memory  (0) 2022.02.15
[Solidity] 상속  (0) 2022.02.15