# Solidity 0.8.25での変更点まとめ

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

- URL: https://cardene.dev/articles/b2d105a995c297
- 公開日: 2024-06-24
- 更新日: 2024-06-24
- トピック: 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.25での変更点をまとめていきます。

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

https://soliditylang.org/blog/2024/03/14/solidity-0.8.25-release-announcement/

# 変更点

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

- コンパイラのデフォルトが**cancun**に変更。
- `mcopy`オペコードのコードジェネレーター対応。
- `tstore`の警告回数の変更。

# コンパイラのデフォルトがcancunに変更

EthereumのDencunアップグレードにより、新しいEVMバージョンである**Cancun**が導入されました。
これにより、Solidityコンパイラのデフォルトのバージョンが、新しいバージョンである**Cancun**をベースにコード生成するように変更されました。

# `mcopy`オペコードのコードジェネレーター対応

Solidityのバージョン0.8.24にて、`mcopy`というオペコードが追加されました。
このオペコードはYulやインラインラインで使用できるオペコードです。

:::message
Yulやインラインアセンプリについては、以下の記事にを参考にしてください。
:::

https://zenn.dev/heku/books/c28469224e315f/viewer/bce7f7

バージョン0.8.25では、コードジェネレーターが`mload`と`mstore`のループを`mcopy`置き換えるようになりました。
これにより、効率的なメモリーコピーが可能になります。

:::message
### `mload`

メモリから32バイト（256ビット）のデータを読み込む命令です。
指定されたメモリアドレスからデータを取得します。

```solidity
uint256 value = mload(add(memPtr, offset));
```

上記では、`memPtr`というメモリアドレスに`offset`を加えた位置から32バイトのデータを読み込んで`value`に格納しています。

### `mstore`

メモリに32バイト（256ビット）のデータを書き込む命令です。
指定されたメモリアドレスにデータを格納します。

```solidity
mstore(add(memPtr, offset), value);
```

上記では、`memPtr`というメモリアドレスに`offset`を加えた位置に`value`を32バイトのデータとして書き込みます。

### `mcopy`

メモリの一部から別のメモリの一部にデータをコピーする命令です。
連続したメモリ領域に対して効率的にデータを移動させることができます。

```solidity
mcopy(destPtr, srcPtr, length);
```

上記では、`srcPtr`から`destPtr`へlengthバイト分のデータをコピーしています。

このように、`mload`と`mstore`の2つの命令を使用してコピーするよりも、`mcopy`命令を使用した方が、1つの命令で高速かつ低コストでコピーを実行できます。
:::

活用される場面としては、`abi.encode()`や`abi.decode()`があげられます。
`abi.encode()`はデータ型をバイト配列に変換し、`abi.decode()`はバイト配列から元のデータ型に戻す処理を実行します。
この変換の時に大量のデータがメモリにコピーされるため、`mcopy`を使用することで効率よく実行できます。

一方、ガスコストを削減はしていますが、そこまでの効果はないようです。
理由としては、コンパイラ自体がメモリ内での不要なデータのコピーを避けるように設計されているためです。
また、メモリ以外の`calldata`やストレージ、`returndata`などには、この`mcopy`を使用することはできません。

# `tstore`の警告回数の変更

Transient Storageという一時的なデータ保存用ストレージがあります。
これはトランザクションが終了するまでデータを保持するストレージで、`tstore`や`tload`というオペコードを使用してアクセスします。
ただ、Transient Storageの誤った使用は予期しない動作やバグの原因になります。
そのため、Solidityバージョン0.8.24から、`tstore`オペコードが使用されていると常に警告が表示されるようになっていました。
しかし、同じ警告が繰り返し表示されるのは煩わしいため、コンパイルごとに1回だけ表示されるように変更されました。

# その他の変更

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

https://soliditylang.org/blog/2024/03/14/solidity-0.8.25-release-announcement/

# 最後に

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

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

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
