[EIP1559] トランザクション手数料の見積もりを行うには

このスクラップでは、EIP1559を理解してトランザクション手数料を推定する際の考え方を共有する。
今後記事としてまとめるかもしれないが、ひとまずスクラップで残しておく。

EIP1559以前
EIP-1559 導入前のトランザクション手数料は、トランザクション処理に必要となったガス量 (gas
) に、トランザクションの gasPrice
フィールドの値を掛けることで決定されていた。
トランザクション手数料 = ガス量 ✗ ガス価格

トランザクション手数料はマイナー(PoS 以降はバリデータ)への報酬として全額支払われるため、マイナーは基本的に gasPrice
が高いトランザクションを優先的に処理 する。
そのため、ユーザーはトランザクションの承認を早めるために gasPrice
を高く設定できる一方で、低く設定した場合は 優先度が下がり、処理が遅延する傾向があった。

どんな問題があったのか
トランザクションの需要が高まると gasPrice
が大きく変動するため適正な手数料の推定が困難になってしまう。結果として、手数料の過払いやトランザクションの遅延が頻繁に発生した。
また、手数料の全額がマイナー報酬であるため、マイナーはgasPrice
の上昇を意図的に誘導するインセンティブがあり、ネットワークの公平性が損なわれてしまう。

この仕組みは「ファーストプライスオークション形式」と呼ばれていて、非常に非効率である

EIP1559
ネットワークの混雑状況によって変動する「基本料金」と、承認を早めるためにマイナーへ支払う「優先手数料」の2種類の手数料を含む仕組みが提案された。

EIP-1559 で追加された EIP-2718 トランザクションタイプ
0x02 ||
rlp([
chain_id,
nonce,
max_priority_fee_per_gas,
max_fee_per_gas,
gas_limit,
destination,
amount,
data,
access_list,
signature_y_parity,
signature_r,
signature_s,
]);

大事な要素は以下の3つ
- BaseFeePerGas
- ネットワークの混雑状況に応じてブロックごとに自動調整される料金
- マイナーには一切支払われず、すべてバーン(焼却)される
- MaxPriorityFeePerGas
- トランザクションが優先的に処理されるようマイナーへ支払う料金
-
max_priority_fee_per_gas
フィールドで発行者が設定
- MaxFeePerGas
- 最大料金
-
max_fee_per_gas
フィールドで発行者が設定

EIP1559のトランザクション手数料は、これらの要素にトランザクション処理で必要となったガス量を掛けることで決定される
トランザクション手数料
= ガス量 ✗ min(BaseFeePerGas + MaxPriorityFeePerGas, MaxFeePerGas)
↑のように、MaxFeePerGasにより「BaseFeePerGasとMaxPriorityFeePerGasの合計額」の上限を設定することができる

トランザクション手数料を推定するにはどうするか
EIP1559準拠のトランザクション手数料の推定は、算出式がわかっているので基本的にそれに必要な情報をviemなどのクライアントライブラリのAPIを使用して取得すればよい