# Solidity 0.8.24での変更点まとめ

> Solidityのバージョン0.8.24では以下の項目が変更されました。

- URL: https://cardene.dev/articles/a547db420f75a8
- 公開日: 2024-06-23
- 更新日: 2024-06-23
- トピック: Blockchain
- タグ: ブロックチェーン, solidity, ethereum, smartcontract

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください！

https://twitter.com/cardene777

https://chaldene.net/

https://qiita.com/cardene

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/EIP-2a03fa3ea33d43baa9ed82288f98d4a9

今回はSolidityのバージョン0.8.24での変更点をまとめていきます。

以下の公式のリリース記事をもとにまとめていきます。

https://soliditylang.org/blog/2024/01/26/solidity-0.8.24-release-announcement

# 変更点

Solidityのバージョン0.8.24では以下の項目が変更されました。

- **Cancun**ネットワークアップグレードサポート。
- Apple Siliconのサポート。

# Cancunネットワークアップグレードサポート

Ethereumの**Cancun**アップグレードにより、以下のEIPをサポートするようになりました。

- `EIP1153`: 一時的ストレージオペコード
- `EIP4788`: EVMのビーコンブロックルート
- `EIP4844`: シャードBLOBトランザクション
- `EIP7516`: `BLOBBASEFEE`オペコード
- `EIP5656`: `MCOY`メモリーコピーオペコード
- `EIP6780`: `SELFDESTRUCT`の機能削減

## `EIP1153`: 一時的ストレージオペコード

**Transient Storage**というのは、EVMに新たに追加されたデータストレージの一種です。
通常のストレージと同様にkey-value形式でデータを保存していますが、一時的にしかデータを保存せず、トランザクションの終了後に中身は空になります。
**Transient Storage**へのデータのアクセスは100ガスかかります。

Solidityで**Transient Storage**を使用するために、以下の2つのアセンブリ関数が導入されました。

- `tstore`
    - **Transient Storage**にデータを保存する。
- `tload`
    - **Transient Storage**からデータを読み取る。
 
## `EIP4788`: EVMのビーコンブロックルート

Ethereum上のアプリケーションが、信頼性の高い方法でEthereum上のデータを取得できる方法が提案されています。
各エグゼキューションブロック（トランザクション処理を行うブロック）に親（1つ前のブロック）ビーコンブロックのルート（ハッシュ値）が含まれるようになります。
これにより、より信頼性高くコントラクトからデータを取得することが可能になります。

:::message
コンセンサスブロックには以下の3つのルートがあります。

#### Beaconブロックルート
前のビーコンブロック全体のヘッダーのハッシュ。
このルートがエグゼキューションブロックに含まれます。

#### 状態ルート
現在のブロックのトランザクションが処理された後のEthereumネットワークのステートのハッシュ。

#### ボディルート
ブロックに含まれるすべてのトランザクションのハッシュ。
:::

これにより、例えば、現状限られた信頼できるオラクルノードから情報を取得していまが、**EIP4788**の導入により不要になります。
また、コントラクトが、Ethereumのメインネット上で直接最新データにアクセスできるようになります。

LidoやRocket Poolなどのリキッドステーキングプロトコルは、複数ユーザーのETHを集めてステーキングでき、**EIP4788**により、オラクルに依存せずに報酬をユーザーに配分できます。：
また、EigenlayerなどのEthereumのネットワークセキュリティを他のサービスにも適用するリステーキングアプリケーションでも、**EIP4788**はセキュリティと効率性を向上させます。

:::message
より詳しくは以下の記事を参考にしてください。
:::

https://consensys.io/blog/ethereum-evolved-dencun-upgrade-part-3-eip-4788

## `EIP4844`: シャードBLOBトランザクション

将来的に実装されるデータシャーディングの実装に向けて、新しいトランザクション形式である**blob**が導入されました。
このアップデートにより、ユーザーは大量のデータを安価に使用することができるようになります。
**blob**はコントラクトから直接アクセスすることはできません。
そのため、`blobhash`という命令が追加され、**blob**ハッシュデータにアクセスできるようになりました。

また、**blob**では新しいガス価格計算メカニズムが導入されています。
**blob**のbase feeには、**EIP7516**で提案されている`blobbasefee`という命令を使用してアクセスすることができます。

:::message
より詳しくは以下の記事を参考にしてください。
:::

https://zenn.dev/qope/articles/b8d09ae260f1aa

https://qiita.com/cardene/items/4966cf7f6691d7220367

https://zenn.dev/qope/articles/006401c8fe8069

## `EIP5656`: `MCOY`メモリーコピーオペコード

EVMでメモリ領域間のデータを効率的にコピーするための`mcopy`というオペコードを追加する提案です。
これまで、EVMにはメモリ領域間でデータを直接コピーする命令がなく、`mload`と`mstore`の2つの命令のループを使用していました。

:::message
`mload`はメモリからデータを読み取り、`mstore`はメモリにデータを書き込み命令で、この2つの組み合わせることでコピーと同じ処理が実行できます。
:::

提案されている新しいオペコードである`mcopy`はYulやインラインアセンブリで使用することができ、先ほどの`mload`と`mstore`の2つの命令を使用せずにデータをメモリ内にコピーすることができます。
ただ、コンパイル時にコードジェネレーターが生成するコピー処理にはまだ組み込まれていないため、将来的にガスコスト削減などの観点から組み込まれることが予定されています。

:::message
Solidityのコンパイラにはコードジェネレーターが組み込まれており、SolidityコードをEVMで実行可能なバイトコードに変換します。
:::

## `EIP6780`: `SELFDESTRUCT`の機能削減

その名の通り、コントラクトが自身を破壊する`SELFDESTRUCT`というオペコードの機能を大幅に制限する提案です。
`SELFDESTRUCT`が実行されると、コントラクト内のETHを指定されたアドレスに送金し、コントラクトのストレージとコードを削除します。
**EIP6780**導入後は以下のような機能に制限されます。

- コントラクト内のETHを指定されたアドレスに送金。
- コントラクトのストレージとコードを削除しない。
- ただし、コントラクトがデプロイされたトランザクション内で`SELFDESTRUCT`が実行された時のみ、コントラクトのストレージとコードを削除。

`SELFDESTRUCT`命令は**EIP6049**によりすでに非推奨になっていて、コンパイラは`SELFDESTRUCT`を使用していると警告を出すようになっていました。

# Apple Siliconのサポート

これまでのIntel専用のmacOSバイナリ（solc-macos）を、ARMベースのMac（Apple Silicon）でも動作するユニバーサルバイナリに置き換えます。

:::message
ユニバーサルバイナリとは、異なるハードウェアアーキテクチャを持つ複数のプラットフォームで動作することができる単一の実行可能ファイルのこと。
:::

これは、SolidityコンパイラがApple Siliconアーキテクチャでネイティブに動作するようにするためです。
これにより、ARMベースのMac（M1やM2チップを搭載したMac）で、Solidityコンパイラをネイティブに実行でき、コンパイラのパフォーマンスが向上して簡単に使用できるようになります。
また、もちろんIntelベースのMacでも同じバイナリを使用できます。

# その他の変更

その他の細かい修正については以下の記事を参考にしてください。

https://soliditylang.org/blog/2024/01/26/solidity-0.8.24-release-announcement

# 最後に

今回はSolidityのバージョン0.8.24の変更点をまとめました。

以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください！

https://twitter.com/cardene777

https://chaldene.net/

https://qiita.com/cardene

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/EIP-2a03fa3ea33d43baa9ed82288f98d4a9
