はじめに

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

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

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

今回はSolidityのバージョン0.8.24での変更点をまとめていきます。

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

変更点

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つ前のブロック)ビーコンブロックのルート(ハッシュ値)が含まれるようになります。 これにより、より信頼性高くコントラクトからデータを取得することが可能になります。

コンセンサスブロックには以下の3つのルートがあります。

Beaconブロックルート

前のビーコンブロック全体のヘッダーのハッシュ。 このルートがエグゼキューションブロックに含まれます。

状態ルート

現在のブロックのトランザクションが処理された後のEthereumネットワークのステートのハッシュ。

ボディルート

ブロックに含まれるすべてのトランザクションのハッシュ。

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

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

より詳しくは以下の記事を参考にしてください。

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

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

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

より詳しくは以下の記事を参考にしてください。

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

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

mloadはメモリからデータを読み取り、mstoreはメモリにデータを書き込み命令で、この2つの組み合わせることでコピーと同じ処理が実行できます。

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

Solidityのコンパイラにはコードジェネレーターが組み込まれており、SolidityコードをEVMで実行可能なバイトコードに変換します。

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でも同じバイナリを使用できます。

その他の変更

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

最後に

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

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