gas は、Ethereum で取引の実行に掛かる計算量を測る単位です。EVM(Ethereum Virtual Machine)の命令ごとに gas の量が決まっており、取引は「使ってよい gas の上限」と「1 gas あたりに払う額」を書いて送ります。取引をまとめた単位がブロックで、ネットワークに参加する全てのノード(Ethereum のソフトウェアを動かすコンピューター)がブロックの取引を実行します。ブロック 1 つに入る取引の gas の合計にも上限があり、これが全ノードが 1 ブロックごとに実行する量の上限になります。
EIP-1559(EIP は Ethereum の仕様変更の提案書)は、2021 年 8 月 5 日の London のハードフォーク(全ノードの規則の一斉更新)で入った、1 gas あたりの額の決め方です。この額は、ブロックごとにプロトコルが決める base fee と、送り主が上乗せする priority fee の 2 つに分かれます。base fee は、前のブロックが上限の半分(target)よりどれだけ多く、または少なく gas を使ったかで、1 ブロックごとに最大 12.5% 上下します。以下は、前のブロックの使用量と、次のブロックの base fee の関係を描いた図です。

前のブロックの使用量と、次のブロックの base fee
満杯のブロックが続けば base fee は 1.125 倍ずつ上がり、空のブロックが続けば 0.875 倍ずつ下がります。次のブロックの base fee は今の 1.125 倍を超えないので、払う額の上限を見積もれます。EIP-1559 の本文も、これでウォレットが手数料を自動で設定しやすくなると説明しています。
本記事では、ローカルのノードで base fee を実測しながら、gas が何を測り、EIP-1559 が 1 gas あたりの額をどう決めるのかを説明します。扱う疑問は次の通りです。
- gas は、なぜ命令ごとに決まっていて、ブロックにも上限があるのか。
- London 以前の手数料の決め方は、何が問題だったのか。
- base fee を焼却し(誰にも渡さずに消し)、priority fee だけをブロックの提案者に渡すのはなぜか。
- base fee はどんな式で上下し、実際のノードは式の通りに動くのか。
- base fee が上がって単価の上限を超えた取引は、どうなるのか。
命令ごとの gas の値は EVM のノート、取引に書く項目と送り主が払う額の計算例は Ethereum Transaction で説明しています。rollup が使う blob の手数料にも target を基準に値段を上下させる仕組みがありますが、その式は扱いません。
gas で計算量を測る理由
Ethereum の取引は、宛先のコントラクトのコードを動かせます。コードはループを書けるので、どれだけの計算になるかを取引のデータから事前に決められません。そこで EVM は、全ての命令に gas の値を付け、送り主が取引に書いた上限(gasLimit)まで使った所で実行を止めます。止まった取引は、状態の変更が取り消されますが、使った gas の分の手数料は払います。
命令の値は、計算の重さだけでなく、ノードのディスクや状態への負担で決まります。例えば、足し算の ADD は 3 gas ですが、storage(コントラクトがチェーン上に持ち続ける保存領域)の空の場所に初めて値を書く SSTORE は 2 万 gas(その場所に取引の中で初めて触れる cold の時は、さらに 2,100 gas)掛かります。手数料はこの gas の量に 1 gas あたりの額を掛けて決まるので、重い処理を頼む取引ほど多く払います。
1 ブロックに入る取引の gas の合計にも上限(block gas limit)があります。ブロックを受け取ったノードは、中の取引を全て実行し直して検証します。上限を上げれば 1 ブロックに入る取引は増えますが、全ノードの検証の負担も同じだけ増えます。以下は、取引ごとの上限とブロックの上限の関係を描いた図です。

