(この記事は2024年1月の情報をもとに記述しています)
新しいコンパイラがリリースされた
最新のSolidityコンパイラであるv0.8.24がリリースされた。
なかなかいい機能が出揃ってはいるが、Cancunハードフォーク後に有効になるので、先走らないように注意。
Cancunをサポートするのは、Shanghaiの時と同じく当面はEthereum mainnetとtaikoだけなのかな。
ちょっと時間が経てばScrollあたりも追随してくれるんやけどな。
話変わるけど、Polygon POSのpush0対応はよ。
機能まとめ
EIP-1153
簡単にいうと、新しいデータ記録方法が使えるようになる。イチオシ。
メモリ感覚で使え、トランザクションが終了すれば揮発するが、その代わりガス代が安く済む。
利用するためにはアセンブリコードを記述する必要がある。
例えば、今まではストレージにロックフラグを保持して、リエントランシー攻撃を防いでいたが、この機能を使うことによりそのコストを抑えることができる。
soliditycontract Generosity { mapping(address => bool) sentGifts; modifier nonreentrant { assembly { if tload(0) { revert(0, 0) } tstore(0, 1) } _; // Unlocks the guard, making the pattern composable. // After the function exits, it can be called again, even in the same transaction. assembly { tstore(0, 0) } } function claimGift() nonreentrant public { require(address(this).balance >= 1 ether); require(!sentGifts[msg.sender]); (bool success, ) = msg.sender.call{value: 1 ether}(""); require(success); // In a reentrant function, doing this last would open up the vulnerability sentGifts[msg.sender] = false; } }
claimGift関数を実行する際、nonreentrantが実行される。その時にトランザクション終了まで利用できる、コストの低い記録領域を利用し、ロックフラグを管理する。
いままでこの方法はコストの高いストーレージ直接書き込みを利用していたため、敬遠されていた。
EIP-4844
詳しくはこのブログ(proto-danksharding(EIP-4844)の概要)をみてもらった方が確実だと思う。
それらに関連するYul組み込み関数(blobhash,basefee,blobbasefee)と新たなグローバル変数(block.blobbasefee)が利用可能になる。
EIP-4788
ビーコンチェーンブロックルートなるものを扱えるようにするEIP、それができると、例えばステーキング残高などを証明することができるようになる。
EIP-6780
今まではselfdestructすると、基軸通貨を退避させ、ストレージやコードをクリアしていたが、今回からストレージやコードをクリアすることがなくなった。(同一トランザクションだった場合は例外)
これに関してはコンパイラ関係なく、ネットワーク全体の仕様変更になるらしい。
そもそもデプロイしたコントラクトをdeleteするというのが、データの変更という位置付けになり、ブロックチェーンの前提に反する的なこともあるだろうし、以前からこの仕様とcreate2を使った攻撃
(適当なコントラクトをcreate2使ってデプロイ→selfdestruct、その後釜に悪意のあるコントラクトを同じくcreate2を使ってデプロイ、だったはず。)
が流行っていた印象があるが、その対策もあるだろうなと考慮。
そもそもselfdestruct自体が非推奨なので、もし使ってるプロダクトがあれば、慎重になれという話かな。
EIP-5656
メモリデータのコピーの最適化を目的としたMCOPYというオペコードの導入を目的としている。
高速化、およびガス代対策として期待できそう。
Mac OS専用コンパイラ
M1、およびM1 MaxはApple Siliconというものにカテゴライズされるらしく、どうも他のCPUとSolidityコンパイラの勝手が違うらしい。
このリリースから専用のバイナリが誕生するらしいのだが、大丈夫かな。
環境変わったらバイトコード変わるとかなったらややこしいな。そんなことなったらverifyとかで大惨事になるやろうから、そこまで変なことにはならんと思うが。
所感
多数のEVMを使えるチェーンは多数あるものの、それぞれに特徴があるので、マルチチェーン展開を考慮した場合、無難な0.8.19で止めておく、そんなことが多い今日この頃です。
関連リンク
proto-danksharding(EIP-4844)の概要
proto-danksharding (EIP-4844)とは、Ethereumにshard blob transactionと呼ばれる新しいトランザクション形式を追加する提案です。shard blob transactionはblobと呼ばれる新しい形式のデータを持っているトランザクションで、大きなデータをEthereumに安価に公開するために利用できます。
https://zenn.dev/qope/articles/b8d09ae260f1aa
EIP-6780: SELFDESTRUCT only in same transaction
SELFDESTRUCT will recover all funds to the target but not delete the account, except when called in the same transaction as creation
https://eips.ethereum.org/EIPS/eip-6780
EIP-6049: Deprecate SELFDESTRUCT
Deprecate SELFDESTRUCT by discouraging its use and warning about a potential future behavior change.
https://eips.ethereum.org/EIPS/eip-6049
EIP-4788: Beacon block root in the EVM
Expose beacon chain roots in the EVM
https://eips.ethereum.org/EIPS/eip-4788
Transient Storage Opcodes in Solidity 0.8.24 | Solidity Programming Language
Posted by Solidity Team on January 26, 2024
https://soliditylang.org/blog/2024/01/26/transient-storage/
EIP-1153: Transient storage opcodes
Add opcodes for manipulating state that behaves identically to storage but is discarded after every transaction
https://eips.ethereum.org/EIPS/eip-1153
Solidity 0.8.24 Release Announcement | Solidity Programming Language
Posted by Solidity Team on January 26, 2024
https://soliditylang.org/blog/2024/01/26/solidity-0.8.24-release-announcement/