이더리움 가스에 대하여 (개념)
July 14th, 2024

가스가 뭐죠?

첫 글은 웹3 개발을 시작할 때 가장 생소한 개념인 가스에 대한 내용입니다.

이더리움 블록체인에서 “가스” 라는 개념은 아주 중요한 개념입니다. 악의적인 트랜잭션을 억제하면서도 참여자들에게 보상을 지급하는 수단이기 때문이죠. 내가 누군가에게 1 ether 를 전송했다면 내 잔액은 -1 ether 지급 받은 사람의 잔액은 +1 ether 가 되겠죠. Miner는 이러한 변경사항이 유효한지 검증하고 블록에 포함시킵니다. 그리고 가스비의 일정 부분을 보상으로 가져가죠. 컨트랙트 코드를 실행하고 일련의 트랜잭션을 수행하는 것 또한 마찬가지입니다. 블록체인에서 가스가 어떤 의미를 가지는지에 대해서는 이쯤 하겠습니다.(사실 훨씬 좋은 자료가 많으니 따로 찾아보시는걸 추천..)

Transaction Fee

etherscan.io 에서 확인할 수 있는 트랜잭션 수수료
etherscan.io 에서 확인할 수 있는 트랜잭션 수수료

이더리움 네트워크의 대표적인 블록스캐너 etherscan.io 에서는 Transaction Fee 라는 항목으로“내가 이 트랜잭션을 발생시키기 위해 지불한 수수료 총합”을 볼 수 있습니다.

즉, 내 지갑에서 빠져나가는 돈은 Value + Transaction Fee 가 됩니다.

여기서 Transaction Fee소모한 가스의 양 x 가스 가격이 됩니다.

”민팅하실 때 가스비 얼마 내셨어요?” 에서 가스비는 곧 트랜잭션 수수료를 의미하고, ”지금 가스비가 너무 비싸요;; 기위(Gwei)가 100 가까이 되네요..” 에서 가스비는 가스 가격을 의미합니다. 혼용해서 사용하고 있죠. 뭐 의미는 통하기 때문에 문제는 없습니다 ㅎㅎ

소모한 가스의 양(Usage by Txn) 은 네이티브 토큰 전송의 경우 21,000으로 고정이고, 이 값은 최소값입니다. 만약 컨트랙트에 있는 함수를 실행시킨다면 코드에 따라 더 많이 나오게 될 것 입니다.

예를들어, 컨트랙트에 데이터를 저장하고 읽는 활동이 많을수록 사용되는 가스는 늘어납니다. 함수를 실행하고 돌리는 것 또한 노드가 참여해서 컴퓨팅 파워를 사용하는 것이니 복잡한 로직일수록 더 많은 가스를 소모하게 하는 것이 상식적입니다.

그런데, Usage by Txn 왼쪽에 있는 Gas Limit 은 무엇일까요?

이 값은 유저가 허락한 최대 가스 사용량입니다. “이 값 이상으로는 가스를 소모하지 않겠다.” 라는 뜻이죠. 같은 컨트랙트 같은 함수를 돌리더라도 여러 요인으로 인해 가스 소모량은 약간씩 다를 수 있습니다. 물론 크게 차이나지 않지만 약간씩은 다르죠. 그렇기 때문에 트랜잭션 전송시에는 예상 가스 소모량에 약간의 여유를 둬서 유저에게 허락(서명)을 받게 됩니다. 트랜잭션을 보내기 직전에 메타마스크에서 수수료를 얼마 지불하게 될지 보여주는데요. 이 값은 Gas Limit을 기준으로 보여주는 트랜잭션 수수료입니다.

눈썰미가 좋은 분들은 매번 내가 서명할 때, 본 값 보다 더 적게 빠져나간다는 것을 눈치 채셨을겁니다.

“내가 승인한 최대 가스 / 실제 사용한 가스” 이렇게 보시면 되겠습니다.

Gas Limit이 없다면 컨트랙트 코드에 따라 쓰는 족족 나간다는 뜻이고, 자칫 잘못하면 무한 반복코드를 만들어서 누군가의 지갑에 있는 이더리움을 다 써버릴 수도 있겠죠? 정글 같은 블록체인 세상에서 없어선 안 될 친구입니다.

여기까지는 가스를 얼마나 사용하는지, “양”에 대한 내용이었습니다.