取引の gasLimit と、ブロックの gas の上限
取引の gasLimit は送り主が 1 件ごとに書く上限で、ブロックの上限は全ての取引の合計に掛かる上限です。
上限の値は固定ではありません。Ethereum の仕様を Python で書いた execution-specs の check_gas_limit は、親ブロックの上限から 1024 分の 1 未満の幅でしか次の上限を変えられないと定めています。ethereum.org の gas のページには、次のように書かれています。
The gas limit can fluctuate over time based on validator signalling, as well as via network upgrades.
(gas の上限は、バリデータ(ブロックを提案する参加者)の意思表示や、ネットワークの更新によって時間とともに変わりうる。)
本記事では、時期で変わる上限の値ではなく、上限に対する比率で説明します。
London 以前の手数料
London 以前の取引は、1 gas あたりの額(gasPrice)を 1 つだけ書いていました。採掘者(当時の Proof of Work で、ブロックを作る参加者)は gasPrice の高い取引から選び、取り込まれた取引は書いた額をそのまま払います。高い値を付けた順に、付けた値で買う形で、EIP-1559 の本文はこれを first price auction(第一価格オークション)と呼んでいます。
EIP-1559 の Motivation は、この形の問題を 4 つ挙げています。1 つ目は、ブロックが満杯の時に gasPrice が激しく上下することです。本文は、ブロックに 1 件を足す時のネットワークの負担は 800 万 gas が 802 万 gas になる程度で変わらないのに、値段だけが 10 倍になるのはおかしいと書いています。
2 つ目は、上限が固定されていて、混んだブロックの取引が次へ回されても、空いたブロックの余りを使う仕組みが無いことです。3 つ目は、払う額を自分で入札するので見積もりが難しく、払いすぎが頻繁に起きることです。4 つ目は本記事では扱いません。2 つ目への答えは、後の「base fee を決める式」の節で出てきます。

London 以前と EIP-1559 の、1 gas あたりの支払い
上記の図の右側が EIP-1559 です。同じブロックの取引は全員が同じ base fee を払い、上乗せの priority fee(tip)だけが取引ごとに違います。送り主が書くのは、1 gas あたりの額の上限(maxFeePerGas)と、上乗せの上限(maxPriorityFeePerGas)です。点線の枠のうち、base fee と tip を超える部分は払いません。
額は ETH の小さな単位で表し、gwei は 10 億分の 1 ETH、wei は 10^18 分の 1 ETH です。
base fee の焼却と priority fee
EIP-1559 の取引が 1 gas あたりに払う額は、ブロックの base fee と priority fee の和です。priority fee は、maxPriorityFeePerGas と「maxFeePerGas − base fee」のうち小さい方になります。maxFeePerGas が base fee を下回る取引は、そのブロックに入れられません(execution-specs の InsufficientMaxFeePerGasError)。
以下は、base fee が 4.11 gwei(後の実験のブロック 16 の値)のブロックで、maxPriorityFeePerGas を 1 gwei にした 3 人が払う額を並べた図です。

