⛏️

Solidity 0.8.24での変更点まとめ

2024/06/23に公開

はじめに

初めまして。
CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です!
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームはクリプトスペルズというブロックチェーンゲームです。

https://cryptospells.jp/

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

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

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

https://soliditylang.org/blog/2024/01/26/solidity-0.8.24-release-announcement

変更点

Solidityのバージョン0.8.24では以下の項目が変更されました。

  • Cancunネットワークアップグレードサポート。
  • Apple Siliconのサポート。

Cancunネットワークアップグレードサポート

EthereumのCancunアップグレードにより、以下のEIPをサポートするようになりました。

  • EIP1153: 一時的ストレージオペコード
  • EIP4788: EVMのビーコンブロックルート
  • EIP4844: シャードBLOBトランザクション
  • EIP7516: BLOBBASEFEEオペコード
  • EIP5656: MCOYメモリーコピーオペコード
  • EIP6780: SELFDESTRUCTの機能削減

EIP1153: 一時的ストレージオペコード

Transient Storageというのは、EVMに新たに追加されたデータストレージの一種です。
通常のストレージと同様にkey-value形式でデータを保存していますが、一時的にしかデータを保存せず、トランザクションの終了後に中身は空になります。
Transient Storageへのデータのアクセスは100ガスかかります。

SolidityでTransient Storageを使用するために、以下の2つのアセンブリ関数が導入されました。

  • tstore
    • Transient Storageにデータを保存する。
  • tload
    • Transient Storageからデータを読み取る。

EIP4788: EVMのビーコンブロックルート

Ethereum上のアプリケーションが、信頼性の高い方法でEthereum上のデータを取得できる方法が提案されています。
各エグゼキューションブロック(トランザクション処理を行うブロック)に親(1つ前のブロック)ビーコンブロックのルート(ハッシュ値)が含まれるようになります。
これにより、より信頼性高くコントラクトからデータを取得することが可能になります。

これにより、例えば、現状限られた信頼できるオラクルノードから情報を取得していまが、EIP4788の導入により不要になります。
また、コントラクトが、Ethereumのメインネット上で直接最新データにアクセスできるようになります。

LidoやRocket Poolなどのリキッドステーキングプロトコルは、複数ユーザーのETHを集めてステーキングでき、EIP4788により、オラクルに依存せずに報酬をユーザーに配分できます。:
また、EigenlayerなどのEthereumのネットワークセキュリティを他のサービスにも適用するリステーキングアプリケーションでも、EIP4788はセキュリティと効率性を向上させます。

https://consensys.io/blog/ethereum-evolved-dencun-upgrade-part-3-eip-4788

EIP4844: シャードBLOBトランザクション

将来的に実装されるデータシャーディングの実装に向けて、新しいトランザクション形式であるblobが導入されました。
このアップデートにより、ユーザーは大量のデータを安価に使用することができるようになります。
blobはコントラクトから直接アクセスすることはできません。
そのため、blobhashという命令が追加され、blobハッシュデータにアクセスできるようになりました。

また、blobでは新しいガス価格計算メカニズムが導入されています。
blobのbase feeには、EIP7516で提案されているblobbasefeeという命令を使用してアクセスすることができます。

https://zenn.dev/qope/articles/b8d09ae260f1aa

https://qiita.com/cardene/items/4966cf7f6691d7220367

https://zenn.dev/qope/articles/006401c8fe8069

EIP5656: MCOYメモリーコピーオペコード

EVMでメモリ領域間のデータを効率的にコピーするためのmcopyというオペコードを追加する提案です。
これまで、EVMにはメモリ領域間でデータを直接コピーする命令がなく、mloadmstoreの2つの命令のループを使用していました。

提案されている新しいオペコードであるmcopyはYulやインラインアセンブリで使用することができ、先ほどのmloadmstoreの2つの命令を使用せずにデータをメモリ内にコピーすることができます。
ただ、コンパイル時にコードジェネレーターが生成するコピー処理にはまだ組み込まれていないため、将来的にガスコスト削減などの観点から組み込まれることが予定されています。

EIP6780: SELFDESTRUCTの機能削減

その名の通り、コントラクトが自身を破壊するSELFDESTRUCTというオペコードの機能を大幅に制限する提案です。
SELFDESTRUCTが実行されると、コントラクト内のETHを指定されたアドレスに送金し、コントラクトのストレージとコードを削除します。
EIP6780導入後は以下のような機能に制限されます。

  • コントラクト内のETHを指定されたアドレスに送金。
  • コントラクトのストレージとコードを削除しない。
  • ただし、コントラクトがデプロイされたトランザクション内でSELFDESTRUCTが実行された時のみ、コントラクトのストレージとコードを削除。

SELFDESTRUCT命令はEIP6049によりすでに非推奨になっていて、コンパイラはSELFDESTRUCTを使用していると警告を出すようになっていました。

Apple Siliconのサポート

これまでのIntel専用のmacOSバイナリ(solc-macos)を、ARMベースのMac(Apple Silicon)でも動作するユニバーサルバイナリに置き換えます。

これは、SolidityコンパイラがApple Siliconアーキテクチャでネイティブに動作するようにするためです。
これにより、ARMベースのMac(M1やM2チップを搭載したMac)で、Solidityコンパイラをネイティブに実行でき、コンパイラのパフォーマンスが向上して簡単に使用できるようになります。
また、もちろんIntelベースのMacでも同じバイナリを使用できます。

その他の変更

その他の細かい修正については以下の記事を参考にしてください。

https://soliditylang.org/blog/2024/01/26/solidity-0.8.24-release-announcement

最後に

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

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

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

CryptoGames

Discussion