다음은 가스 “가격”에 대한 내용입니다.

거의 다 왔습니다! 🥳

Gas fee

네트워크 가스 비용은 보통 Gwei(기위)라는 이름으로 자주 언급되는데요. 1가스당 지불하는 비용입니다.1 Gwei 는 곧 10^9 wei 입니다. 네 우리가 아는 Giga 단위의 G가 맞습니다.wei 단위는 이더리움의 가장 최소 단위입니다. 1 ether10^18 wei 가 되는 것이죠.만약 현재 가스비가 10 Gwei 라면, 1 가스당 10*10^-9 ether 를 지불한다고 보시면 됩니다.이더리움 전송이라면 소모하는 가스의 양은 21,000으로 고정이므로,21,000 x 10*10^-9 = 0.00021 ether 를 트랜잭션 수수료로 지불하게 됩니다.

이제 위 이더스캔 스크린샷을 다시 보면 훨씬 이해가 잘 되실겁니다. 실제로 소모한 가스의 양은 270,509 이고, 적용된 가스비는 1.491 Gwei 정도가 됩니다.이 두 값의 곱인 0.000403 ether 를 Transaction Fee로 지불하게 된 것이죠.

Gas fee는 알겠는데 가장 아랫줄,

Base fee, Priority fee, Max fee 이런 값들은 대체 뭔가요?

Base fee는 네트워크 상황에 맞춰서 자동 조정되는 값 입니다. 현재 네트워크 사용량이 많다면 이 값은 올라가게 됩니다.

Priority fee는 일종의 보너스 입니다. 내가 보너스를 줄테니 내 트랜잭션을 먼저 컨펌(블록에 포함)시켜 달라 하는 것이죠. 당연히 이 값이 높을수록 더 빨리 반영됩니다.

Max fee는 내가 지불할 의향이 있는 최대 가스 비용입니다. 나는 트랜잭션을 보낼 때 base 10으로 확인하고 우선 수수료 5 정도를 얹어서 총합 15정도의 가스 가격을 생각했는데, 네트워크가 혼잡해져서 base가 50으로 상승했다면 내가 생각했던 수준보다 훨씬 비싼 수수료를 지불할 수 밖에 없을 것 입니다. Max fee 한도는 이럴 때 중요하죠. Max fee 보다 높은 가스 가격을 지불해야 하는 상황이라면 트랜잭션은 Fail 합니다.

따라서 트랜잭션을 생성할 때, Max fee >= Base fee + Priority fee 가 되어야 합니다.

Base fee는 자동으로 조정되는 값이고, Max fee는 한도에 대한 내용이니 최악의 경우가 ‘트랜잭션 실패’ 정도지만 Priority fee는 좀 다릅니다. 이 값은 말 그대로 보너스이기 때문에 내가 넣는 값으로 그대로 지불됩니다. 자릿수를 실수하면 예상하지 못한 큰 지출이 생길 수 있습니다.

물론, 요즘은 라이브러리가 잘 나와서 이런 실수는 할 일이 없으니 크게 걱정은 안 하셔도 되고, 대부분의 dApp 에서 트랜잭션 가스비 조정은 유저(브라우저 지갑)에게 넘기기 때문에 서비스 구현 단계에서 고민 할 내용은 아닙니다. (메타마스크 트랜잭션 보낼때 가스비 “빠름”, “중간”, “느림” 선택하는게 바로 이 priority 부분이라고 보시면 됩니다)

현재 Ethereum testnet (Sepolia) 의 네트워크 가스 사용량은 아래와 같네요.

가이드 라인이라고 봐주시면 됩니다.

참고) Ethereum Sepolia 가스비
참고) Ethereum Sepolia 가스비

이쯤되면 여러분은 이제 가스에 대한 기본적인 부분은 다 알게되신 겁니다.이더스캔도 더 익숙해지셨죠?

다음 글에서는 실제로 코드에서 가스비를 만져보겠습니다.

  • Raw transaction 으로 직접 가스비 건드려보기

  • 각종 라이브러리 사용 예시를 보면서 편안함 느끼기

크게 이렇게 두 파트로 생각하고 있는데요. 뭐 쓰다 보면서 바뀔 수는 있습니다.

끝 :)

Subscribe to gWhy
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from gWhy

Skeleton

Skeleton

Skeleton