Gas price 에 대해 기본적인 개념이 헷갈려서 질문드립니다

안녕하세요, gas 관련한 개념들이 잘 이해가 되지 않아서 질문드립니다.

첨부한 사진은 klaytn scope 에서 20klay 전송 트랜잭션 결과입니다.

여기서 gas price, effective gas price, gas used, gas limit, tx fee, burnt fees
이렇게 6가지 다른 개념과 단어가 나오는데 이해하기 쉽지 않네요…

트랜잭션 비용 문서를 보니까

Base Fee is the actual gas price used for the transaction. It has the same meaning as the Effective Gas Price. 라고 하니까 위에 나온 effective gas price == base fee 네요.

(Transaction Fee) := (Gas Used) * (Base Fee) 이므로
즉 (Transaction Fee) := (Gas Used) * (effective gas price) 라고 말할 수 있고,
tx fee (0.000525) 라는 값은 21000 * 0.000000025 를 통해 나오는 값이라는 것을 알았습니다.

그리고 트랜잭션 종류마다 필요한 가스가 다르다는 것을 알았고, 위의 클레이 전송 트랜잭션은
TxGasValueTransfer 이므로 트랜잭션 비용 - Klaytn Docs 문서를 통해 KLAY 전송에 필요한 가스는 21000 라는 것을 알았습니다.

그래서 사진에서 gas used 가 21000 이구요.

위에서 “Base Fee is the actual gas price used for the transaction” 라는 문장이 있는데요, base fee, 즉 effective gas price 는 gas price 중에서 실제로 트랜잭션에 사용된 가격이니까 effective gas price 는 항상 gas price보다 작거나 같겠네요.

그런데 위의 트랜잭션에서는 effective gas price (0.000000025) 가 gas price (0.00000005)의 딱 절반인데요, 혹시 이렇게 절반이 되는 이유가 트랜잭션 비용 - Klaytn Docs 여기에 나와있는 “Half of the transaction fee for each block is burned (BURN_RATIO = 0.5, cannot be changed by governance).” 혹시 이 문장과 관련이 있을까요?

트랜잭션 비용의 절반이 소각된다라고 나와있는데요,
그런데 사진에서 하단에 burnt fees 가 0.0002625 라고 나와있는데요, 이 값은 tx fee 인 0.000525 의 절반이니까 절반이 소각된다는 것은 값이 맞긴해요. 근데 그러면 최종적으로 이 트랜잭션을 위한 수수료로 실제로 결제? 지출?하게 되는 값은 그럼 tx fee 인 0.000525 인가요, 아니면 그것을 절반 소각한 값인 0.0002625 인가요?

이 부분이 일단 잘 이해가 안되는 것 같아요.

그리고 gas limit 은 제가 임의로 설정을 할 수 있는 값이고, 설정하지 않으면 기본값이 적용이 되고, gas limit 은 제가 지불할 의향이 있는 최대의 상한선이라고 이해했는데 맞나요?

그러면 만약 value transfer 트랜잭션에 제가 gas limit 을 21000보다 더 작게 설정을 하면 오류가 나게 되겠지요?

그리고 gas price (위에서 0.00000005 klay) 라는 값은 어떻게 산정이 되는건가요? 기준표같은게 있는지 궁금합니다. (gas used 는 트랜잭션 비용 - Klaytn Docs 이 문서에서 확인을 할 수 있는 것처럼요)

그리고 '소각’한다는 개념이 잘 이해가 안되네요… 혹시 쉽게 설명이 가능하실까요? 소각을 왜 하는지, 소각된다는 것이 어떤 의미인지…

혼자 생각을 정리하면서 글을 써서 두서없이 작성한 것 같네요 죄송합니다ㅠㅠ

안녕하세요, jina 님.

gas price: 트랜잭션에 사용될 것으로 예상되는 gas의 가격을 KLAY로 표현한 값
effective gas price: 트랜잭션에서 사용된 실제 gas의 가격을 KLAY로 표현한 값
gas used: 트랜잭션에 실제로 사용된 gas의 양
gas limit: 트랜잭션에서 사용될 수 있는 gas의 최대 양
tx fee: 트랜잭션에서 사용된 수수료(사용된 gas의 양 * 실제 gas 가격)
burnt fees: 트랜잭션에서 사용된 수수료 중 일부를 클레이튼 전체 생태계를 위해서 소각된 KLAY의 양

gas price는 네트워크의 혼잡도에 따라서 달라질 수 있는 양입니다. 간단히 말해서, 트랜잭션을 보내고자 하는 수요가 많을 때는 gas price가 비싸지고, 반대일 경우에는 gas price가 저렴해집니다.

말씀하신 트랜잭션에서 effective gas price가 gas price의 딱 절반인 것은, BURN_RATIO = 0.5인 것과는 상관이 없습니다. BURN_RATIO는 현재 클레이튼의 가치 상승을 위해서, 트랜잭션에 사용된 KLAY 중 얼마만큼을 소각할 것이냐를 의미하는 것입니다. 예를 들어서, 트랜잭션 수수료로 0.5 KLAY가 사용되었다면, 트랜잭션을 보낸 사람은 0.5 KLAY를 수수료로 지출한 것이고, 이 중 0.25 KLAY는 전체 생태계를 위해서 소각된 것입니다. 그리고 effective gas price보다 적은 gas price이면, 트랜잭션이 블록에 담기지 못하기 때문에 항상 effective gas price보다 더 큰 값으로 gas price를 널널하게 적어주시는 것을 권고드립니다. 실제로 KlaytnFinder나 KlaytnScope에서 Tx들을 하나씩 클릭해서 살펴보시면 gas price가 트랜잭션마다 조금씩 다른 것을 확인하실 수 있습니다.

