logo

Solidity 0.8.24が出たよ

〜SolidityはいつになったらV1になるのだろう〜
profile photo
TaniguchiAkira
(この記事は2024年1月の情報をもとに記述しています)

新しいコンパイラがリリースされた

最新のSolidityコンパイラであるv0.8.24がリリースされた。
なかなかいい機能が出揃ってはいるが、Cancunハードフォーク後に有効になるので、先走らないように注意。
Cancunをサポートするのは、Shanghaiの時と同じく当面はEthereum mainnetとtaikoだけなのかな。
ちょっと時間が経てばScrollあたりも追随してくれるんやけどな。
話変わるけど、Polygon POSのpush0対応はよ。

機能まとめ

EIP-1153

簡単にいうと、新しいデータ記録方法が使えるようになる。イチオシ。
メモリ感覚で使え、トランザクションが終了すれば揮発するが、その代わりガス代が安く済む。
利用するためにはアセンブリコードを記述する必要がある。
例えば、今まではストレージにロックフラグを保持して、リエントランシー攻撃を防いでいたが、この機能を使うことによりそのコストを抑えることができる。
solidity
contract 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に安価に公開するために利用できます。
proto-danksharding(EIP-4844)の概要
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
EIP-6049: Deprecate SELFDESTRUCT
Deprecate SELFDESTRUCT by discouraging its use and warning about a potential future behavior change.
EIP-4788: Beacon block root in the EVM
Expose beacon chain roots in the EVM
Transient Storage Opcodes in Solidity 0.8.24 | Solidity Programming Language
Posted by Solidity Team on January 26, 2024
Transient Storage Opcodes in Solidity 0.8.24 | Solidity Programming Language
EIP-1153: Transient storage opcodes
Add opcodes for manipulating state that behaves identically to storage but is discarded after every transaction
Solidity 0.8.24 Release Announcement | Solidity Programming Language
Posted by Solidity Team on January 26, 2024
Solidity 0.8.24 Release Announcement | Solidity Programming Language
github.com/ethereum/solidity/releases/tag/v0.8.24
Related posts
post image
Solidity
Optimism
Arbitrum
L2
Wormhole
Layer0
オレオレインターフェースからERC7802へ
ユニバーサル規格は大事
post image
Solidityも早く1.0.0出て欲しい
post image
Aptos Japanがないのはなぜなのか
Powered by Notaku