EIP-1559 규약에 대하여 (feat. 1inch API)

이 글을 쓰기 전 EIP-1559 규약에 대해 알아본 계기는 다음과 같다. 1inch 웹에서는 max priority fee와 max fee를 모두 보여준다. 1inch API(Aggregation Protocol, swap)에는 gasPrice와 gasLimit이 있다. 내가 기본적으로 알고 있던 건 gasPrice와 gasLimit이다. 그럼 도대체 웹에서 보여주는 max priority fee, max fee는 무엇이고 내가 알던 것과 무슨 관련이 있을까?

워낙 한국어로 제대로 설명해 주는 자료가 적어서(아니면 검색 최적화가 안 됐던지..) 내가 찾으려고 하는 게 EIP-1559인지조차 한참 있다 알았다. 가장 처음 의문을 가지고 거의 한 시간 반 정도 찾은 것 같다.

결론부터 말하면, 예전에는 (gasLimit, gasPrice) 페어로 거래를 진행했었고, 2021년 8월 4일의 [런던 하드포크](Ethereum's London Hard Fork Expected to Launch on Aug. 4 - CoinDesk) 이후 EIP-1559 규약이 적용되며 (maxPriorityFeePerGas, maxFeePerGas) 페어로 거래를 진행할 수 있다. 근데 이게 이것만으로 거래가 되게 제한을 둔 게 아니라, 예전의 형태(레거시 트랜잭션)으로도 거래가 가능하다고 한다.


아래에는 간략한 설명을 적어두나 어차피 나는 블록체인을 사정상 잠깐 급하게 공부해야 했던거고 이쪽을 전문적으로 공부하는 사람들이 훨씬 자세히 적어둔 글이 있으니 이것들을 참고하길 권한다. 나도 이거 참고해서 내용 정리했다.

Reference

Legacy Transaction

일단, 기존에 내가 알던 (gasPrice, gasLimit) 페어를 사용하는 거래(베를린 하드포크 이후 레거시 트랜잭션이라 불린다고 한다.)에 대해 설명하겠다. 굉장히 많은 인터넷 소스에서 혼동이 가도록 설명을 해뒀는데[1], gasPrice는 정확히 말하면 FeePerGas이다. 다시 말해 단위가 Gwei/gas이다.

Gweiwei 앞에 $10^9$를 뜻하는 접두사인 G을 붙인 단위이고 wei는 이더리움의 단위이다. 이더리움은 decimal로 18을 사용하며 이는 $10^{-18}$eth=1wei가 이더리움의 최소 단위가 된다는 말이다. Gwei10^9wei로, 10^{-8}eth와 같다.

기존의 트랙잭션은 사용자가 gasPrice와 gasLimit 페어를 트랙잭션에 넣어 보내면, 당연히 더 많은 이득을 얻고자 하는 채굴자들이 gasPrice 내림차순으로 정렬하여 그 트랙잭션부터 먼저 처리하는 구조다. 또한 처리하는 컨트랙트에 해당하는 gas(예를 들어 덧셈에 4gas라던지 그런 가스 책정 기준이 있다고 들었다. 정확히 기억은 안 난다.)를 계산해 gasPrice와 곱하고, 이것이 바로 거래의 수수료(fee)가 된다.

EIP-1559 Transaction

이제 트랙잭션에는 (gasPrice, gasLimit) 페어 대신 (maxPriorityFeePerGas, maxFeePerGas)을 넣어 보낸다. 트랙잭션의 수수료는 Base Fee와 Priority Fee의 합으로 정해지는데, 자세한 내용은 https://jerryjerryjerry.tistory.com/82?category=562016 여기를 참고하자.

하나 굉장히 인상깊었던 내용은 base fee를 통해 이더리움을 태움으로써 "deflationary ETH supply"을 도모한다는 것이다. 화폐가 계속 발행되는 구조인 암호화폐 특성상 무조건 인플레이션이 일어날 수밖에 없는데 이걸 이런 식으로 해결하고 이런 식으로 표현한다니 좀 인상깊었다.

요약

max fee에서 base fee를 뺀 값과 max priority fee 중 최솟값을 채굴자 등에게 인센티브로 주고, 따라서 사용자는 max fee와 max priority fee를 설정해야 함(TransactionType 0x02)

TransactionType 0x00은 본래의 거래 형태로 EIP-1599 이후 Legacy Transaction으로 불리고, 런던 하드포크 이후에도 사용 가능(EIP-2930을 빌려 사용할 수도 있는 것으로 보임)
레거시 트랜잭션 사용하면 maxFeePerGas=maxPriorityFeePerGas=gasPrice로 설정된다고 함(참고)
즉 maxPriorityFeePerGas를 마음대로 설정하지 못하는 효과가 나서 PriorityFee가 상정한 것 이상으로 소모될 것으로 예상됨

Reference(web3js)

sendTransaction 함수의 사용 용례는 https://medium.com/onther-tech/eip-1559에-대하여-30b7f7019507 에서 확인할 수 있다.

그렇다면 1inch 웹에서는 왜 Type 2 Transaction 기준으로 UI를 제공하고 1inch API에서는 Type 0 Transaction 기준으로 인자를 받을까? 이에 대해서 내가 처음 고민해봤었지만 뾰족한 이유는 생각해내지 못했었는데, 이후 Binance Smart Chain에서는 Type 2 Transaction을 지원하지 않는다는 말을 본 후로 Etheureum Mainnet 외에는 EIP-1559를 적용하지 않은 경우도 있기에 그런 듯하다고 추측하고 있다. 지금까지 추측해본 바로는 이게 가장 그럴듯한듯.


  1. 제발 단위 좀 의식해서 써줬으면 좋겠다. 단위(unit)에 대한 의식이 사람들에게 너무 희미하다. ↩︎