gas limit은 해당 트랜잭션에서 소모될 수 있는 최대 gas 양입니다. 트랜잭션이 완료될 때까지 수행해야 할 연산에 필요한 gas보다 gas limit이 적다면, 해당 트랜잭션은 실패할 것입니다.

소각은 전체 생태계를 위해서 이뤄집니다. 시장에 유통되고 있는 KLAY가 100개 만큼 있다고 하였을 때, 1개가 소각되면 99개만 남게 됩니다. 그러면 KLAY 개수가 100개에서 99개로 줄어든 것이고, 이것은 KLAY가 더 희소해졌음을 의미합니다. 수요와 공급 관계에서 공급이 더 줄어드는 효과가 나타난 것이므로, KLAY 홀더들이 가지고 있는 KLAY 개별 가치가 상승하는 효과가 나타납니다. 즉, 트랜잭션이 많이 일어날수록 많은 KLAY가 소각되고, 이를 통해 KLAY가 희소해지는 효과가 발생하여, KLAY의 가치를 부양하는데 도움을 줍니다.

동적 가스비 정책 (Dynamic Gas Fee Pricing Mechanism) | by Tech at Klaytn | Klaytn Korea | Medium 도 참고해보시면 좋을 것 같습니다.

감사합니다.

1개의 좋아요

자세한 답변 감사드립니다!! 이해하는데 큰 도움이 되었습니다.

이라고 하셨습니다. 찾아보니까 caver-js 에 “caver.klay.getGasPrice()” 를 사용하면 그때그때 변하는 gas price 를 얻을 수 있더라구요.

그리고 동적 가스비 정책 (Dynamic Gas Fee Pricing Mechanism) | by Tech at Klaytn | Klaytn Korea | Medium 이 문서에서 " caver.rpc.klay.getTransactionReceipt 에서 리턴하는 오브젝트에는 실제 트랜잭션이 처리될 때 사용된 gasPriceeffectiveGasPrice 필드가 추가되었습니다." 라는 것을 확인했습니다.

결국 트랜잭션이 처리되기 전에 예상 gas price 는 "caver.klay.getGasPrice()"를 사용해서 구하고, 처리 후에 실제로 계산에 사용된 effective gas price 는 caver.rpc.klay.getTransactionReceipt 결과 얻을 수 있는 effectiveGasPrice 값을 사용하면 되겠네요.

그리고 1.9.0 동적가스비 설정관련 문의드립니다 이 글에 달린 답변 내용 중에 “현재 메인넷에는 동적가스비정책이 적용되지 않아서 가스비에 unitPrice인 250스톤을 적어주어야 동작합니다.” 라는 내용이 있습니다.

이 내용에 따르면 테스트넷에만 동적 가스비 정책이 적용이 되고, 아직 메인넷에서는 적용이 안되므로 고정된 값인 250 Ston 을 사용하게 된다. 라고 이해했는데 맞을까요?

그리고 위 글이 8월달 글이던데, 아직도 메인넷에는 동적 가스비 정책이 반영이 안된 상태인 것도 맞나요?

1개의 좋아요

안녕하세요, jina 님.

해당 게시글이 작성된 시점은 8월 26일이고, 8월 29일 이후로 메인넷에서도 동적 가스비 정책이 반영된 상태입니다. 관련 내용은 Klaytn v1.9.0 Release Notes | by Klaytn | Klaytn | Medium 에서도 확인하실 수 있습니다.

감사합니다.

1개의 좋아요

그렇군요…

그럼 제가 만약에 송금하기 기능을 구현하려고 하는데, 유저가 보낼 금액을 입력하면 예상 수수료를 계산해서 보여주려고 합니다.

이 상황에서 caver.klay.getGasPrice()를 사용해서 예상 가스비를 얻고, 또 klay_estimateGas 를 사용해서 해당 트랜잭션을 하기위해 소모될 가스의 양을 얻어서 (예를들어 value transfer 는 21000 gas)

그 둘을 곱하면 유저에게 최종적으로 보여줄 예상 수수료가 될 것이라고 생각했습니다.

이렇게 계산을 하면 문제가 없을까요?

안녕하세요, jina 님.

네, 그렇습니다. 그리고 추후 변경될 수는 있으나 현재는 가스비가 25~750ston 범위이기 때문에, 실제 effectiveGasPrice와는 다소 차이가 있겠지만 750ston을 gasPrice로 고정시키는 것도 하나의 방법이 될 수 있을 것입니다. 실제로, klaytnfinder 해당 account의 Tx을 살펴보시면 최대값을 미리 넣어서 gasPrice를 따로 받아올 필요가 없게 만든 것을 확인하실 수 있습니다.

감사합니다.

2개의 좋아요