이더리움 - GAS , GAS mechanism
GAS
말 그대로 연료를 의미하며 EVM 상에서 트랜잭션을 동작시키기 위해 소모되는 비용이다. 비트 코인의 수수료 개념에서 좀 더 진화된 개념으로 코드의 복잡성에 따라 다르게 측정된다.
Gwei
Gwei 는 이더의 작은 단위로, 오퍼레이션 비용과 채굴자의 인센티브를 계산하는데에 사용된다.
1ETH는 10억 gwei와 같다. Gwei는 오퍼레이션을 하는 대가로 채굴자에게 얼마나 지불할지에 대해 결정할때 사용한다.
- Gas Limit : 사용할 가스에 대한 예측치( 너무 높으면 거절 당할 수 있음)
- Gas Price : Gas Limit 에서 1 Gas 당 가격, 높을수록 빨리 실행된다.
- 총 비용: Gas Limit 중 실제 사용량 * Gas Price
- Block Gas Limit : 한 블록에 넣을 수 있는 Gas Limit 의 총합
Gas Mechanism
STARTGAS/ GASPRICE
- Gas는 이더리움 네트워크 상에서 계산의 기본 단위이다.
- STARTGAS 는 사용자가 지정하는 이 트랜잭션을 위한 최대 GAS 소비량이다.
GAS 를 사용하는 이유
- STARTGAS 와 GASPRICE 필드는 이더리움의 anti-DOS 모델에 있어 매우 중요한 역할을 한다.
- Turing - Complete 언어임에 따라 우연적/악의적 으로 무한 루프 생성 가능
- 계산 낭비를 방지하기 위해 각각의 트랜잭션은 사용할 수 있는 코드 실행의 계산 단계 수를 설정
- 비트 코인의 경우 트랜잭션의 길이로 수수료를 계산하지만, 이더리움은 짧은 코드로도 무수히 많은 연산이 가능하므로, 길이로 수수료를 계산하는 것은 옳지 않음
트랜잭션의 데이터는 바이트당 5gas EOA → EOA 의 standard transaction 은 보통 21,000 gas 를 STARTGAS 로 놓는다 EOA → CA 의 경우 종류에 따라 gas 소모량이 다를 수 있음
왜 Ether 를 GAS 대신 그대로 사용하지 않는가?
- Ether 를 그냥 사용하기에는 변동성이 너무 크다
- 계산 능력에 대한 가격과 Ether token 자체를 분리하기 위하여 Gas 사용
GAS 사용 과정
상태 변환 함수

상태 변환 단계
- 트랜잭션이 형식에 제대로 맞는지(올바른 개수의 값을 가지고 있는지) 체크하고, 서명이 유효한지, nonce가 발신처 계정의 nonce와 일치하는지 확인. 그렇지 않다면 오류를 반환
- gaslimit * gasprice로 트랜잭션 수수료를 계산하고, 서명으로부터 발신처 주소를 결정
- 발신처 계정 잔고에서 위에서 구한 트랜잭션 수수료를 빼고 발신자 nonce를 증가, 발신처 잔고가 충분하지 않다면 오류를 반환
- GAS = gaslimit 으로 초기화한 후, 트랜잭션에서 사용된 바이트에 대한 값을 지불하기 위해 바이트 당 gas의 특정 양을 차감
- 발신처 계정에서 수신처 계정으로 트랜잭션 값을 보냄. 수신처 계정이 존재하지 않으면 새로 생성
- 수신처 계정이 컨트랙트면, 컨트랙트의 코드를 끝까지, 또는 GAS가 모두 소모될 때 까지 수행
- 발신처가 충분한 ‘돈’을 가지고 있지 못해서 값 전송을 실패하거나, 코드 수행시 GAS가 부족하면 모든 상태를 되돌려 놓음 .단 수수료(코드를 수행한 GAS)는 제외되고 이 수수료는 채굴자 계정에 더해짐
상태 변환 예시
트랜잭션 TX 가 EOA 로부터 CA에
(10 ether, 2000 gas(gaslimit), 0.001 ether(gasprice),CHARLIE 라는 문자열 저장)
- 트랜잭션이 유효하고 형식에 제대로 맞는지 확인한다.
- 트랜잭션 발송처가 최소 2000*0.001 = 2ether 를 가지고 있는지 확인하고, 그럴 경우 발송처의 어카운트에서 2 ether를 뺀다.
- Gas = 2000으로 초기화 한 후, 트랜잭션이 170바이트의 길이라고 가정하면 2000 - 850 = 1150 gas가 남는다.
- 발송처 어카운트에서 추가 10 ether를 빼고 이것을 CA에 더한다.
- 코드를 실행시켜 스토리지에 CHARLIE 를 저장하고, 187 gas가 소비되었다고 가정하면 1150-187 = 963gas가 된다.
- 963 * 0.001 = 0.963 ether를 다시 발송처 어카운트로 되돌려주고, 결과를 반환한다.
참고자료
이더리움-상태변환 단계 및 코드 설명
이더리움 가스란 무엇입니까?