첫 글은 웹3 개발을 시작할 때 가장 생소한 개념인 가스에 대한 내용입니다.
이더리움 블록체인에서 “가스” 라는 개념은 아주 중요한 개념입니다. 악의적인 트랜잭션을 억제하면서도 참여자들에게 보상을 지급하는 수단이기 때문이죠. 내가 누군가에게 1 ether 를 전송했다면 내 잔액은 -1 ether 지급 받은 사람의 잔액은 +1 ether 가 되겠죠. Miner는 이러한 변경사항이 유효한지 검증하고 블록에 포함시킵니다. 그리고 가스비의 일정 부분을 보상으로 가져가죠. 컨트랙트 코드를 실행하고 일련의 트랜잭션을 수행하는 것 또한 마찬가지입니다. 블록체인에서 가스가 어떤 의미를 가지는지에 대해서는 이쯤 하겠습니다.(사실 훨씬 좋은 자료가 많으니 따로 찾아보시는걸 추천..)
이더리움 네트워크의 대표적인 블록스캐너 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이 없다면 컨트랙트 코드에 따라 쓰는 족족 나간다는 뜻이고, 자칫 잘못하면 무한 반복코드를 만들어서 누군가의 지갑에 있는 이더리움을 다 써버릴 수도 있겠죠? 정글 같은 블록체인 세상에서 없어선 안 될 친구입니다.
여기까지는 가스를 얼마나 사용하는지, “양”에 대한 내용이었습니다.
다음은 가스 “가격”에 대한 내용입니다.
거의 다 왔습니다! 🥳
네트워크 가스 비용은 보통 Gwei(기위)라는 이름으로 자주 언급되는데요. 1가스당 지불하는 비용입니다.1 Gwei
는 곧 10^9 wei
입니다. 네 우리가 아는 Giga 단위의 G가 맞습니다.wei
단위는 이더리움의 가장 최소 단위입니다. 1 ether
는 10^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) 의 네트워크 가스 사용량은 아래와 같네요.
가이드 라인이라고 봐주시면 됩니다.
이쯤되면 여러분은 이제 가스에 대한 기본적인 부분은 다 알게되신 겁니다.이더스캔도 더 익숙해지셨죠?
다음 글에서는 실제로 코드에서 가스비를 만져보겠습니다.
Raw transaction 으로 직접 가스비 건드려보기
각종 라이브러리 사용 예시를 보면서 편안함 느끼기
크게 이렇게 두 파트로 생각하고 있는데요. 뭐 쓰다 보면서 바뀔 수는 있습니다.
끝 :)