はじめに
残暑が激しい中、そんなことお構いなしにSolidityは新しい機能をリリースしてきます、皆様いかがお過ごしでしょうか。
現状使えないものもまだまだ多くはありますが、その辺り含め解説していきます。
今北産業
- レガシーパイプラインでのrequire(bool, <custom error>)が利用可能に
- 一時ストレージ変数のパーサーサポート導入(まだ使えないけど)
- コンパイル速度改善
詳細
新たなrequireのサポート
レガシーパイプライン(*1)でのカスタムエラーをサポートするrequire文の導入される。
今まで、IR(Intermediate Representation)パイプライン(*2)しかサポートされていなかったrequire(bool, <custom error>)の構文がレガシーパイプラインでも利用可能になった。
Hardhatで利用する場合、新機能を利用するフラグを設定しなければ行けないので、結構微妙な位置付けのこの機能、Foundryってこういうところでも使いやすいなと思う。
(*1)Solidityコンパイラの従来のコンパイル方式で、SolidityソースコードをEVMバイトコードに直接変換する方法。将来的にはIRパイプラインに置換される。長年私用されてきたため、安定性は高いものの、一部を除いて、IRに比べコンパイル時間が低速になるなどのデメリットが存在する。
(*2)SolidityをまずYul(中間言語)に変換し、そこからEVMバイトコードを生成する方法。
コンパイラの最適化
依存関係のあるコントラクトの再最適化問題に対応した。
soliditycontract A { // Aのコード } contract B { function deployA() public { new A(); } }
Bをコンパイルする際に、Aのコードも含めて最適化が行われるが、今まで、毎回Aの最適化が実行され、コンパイル時間の速度低下を招いてきた。それらが今回のバージョンからIRのキャッシング機能が働き、再利用されることにより、速度低下の改善につながった。
一時ストレージ変数
トランザクション内でのみ利用できるtransient変数が利用できるようになった。
soliditycontract Example { transient uint256 tempValue; function someFunction() public { tempValue = 42; // この値はトランザクション内でのみ存在 } }
ただこれはコンパイラが対応しただけで、現状意図した動作はせず、期待されているガス代の低下という恩恵も受けれない。
実際の機能は今後のバージョンに期待。
その他もろもろ
- 非推奨の型付きYul方言のサポート終了
- EVMバージョン"Prague"のサポート
- SMTCheckerの改善
- 細かなバグ、コンパイラ最適化などの修正
所感
まぁ新しい機能を使いたければ、その下準備としてどうぞ、という感じではある。
俺たちの戦いはこれからだ!
参考リンク
Solidity on Twitter / X
Solidity 0.8.27 is out! 🎉This release brings support for custom errors in `require` to the legacy pipeline, optimizer improvements such as caching of optimized IR that will speed up compilation via IR, several bugfixes, and more!📝Blog: https://t.co/UMT5Kk83Kd💾GitHub:… pic.twitter.com/xATANvk8vp— Solidity (@solidity_lang) September 4, 2024
https://x.com/solidity_lang/status/1831357328018583761
Solidity 0.8.27 Release Announcement | Solidity Programming Language
Posted by Solidity Team on September 4, 2024
https://soliditylang.org/blog/2024/09/04/solidity-0.8.27-release-announcement/