今北産業
- requireでエラーが指定できるようになった
- カスタムエラーのガスコスト最適化
- コンパイラ高速化
などなど
詳細
requireの仕様変更
今まではカスタムエラーを使う時、if文とセットでやっていたことが多かったが、それをrequireでスッキリ記述することができるようになった。
話は変わるが、requireの「第一引数がtrueならば続行」という仕様、逆の方が違和感ない気がするのは私だけだろうか。
<今まで>
solidityerror InsufficientBalance(uint256 available, uint256 required); // This will only compile via IR contract TestToken { mapping(address => uint) balance; function transferWithRequireError(address to, uint256 amount) public { // 今まではこんな感じ if(balance[msg.sender] < amount){ revert InsufficientBalance(balance[msg.sender], amount) } balance[msg.sender] -= amount; balance[to] += amount; } // ... }
<0.8.26以降>
solidityerror InsufficientBalance(uint256 available, uint256 required); // This will only compile via IR contract TestToken { mapping(address => uint) balance; function transferWithRequireError(address to, uint256 amount) public { // ここ!!!!!!!!!!! require( balance[msg.sender] >= amount, // この部分!!!!!!!!!! InsufficientBalance(balance[msg.sender], amount) ); balance[msg.sender] -= amount; balance[to] += amount; } // ... }
カスタムエラーガスコスト削減
例えば、こんな感じの引数を持たないカスタムエラーを利用する場合、デプロイ時のガス代が少なくなった
solidityerror ForceFailure(); contract FailureForcer { function fail() external pure { revert ForceFailure(); } }
コンパイラの高速化
Yulオプティマイザのシーケンス(*)が更新され、パフォーマンスが向上した。
最適化ステップを複数回繰り返すループを不要と判断し除去することにより、コンパイル時間を大幅に短縮することに成功したらしい。
例えばUniswapの場合、コンパイル時間が半分になったらしいので、大量のコード量を保持する大きなプロダクトであればあるほど、効果を感じるかもしれない。
(*):Yul言語で書かれたコードを最適化するための一連の手順。YulはSolidityの中間表現で、低レベルの最適化が可能。
所感
0.8.25からデフォルトEVMがCancunになってるはずなので、Ethereum mainnet以外で利用したい場合はコンパイル設定の変更が必要なので、お気をつけて。
参考リンク
Solidity 0.8.26 Release Announcement | Solidity Programming Language
Posted by Solidity Team on May 21, 2024
https://soliditylang.org/blog/2024/05/21/solidity-0.8.26-release-announcement/