base fee と priority fee(tip)の分け方と行き先
上限に余裕が無いと、tip は書いた額より小さくなります。
base fee の分は誰にも渡らず焼却され、priority fee の分だけがブロックの提案者に渡ります。EIP の本文は受け取る側を miner(採掘者)と書いていますが、2022 年 9 月に Proof of Stake へ移ってからは、ブロックを提案するバリデータが指定したアドレスに渡ります。base fee を提案者に渡さない理由について、本文は次のように書いています。
Finally, ensuring the miner of a block does not receive the base fee is important because it removes miner incentive to manipulate the fee in order to extract more fees from users.
(最後に、ブロックの採掘者が base fee を受け取らないようにすることは重要である。利用者からより多くの手数料を取るために、採掘者が手数料を操作する動機を取り除くからだ。)
提案者が base fee を受け取れるなら、自分の取引でブロックを満杯にして base fee を吊り上げ、次のブロックから多く取れます。焼却すれば、吊り上げても提案者の取り分は増えません。本文は他にも、手数料を ETH だけで払わせることと、焼却で ETH の新規発行を打ち消すことを理由に挙げています。
priority fee の役割
priority fee について、Proof of Work の時代に書かれた本文は 1 nanoeth(1 gwei)程度の小さな額を想定し、ブロックを作る側が負う、作ったブロックが孤立して(orphan)チェーンに残らない危険への補償と説明しています。ブロックに空きがあれば、小さな tip でも取引は入ります。満杯のブロックが続いた時に何が起きるかは、後の実験で確かめます。
base fee を決める式
base fee は、親ブロックの gas の上限・使用量・base fee だけから計算します。以下は、execution-specs v2.20.0 の、2025 年 12 月のハードフォーク Osaka の規則の calculate_base_fee_per_gas から、上限の検査と型の変換を除いた部分です。
BASE_FEE_MAX_CHANGE_DENOMINATOR = Uint(8)
ELASTICITY_MULTIPLIER = Uint(2)
parent_gas_target = parent_gas_limit // ELASTICITY_MULTIPLIER
if parent_gas_used == parent_gas_target:
expected_base_fee_per_gas = parent_base_fee_per_gas
elif parent_gas_used > parent_gas_target:
gas_used_delta = parent_gas_used - parent_gas_target
parent_fee_gas_delta = parent_base_fee_per_gas * gas_used_delta
target_fee_gas_delta = parent_fee_gas_delta // parent_gas_target
base_fee_per_gas_delta = max(
target_fee_gas_delta // BASE_FEE_MAX_CHANGE_DENOMINATOR,
Uint(1),
)
expected_base_fee_per_gas = parent_base_fee_per_gas + base_fee_per_gas_delta
else:
gas_used_delta = parent_gas_target - parent_gas_used
parent_fee_gas_delta = parent_base_fee_per_gas * gas_used_delta
target_fee_gas_delta = parent_fee_gas_delta // parent_gas_target
base_fee_per_gas_delta = target_fee_gas_delta // BASE_FEE_MAX_CHANGE_DENOMINATOR
expected_base_fee_per_gas = parent_base_fee_per_gas - base_fee_per_gas_delta
target は上限を ELASTICITY_MULTIPLIER(2)で割った値、つまり上限の半分です。変化の量は「target との差 ÷ target ÷ 8」に親の base fee を掛けたものです。満杯のブロックでは差が target と等しいので 8 分の 1(12.5%)上がり、空のブロックでは 12.5% 下がります。使用率 75% なら差は target の半分なので、上がるのは 6.25% です。
London のフォークのブロックでは、ブロックの上限を 2 倍に引き上げ、base fee を INITIAL_BASE_FEE(10 億 wei、1 gwei)から始めました(EIP の pseudocode)。それまでの上限がそのまま target になり、混雑した時だけ、ブロックをその 2 倍まで伸ばせるようにしたわけです。これが、London 以前の問題の 2 つ目(空いたブロックの余りを使えない)への答えです。
式は整数の切り捨てで計算します。上がる時は最低でも 1 wei 上がりますが、下がる時にはこの最低がありません。base fee が 7 wei 以下だと、空のブロックでも 7 ÷ 8 が切り捨てで 0 になり、それ以上は下がりません。逆に、7 wei から 8 wei への上昇は 14.3% で、極端に小さい base fee では 12.5% を超えて上がります。この下限も、後の実験で確かめます。
Anvil で base fee を実測する
Foundry のローカルノード Anvil 1.7.1 で、ノードの実装が式の通りに base fee を決めているかを確かめました。実行は 2026 年 11 月 11 日で、EVM の規則は 2025 年 12 月のハードフォーク Osaka のものに固定しています(実行環境は lab/output/environment.txt)。
ローカルの Anvil だけを使い、公開のネットワークや実際の資産には接続していません。アカウントは Anvil が既定で作るテスト用のもので、秘密鍵が広く公開されている説明用の無価値な鍵です。
ブロックを満杯にしやすいように、ブロックの gas の上限を 1,050,000(ETH を送るだけの送金 1 件は 21,000 gas なので、50 件分)に下げ、base fee は 1 gwei から始めました。target は 525,000 で、送金 25 件で使用率がちょうど 50% になります。
--no-mining で自動のマイニングを止め、送金を mempool(ブロックに入る前の取引の置き場)に溜めてから、evm_mine でブロックを 1 つずつ作ります。並び順は、tip の高い取引を先にする Anvil の既定の設定(--order fees)です。
以下は、実験の lab/run.py から、式の計算と、ブロックを作る部分の抜粋です。transfer は eth_sendTransaction で送金を 1 件送り、block は eth_getBlockByNumber の結果から gas の使用量と base fee を取り出す関数です。
def expected_base_fee(parent_base_fee, parent_gas_used, parent_gas_limit):
"""EIP-1559 の式で、親ブロックから次のブロックの base fee を計算する。"""
target = parent_gas_limit // ELASTICITY_MULTIPLIER
if parent_gas_used == target:
return parent_base_fee
if parent_gas_used > target:
delta = parent_base_fee * (parent_gas_used - target) // target // BASE_FEE_MAX_CHANGE_DENOMINATOR
return parent_base_fee + max(delta, 1)
delta = parent_base_fee * (target - parent_gas_used) // target // BASE_FEE_MAX_CHANGE_DENOMINATOR
return parent_base_fee - delta
def mine_with(filler, to, n_transfers, tip=2 * GWEI, max_fee=1000 * GWEI):
"""filler から n 件の送金を mempool に入れてから、ブロックを 1 つ作る。"""
for _ in range(n_transfers):
transfer(filler, to, max_fee, tip)
rpc('evm_mine')
return block()
手順は次の通りです。まず、target ちょうど(25 件)のブロックを 3 つ作ります。次に、Alice が単価の上限 2 gwei、Carol が 5 gwei で、どちらも tip 1 gwei の送金を 1 件ずつ送ります。その後、混雑を作る役のアカウントが tip 2 gwei の送金を 50 件ずつ送り、満杯のブロックを 12 個作ります。base fee が 2 gwei を超えた直後には、Bob が Alice と同じ上限 2 gwei の送金を送ります。最後に、混雑役が送るのを止めてブロックを 12 個作ります。

