🛠️

Solidity 0.8.29での変更点まとめ

に公開

はじめに

初めまして。
『DApps開発入門』という本や色々記事を書いているかるでねです。

https://amzn.asia/d/gxvJ0Pw

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

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.29での変更点をまとめていきます。

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

https://soliditylang.org/blog/2025/03/12/solidity-0.8.29-release-announcement/

変更点

  • EOFのサポート
  • カスタムストレージレイアウトのサポート
  • ethdebug の初期サポート

EOFのサポート

Solidity 0.8.29で、新しいEVM Object Format(EOF)の実験的なサポートがされています。
ただし、EOFを使うにはEVMバージョンが「Osaka」を指定する必要があり、このEVMバージョンはまだメインネットやテストネットには導入されていません。

EOF対応のコンパイラはまだ開発途中で一部の機能が未実装ですが、Solidityのコードをコンパイルするには十分な状態です。
今後、RJUMPVEXCHANGE などの新しいオペコードを活用することで、さらに効率の良いコードを生成できるようになる予定です。

ただし、EOFでは従来の機能のいくつかが廃止されているため、既存のコードをそのままコンパイルできない場合があります。
例えば、gasleft()<address>.code のようなガスやコードの参照ができなくなります。
また、new 演算子によるコントラクト作成のルールも変更され、デフォルトで salt を指定する必要があります(デフォルト値は0)。

EOF対応のコンパイルは、IR(中間表現)を経由する必要があり、最適化オプションも有効にする必要があります。
現状では低レベルの最適化がまだ実装されていないため、コードサイズが増えることがあります。
この部分は今後のバージョンで改善予定です。

試してみる場合は、以下のようにオプションを指定してください。

solc --experimental-eof-version 1 --evm-version osaka

または、Standard JSONの設定で以下のように指定してください。

"settings": {
  "eofVersion": 1,
  "evmVersion": "osaka"
}

カスタムストレージレイアウトのサポート

Solidity 0.8.29では、コントラクトのストレージ変数を任意の位置に配置できる新しい構文が導入されました。

この機能は以前から実装の要望があったものの、さまざまなユースケースや競合要件があり実装が遅れていました。
しかし、Pectraアップグレードで EIP7702(EOAにコードを設定する提案) が導入されることになり、Account Abstractionに注目が再度向けられているため優先的に対応することにしたようです。

https://qiita.com/cardene/items/13a828c97786aab953e4

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58/HaPTTeXZeXRG3K5JfXesmKet9eKTbcFUixW6IaMvt4c

現時点では、機能は制限されており、指定できるのは「決まった数値(リテラル)」だけであり、変数や計算式を使って動的に変更することはできません。
さらに、この設定は継承している全てのコントラクトに適用されるため、親コントラクトと子コントラクトで異なるストレージ位置を指定することはできません。

使い方としては、以下のようにコントラクト全体のストレージの開始位置を layout atで指定しています(2**255 - 42)。
これにより、uint x のストレージスロットは 2**255 - 42 から始まります。
また、このコントラクトを継承した全てのコントラクトでもxは同じ位置を使うことになります。

contract C layout at 2**255 - 42 {
    uint x;
}

今後のアップデートでは、定数の使用や、ERC7201(ネームスペース付きストレージレイアウト) のようなレイアウトのサポートが追加される予定です。

https://qiita.com/cardene/items/64ef137f8bd096681713

最終的にはより自由度の高い設定が可能になる可能性がありますが、まずは必要な機能から順次追加する方針とのことです。

詳細については、カスタムストレージレイアウトのドキュメントを参照してください。

https://docs.soliditylang.org/en/v0.8.29/contracts.html#custom-storage-layout

ethdebug の初期サポート

Solidity 0.8.29では、新しいデバッグフォーマット「ethdebug」の実験的なサポートも追加されています。

ethdebug はスマートコントラクト向けのデバッグ情報フォーマットで現在仕様は開発中です。ethdebug の開発状況を知りたい場合は、GitHubのethdebugリポジトリMatrixチャンネル をフォローすることで最新情報を取得できます。
また、毎月第2・第4木曜日のベルリン時間17:00に定例ミーティングが開催されています。

