⚒️

Solidity 0.8.27での変更点まとめ

2024/09/05に公開

はじめに

初めまして。
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/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

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

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

https://soliditylang.org/blog/2024/09/04/solidity-0.8.27-release-announcement/

変更点

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

  • requireでのカスタムエラーサポート
  • IRキャッシュの最適化
  • その他

requireでのカスタムエラーサポート

Solidityのバージョン0.8.26でrequireでカスタムエラーのサポートはされていました。

https://zenn.dev/cryptogames/articles/fc4392ce6c27ef#requireでのcustomエラーサポート

しかし、IRパイプライン(Yul経由でのコンパイル)でのみ機能の使用ができました。
Version 0.8.27からはYul経由でなくてもこの機能を使用できるようになりました。

IRキャッシュの最適化

IR(中間表現)パイプラインのパフォーマンスを改善します。

Solidityでコントラクトをコンパイルするとき、別のコントラクトのバイトコードに依存している場合、そのバイトコードを読み込む必要があります。
例えば、new演算子を使って新しいコントラクトをデプロイする時や、.runtimeCode.creationCodeを参照する時です。

これまでのIRパイプラインでは、この依存するバイトコードを早い段階(Yulコード生成時)で組み込んでいました。
これにより、すべてのコードが一体化され、外部リンクの必要がなくなるというメリットがありましたが、依存するコントラクトが何度も参照されるたびに、そのコントラクトが再度最適化されてしまうという問題がありました。
同じコントラクトが何度も最適化プロセスを繰り返し、コンパイル時間が大幅に増えてしまいます。

この問題に対して、Version 0.8.27では「キャッシュ機能」を導入し、依存するコントラクトが最初に最適化された結果を再利用できるようにしています。
これにより、同じコントラクトが複数回最適化されるのを避け、パフォーマンスの向上につながります。

具体的には、Yulオブジェクトレベルでのキャッシュが導入され、Yulオブジェクトが最適化された時にその結果を次回以降のコンパイルで使いまわせるようになっています。

以下のように、このキャッシュ機能により、特定のプロジェクトでは大きなスピードアップが実現されました。

Project Effect
OpenZeppelin 影響なし(最適化に依存する部分が少ないため)
Uniswap v4 42%の速度向上
Eigenlayer 44%の速度向上

その他

テストでのnewコスト削減

newを使用して新しいコントラクトをデプロイすることはテストコードでもよくあります。
しかし、依存するコントラクトが何度も最適化されてしまい、コンパイルが遅くなることがありました。
Version 0.8.28ではキャッシュ機能を導入することで、依存するコントラクトの最適化結果を再利用してコンパイル速度を改善しています。

Transient Storageサポート

新しい一時的なストレージ変数です。
EthereumのアップグレードであるDencunアップデートで導入される予定の機能です。

Version 0.8.27では文法のサポートがされています。
ただし、機能自体はまだサポートされていないため、今後のバージョンアップで対応されるようです。

以下の記事でわかりやすくまとめられています。

https://zenn.dev/0xywzx/articles/daa00b8827bbd0

--strict-assembly--yulオプションの違い

Solidityでは、Yulという中間言語を使ってコントラクトを最適化する時--yulオプションが使われていました。
今回のリリースで、--yulオプションで使われていた実験的な型付きYulダイアレクトが廃止され、今後は--strict-assemblyオプションが一般的なYulコンパイルに使用されます。
Yul自体のサポートは引き続き維持されます。

その他の変更

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

https://soliditylang.org/blog/2024/09/04/solidity-0.8.27-release-announcement/

最後に

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

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

https://twitter.com/cardene777

https://chaldene.net/

https://qiita.com/cardene

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

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

CryptoGames

Discussion