Anvil で実測した base fee と、EIP-1559 の式で計算した値
ブロック 2 から 27 までの base fee は、全て式で計算した値と 1 wei も違いませんでした。満杯のブロックが 12 個続くと、base fee は 1 gwei から 4.11 gwei(1.125 の 12 乗倍)まで上がっています。
ブロック 1 だけは、genesis(使用量 0)から計算すると 0.875 gwei になるはずが、起動時に指定した 1 gwei のままでした。Anvil は、指定した値を最初のブロックにも使うようです。出力の要点は次の通りです(全体は lab/output/output.txt)。
phase block txs used base fee(wei) EIP-1559 cmp
full 4 50 100.0% 1000000000 1000000000 ok alice pending, carol pending
full 10 50 100.0% 2027286528 2027286528 ok alice pending, carol pending
bob sends the same 2 gwei transaction: rejected (max fee per gas less than block base fee)
full 15 50 100.0% 3653236150 3653236150 ok alice pending, carol pending
empty 16 1 2.0% 4109890668 4109890668 ok alice gone, carol included (price 5.000 = base fee + tip 0.890 gwei)
empty 22 0 0.0% 1855039692 1855039692 ok alice gone
満杯の間は tip の競争になる
Alice と Carol の取引は、満杯の 12 ブロックの間、一度も入りませんでした。ブロック 4〜9 の base fee は Alice の上限 2 gwei を下回っており、base fee の条件は満たしています。それでも入らなかったのは、混雑役の 50 件の tip が 2 gwei で、tip 1 gwei の 2 件より先に並び、ブロックを埋めたからです。
base fee が上がれば需要が減り、ブロックは target に戻る、というのが EIP-1559 の想定です。base fee が需要に追いつくまでの間は、ブロックに入る取引を決めるのは tip の高さで、London 以前に近い入札の形に戻ります。
上限を超えた取引は入らない
混雑役が止まったブロック 16 で、Carol の取引が入りました。base fee は 4.11 gwei で、Carol の上限 5 gwei までの残りは 0.89 gwei です。tip は 1 gwei と書いていましたが、実際に払ったのは 0.89 gwei で、1 gas あたりの額はちょうど上限の 5 gwei でした。
Alice の取引は、同じブロック 16 で mempool から消えました。eth_getTransactionByHash も null を返し、ブロック 22 で base fee が 1.86 gwei まで下がって上限の 2 gwei を下回った後も、戻ってきませんでした。理由は次の節で見ます。
また、base fee が 2 gwei を超えたブロック 10 の直後に、Bob が Alice と同じ 2 gwei の上限で送った取引は、max fee per gas less than block base fee で受け付けられませんでした。
base fee の下限
base fee を 20 wei から始め、空のブロックを続けた結果が以下です(全体は同じ output.txt の (2) にあります)。
empty 10 0 0.0% 8 8 ok
empty 11 0 0.0% 7 7 ok
empty 14 0 0.0% 7 7 ok
full 15 50 100.0% 7 7 ok
full 16 50 100.0% 8 8 ok
20、18、16、14、13 と下がった base fee は 7 wei で止まり、空のブロックが続いても下がりませんでした。満杯のブロックを入れると、12.5% なら 0.875 wei のところ、最低の 1 wei が足されて 8、9 と上がっています。
上限を下回った取引の行方
Alice の取引が消えたのは、Anvil の実装の振る舞いです。Anvil v1.7.1 のブロックを作る処理は、mempool の取引を順に見て、ブロックの gas が足りなければ取引を飛ばし、そのまま mempool に残します。gas が足りて取引を検証した時に失敗すれば、無効な取引として記録し、ブロックを作った後に mempool から取り除きます。Anvil は受け付ける時にもその時の base fee と比べるので、Bob の取引は最初から拒否されました。
満杯の間の Alice は、受け付けた後に base fee が上限を超え、ブロックの gas が足りずに飛ばされ、mempool に残っていました。ブロック 16 で空きができて検証された時には、maxFeePerGas が base fee を下回っていたので、無効として取り除かれました。
一方で、go-ethereum(geth)v1.17.10 の mempool は、受け付ける時に、ノードが決める tip の最低額は比べますが、base fee とは比べません。base fee に届かない取引は、ブロックを組み立てる時に base fee で絞り込んで外すだけで、絞り込みは取り出した一覧に対して行います。mempool が溢れて追い出されない限り、base fee が上限を下回るまで下がれば、その取引は改めてブロックの候補になります。

