[EIP3198] 現在のブロックの基本手数料を直接取得できる提案を理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、EVM に新しい命令コード `BASEFEE` (`0x48`) を追加し、実行中のブロックの基本手数料を取得できるようにする提案をしている**EIP3198**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-3198

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

Ethereum Virtual Machine (EVM) に関連する命令コード（opcode）の追加について説明しています。
具体的には、`BASEFEE`（`0x48`として表される）という新しいopcodeを追加する提案です。
このopcodeは、EVMが実行中のブロックの基本手数料（base fee）の値を返します。

:::note info
Etheremのopecodeについては以下の記事を参考にしてください。
:::

https://zenn.dev/heku/books/aef33b86ded3c0

Ethereumのトランザクション料金（ガス料金）は、基本手数料とミニマムの`tip`料金に分かれており、基本手数料はネットワークの混雑状況に応じて変動します。
**EIP1559**というアップデートで基本手数料の概念が導入され、各ブロックごとに自動的に調整されるようになりました。
この基本手数料は、ブロックチェーンの混雑具合を反映しており、ブロックがより混雑している時は手数料が上がり、混雑していない時は下がります。

`BASEFEE` opcodeの追加により、スマートコントラクトは実行中のブロックの基本手数料を直接参照できるようになります。
これにより、スマートコントラクトはより柔軟にガス料金の戦略を立てることができるようになり、例えば、料金が一定の基準を超えた場合にのみ特定の機能を実行するといったことが可能になります。

この変更は、スマートコントラクトの開発者にとって有益な追加となります。
なぜなら、実行コストの見積もりがより正確になり、ガス料金の変動に対するより良い対応策を講じることができるからです。

# 動機

新しい`BASEFEE` opcodeの潜在的な利用例について説明しています。
このopcodeがスマートコントラクトに与える可能性のある改善点をいくつか挙げています。

### 報酬設定のためのスマートコントラクト
あるスマートコントラクトは、外部からの「**ポーク**」（特定のアクションやトランザクションのトリガー）を奨励するために報酬を設定する必要がある場合があります。
`BASEFEE + x` や `BASEFEE * (1 + x)` のように報酬を設定することで、市場の状況に関わらず常に「**十分な**」報酬を支払うことが保証されます。
ここで、`x`は追加のインセンティブを示します。
これにより、スマートコントラクトは市場条件の変動に強く、より信頼性の高い報酬メカニズムを持つことができます。

### ガス先物の実装
`BASEFEE`を使用すると、将来のガス価格に基づいた金融商品やコントラクトを作成することが可能になります。
これは、現在のガス価格の変動を利用したガストークンよりも正確で、市場の変動に基づいたより信頼性の高い先物コントラクトを可能にします。

### ステートチャネル、プラズマ、オプティロールズなどのセキュリティ向上
これらの技術は、フロードプルーフ（不正証明）に基づくソリューションであり、トランザクションの正当性を証明するためのチャレンジ期間が含まれています。
`BASEFEE`が高いことを検出した場合、自動的にチャレンジ期間を延長できるようにすることで、ネットワークが混雑しているときにもセキュリティを保持することができます。

これらの利用例は、`BASEFEE` opcodeがスマートコントラクトの機能性と効率性をどのように向上させるかを示しています。
特に、市場条件の変動に対する柔軟性と、不正行為防止メカニズムのセキュリティ向上において重要な役割を果たします。

# 仕様

Ethereum Virtual Machine (EVM) の新しい命令コード（opcode）である `BASEFEE` を追加することに関するものです。
ここでの `0x48` は、`BASEFEE` opcodeの識別子（16進数で表される）です。
このopcodeの主な目的は、EVMが実行中のブロックの基本手数料（base fee）の値を取得することです。

以下は、この新しいopcodeの使用方法とコストに関する具体的な情報を示しています。

| Op   | Input | Output | Cost |
|------|-------|--------|------|
| 0x48 | 0     | 1      | 2    |

- **Op**
    - `0x48` は、`BASEFEE` opcodeのコードです。
- **Input**
    - このopcodeは入力を必要としません（`0`を示しています）。
- **Output**
    - このopcodeは1つの値を出力します。
    - この値は、実行中のブロックの基本手数料です。
- **Cost**
    - このopcodeのガスコストは `G_base` として示されていますが、具体的な数値としては `2` が割り当てられています。
    - これは、この操作を実行するために必要なガスの量です。