現時点では、ethdebug に対応するコンパイラの初期バージョンがリリースされており、命令の情報やソースコードの範囲 を出力できます。
ただし、最適化なしの IR(中間表現)経由のコンパイルのみ対応しており多くの機能がまだ実装されていません。

試してみる場合は、以下のオプションをつけてコンパイルしてください。

solc --ethdebug --via-ir

または、Standard JSON の設定で以下のように指定してください。

"settings": {
  "viaIR": true,
  "outputSelection": {
    "*": {
      "evm.bytecode.ethdebug": ["*"],
      "evm.deployedBytecode.ethdebug": ["*"]
    }
  }
}

ワイルドカード * では ethdebug の出力は有効にならないので上記のように明示的に設定する必要があります。

今後のアップデートでさらに機能が追加される予定のようです。

Solidity 0.8.29の変更点(フルチェンジログ)

新機能

  • コントラクトのストレージ位置を自由に指定可能に
    • layout at を使って、ストレージ変数の開始位置を指定できるように。

コンパイラの新機能

  • エラーメッセージの改善

    • これまでコード生成時に発生したエラーの詳細な位置が分からない場合があったが、エラーの発生元(コントラクトの場所)を表示するように。
  • EVM: Osakaバージョンのサポート

    • 新しいEVMバージョン「Osaka」に対応(EOFを試すためのEVM)。
  • EVMアセンブリのオペコードベースの最適化を有効化可能に

    • EVMバイトコードの効率をさらに向上させることが可能に。
  • EOF(EVM Object Format)の実験的バックエンド

    • EOFを使ったコンパイルが可能に(ただし、IR経由かつ最適化有効時のみ)。
  • SMTChecker(形式検証ツール)の改善

    • block.blobbasefeeblobhash のサポートを追加(EIP4844の一部)。
    • --model-checker-print-query--model-checker-solvers smtlib2 なしで使えるように。
    • Z3(SMTソルバー)がビルド時ではなく実行時の依存ライブラリにた。
  • Yulパーサー(低レベルIR)

    • 予約語と名前がかぶっていてもコンパイルエラーにならないように変更(警告扱いに)。

バグ修正

  • CLI(コマンドライン)

    • StackTooDeep(変数のネストが深すぎるエラー)が適切なエラーとして表示されるように。
  • エラーメッセージの改善

    • ソースファイルの名前が空の場合でもエラーの位置を正しく表示。
  • コンパイラ内部エラーの修正

    • IR ASTの出力を要求したときに発生するエラーを修正(特にinterfaceやabstract関連)。
  • メタデータ関連の修正

    • カスタムクリーンアップ処理が適用されない問題を修正(最適化設定がデフォルトのとき)。
  • SMTCheckerのバグ修正(多数)

    • オーバーフロー計算時のエラーを修正。
    • 異なるコントラクト間での安全性チェックの不具合を修正。
    • クロスコントラクトのgetter呼び出しでの解析エラーを修正。
    • 文字列リテラルを fixed bytes に変換するときの問題を修正。
    • 不要な括弧がある外部呼び出しの解析ミスを修正。
    • 固定サイズバイト配列を文字列リテラルで初期化するときのエラーを修正。
    • 配列のストア・セレクト操作を含む不変条件の解析エラーを修正。
    • ecrecover のプリコンパイル呼び出しで文字列リテラルのエンコードミスを修正。
  • JSONインターフェース

    • generatedSourcessourceMap が明示的にリクエストされていないのに内部で生成されていた問題を修正。
  • 型チェックの修正

    • ストレージサイズ計算時に誤って一時変数(transient storage variables)を含めるバグを修正。
    • これにより、不必要なコンパイルエラーが発生する問題が解決。
  • Yul関連の修正

    • コード生成時のエラーを適切に報告。
    • デバッグ時にオプション値を誤って参照する問題を修正(Yul最適化のバグ修正)。

ビルドシステムの変更

  • Linuxのリリースビルドが完全に静的リンクに

    • これにより、glibc に依存しなくなった。
  • C++17 → C++20に移行

    • コンパイラのコードベースがC++20をターゲットにするよう変更。
  • Solc-JS(JavaScript版のSolidityコンパイラ)

    • Node.js v12以上が必須に(古いバージョンでは動作しなくなる)。

最後に

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

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

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

Discussion