maxFeePerGas が base fee を下回った取引の、Anvil と geth での扱い
どちらのノードも、その取引をブロックに入れない点は同じです。違うのは、入れられない取引をその後も持ち続けるかどうかです。
base fee を超える上限を書いた取引しかブロックに入れないことは、全ノードが守るプロトコルの規則です。それに対して、上限に届かない取引を受け付けるか、置いておくか、消すかは、mempool のノートで説明した、ノードごとの方針(policy)です。送った取引がしばらく入らない時、待てば入るのか、送り直すべきなのかは、取引を受け取ったノードの実装で変わります。
送り直す時は、同じ nonce(送り主ごとの通し番号)で上限を上げた取引を送り、前の取引を置き換えます。geth の既定では、置き換えに元の取引より 10% 以上高い額が必要です(PriceBump: 10)。
利点
- 同じブロックの取引は同じ base fee を払い、他人の入札を読んで額を当てる必要が減る
- base fee の変化は 1 ブロックで最大 12.5% なので、数ブロック先までの上限を見積もれる
- 一時的な混雑は、ブロックを target の 2 倍まで伸ばして吸収できる
- base fee が焼却されるので、提案者には base fee を吊り上げる動機が無い
欠点
EIP-1559 は、混雑の値段を前のブロックの使用量からプロトコルが決めます。その代わりに、次の制約があります。
- base fee が需要に追いつくまでの数ブロックは、tip の競争に戻る
- 書いた上限を base fee が超えると取引は入らず、ノードによっては mempool から消えて送り直しが要る
- ノードは、target の 2 倍の大きさのブロックが一時的に来ても処理できるように備える必要がある
- 焼却する量は利用量で決まり、ETH の供給量を固定できなくなる
最後の 2 つは、EIP の Security Considerations が挙げているものです。
EIP-1559 の効果が小さくなりやすいケース
- 需要が上限を長く上回り、満杯のブロックが続く時
- 数ブロックで終わる急な混雑で、base fee が上がりきる前に収まる時
- 取引のブロックの中での並び順に価値がある時
満杯のブロックが続く間は、実験の Alice と Carol のように、入る取引を決めるのは tip です。また、EIP-1559 が決めるのはブロックに入る額で、ブロックの中の並び順ではありません。並び順を争う取引では、tip や、ブロックを組み立てる者への支払いで順番が決まります。この話は MEV のノートで扱っています。