この新しいopcodeの追加により、スマートコントラクトは実行中のブロックの基本手数料を直接取得できるようになり、ガス料金の戦略をより柔軟に計画することが可能になります。

# 補足

`BASEFEE` opcodeのガスコストに関する理由付けについて述べています。
Ethereumのトランザクションでは、ガス（計算資源）の消費が必要ですが、その量は実行する操作の複雑さによって異なります。
`BASEFEE` opcodeが行うことは、現在のブロックの基本手数料を取得することですが、この基本手数料の値はトランザクションを処理する前に既にネットワークによって計算され、利用可能になっています。

このため、`BASEFEE` opcodeを実行するには追加の複雑な計算や読み書き操作は必要ありません。
その結果、この操作はシンプルであり、比較的低いガスコストである `G_base` が適用されます。
この文脈で言及されている `G_base` は、EVMにおける最も基本的な操作に割り当てられる標準的なガスコストを指します。
`BASEFEE` opcodeのガスコストが `2` と設定されているのは、この操作がシンプルで追加のリソースをほとんど必要としないためです。

`BASEFEE` opcodeは既に利用可能な情報を取得するだけであるため、低いガスコストで実行できるというわけです。

# 互換性

このオペコードには後方互換性の問題はありません。

# セキュリティ

`BASEFEE` opcodeを使用した簡単な実行例を示しています。
現在のブロックの基本手数料が`7 wei`であると仮定した場合のシナリオです。

`Bytecode: 0x4800` は、`BASEFEE` opcode（`0x48`）に続いて `STOP` opcode（`0x00`）が来るバイトコードのシーケンスです。
`BASEFEE` はスタックに現在のブロックの基本手数料をプッシュし、`STOP` はプログラムの実行を停止します。

実行の詳細は以下の表にまとめられています。

| Pc | Op      | Cost | Stack | RStack |
|----|---------|------|-------|--------|
| 0  | BASEFEE | 2    | []    | []     |
| 1  | STOP    | 0    | [7]   | []     |

- **Pc**
    - プログラムカウンターで、現在実行中の命令の位置を示します。
- **Op**
    - 実行中のopcodeを示します。
- **Cost**
    - その操作のガスコストです。
    - `BASEFEE` のコストは`2`、`STOP`のコストは`0`です。
- **Stack**
    - opcode実行後のスタックの状態です。
    - `BASEFEE`が実行された後、スタックには基本手数料の値「`7`」がプッシュされます。
- **RStack**
    - 戻り値スタックですが、このシナリオでは使用されていません。

最後に、`Output: 0x` は実行後の出力を示しており、このケースでは特に何も出力されていません。
`Consumed gas: 2` はこのシンプルなプログラムの実行に消費されたガスの総量です。
この例は、`BASEFEE` opcodeがスタックに基本手数料をプッシュする方法と、その操作のシンプルさ（低コスト）を示しています。

# セキュリティ

`BASEFEE` opcodeがブロックの基本手数料（base fee）の値を取得する時のセキュリティ面について説明しています。
基本手数料の値はブロックヘッダーに公開されており、誰でもアクセス可能な情報です。
これは、ブロックチェーンの透明性とオープンネスの原則に基づいています。
したがって、`BASEFEE` opcodeを使用してこの値を取得することは、セキュリティ上の問題を引き起こすことはないとされています。

ブロックチェーンにおける「**センシティブな情報**」とは、個人の秘密鍵やトランザクションのプライベートデータなど、不正にアクセスされると悪用される可能性のある情報を指します。
しかし、基本手数料はネットワークの混雑状態を示す指標であり、ブロックごとに公に設定されて変更されます。
この情報は、ネットワークの使用状況を理解するために必要であり、特定のユーザーやトランザクションに関する秘密情報を含んでいません。

そのため、`BASEFEE` opcodeが基本手数料の値を取得することによるセキュリティ上のリスクはないと考えられます。
このopcodeはスマートコントラクトが現在の市場条件に適応するための情報を提供するだけであり、ネットワークのセキュリティや個々のユーザーのプライバシーに影響を与えるものではありません。

# 引用

Abdelhamid Bakhta (@abdelhamidbakhta), Vitalik Buterin (@vbuterin), "EIP-3198: BASEFEE opcode," Ethereum Improvement Proposals, no. 3198, January 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3198.

# 最後に

今回は「」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4