簡単に言うと、カンクンのアップグレードが近づいており、このアップグレードには主に 6 つの EIP、EIP-1153、EIP-4788、EIP-4844、EIP-5656、EIP-6780、および EIP-7516 によって提案されたエグゼクティブ レベルの変更が含まれています。 EIP-4844 はこのアップグレードの主役であり、イーサリアムのスケーラビリティを向上させ、トランザクション コストを削減し、L2 のトランザクション速度を向上させることを目的としています。カンクンのアップグレードは、それぞれ 1 月 17 日、1 月 30 日、2 月 7 日にイーサリアム Goerli、Sepolia、Holesky テストネットで完了し、3 月 13 日にイーサリアム メインネットで有効化される予定です。アップグレードの前に、Salus は開発者が自分で確認できるように、このアップグレードに関する重要な安全上の注意事項をまとめました。
EIP提案のレビュー
EIP-1153
EIP-1153 では一時ストレージのオペコードが導入されました。これは状態を操作し、ストレージとほぼ同じように動作するために使用されますが、一時ストレージは各トランザクション後に破棄されます。これは、一時ストレージがストレージからの値を逆シリアル化したり、ストレージに値をシリアル化したりしないことを意味します。そのため、一時ストレージはディスク アクセスが必要ないため、コストが安くなります。スマート コントラクトは、2 つの新しいオペコード、TLOAD および TSTORE (「T」は「一時」を表します) を通じて一時ストレージにアクセスできます。この提案は、イーサリアムのトランザクション実行における複数のネストされた実行フレームワーク間の通信のための専用の効率的なソリューションを提供することを目的としています。
EIP-4788
EIP-4788 は、ビーコン チェーン ブロックのハッシュ ツリー ルートを EVM に公開し、スマート コントラクト内のこれらのルートへのアクセスを許可することを目的としています。これにより、コンセンサス レイヤー ステートへのトラストレス アクセスが提供され、ステーキング プール、再ステーキング構造、スマート コントラクト ブリッジ、MEV 緩和などの複数のユースケースがサポートされます。この提案では、スマート コントラクトを通じてこれらのルートを保存し、リング バッファーを使用してストレージ消費を制限し、各実行ブロックがこの情報を表すために必要なスペースのみが一定であることを保証します。
EIP-4844
EIP-4844 では、と呼ばれる新しいトランザクション形式が導入されています。"シャードされた BLOB トランザクション"、シンプルで上位互換性のある方法でイーサリアムのデータ可用性を拡張するように設計されています。この提案では大量のデータが導入されます"blob-carrying transactions"、EVM の実行ではこのデータにアクセスできませんが、そのコミットメントにはアクセスできます。この形式は、将来のフル シャーディングで使用される形式と完全な互換性があり、ローリング拡張に対して一時的ではあるが大幅な軽減を提供します。
EIP-5656
EIP-5656 では、メモリ領域を効率的にコピーするための新しい EVM 命令 MCOPY が導入されています。この提案は、MCOPY 命令を通じてメモリ間でデータを直接コピーすることにより、EVM 上でメモリ コピー操作を実行するオーバーヘッドを削減することを目的としています。 MCOPY は、ソース アドレスと宛先アドレスの重複を可能にし、下位互換性を念頭に置いて設計されており、データ構造の構築、メモリ オブジェクトの効率的なアクセスとコピーなど、さまざまなシナリオでの実行効率を向上させることを目的としています。
EIP-6780
EIP-6780 SELFDESTRUCT オペコードの機能が変更されました。この提案では、SELFDESTRUCT は、コントラクト作成と同じトランザクションでアカウントの削除とすべてのイーサの転送のみを実行し、さらに SELFDESTRUCT を実行すると、コントラクトは削除されず、すべてのイーサが指定された宛先に転送されます。この変更は、Verkle ツリーの将来の使用に適応するものであり、SELFDESTRUCT のいくつかの一般的なシナリオを維持しながら、EVM の実装を簡素化し、状態変更の複雑さを軽減することを目的としています。
EIP-7516
EIP-7516 では、現在のブロック実行で BLOB 基本料金値を返す新しい EVM 命令 BLOBBASEFEE が導入されています。このコマンドは、EIP-4844 で定義されている BLOB 基本料金を返す点を除いて、EIP-3198 の BASEFEE オペコードに似ています。この機能により、コントラクトは BLOB データのガス価格をプログラムで考慮できるようになります。たとえば、ロールアップ コントラクトで BLOB データの使用コストをトラストレスに計算したり、これに基づいて BLOB ガス先物を実装して BLOB データ コストを平滑化したりできます。
公式に開示されたセキュリティ上の考慮事項
EIP-1153
スマート コントラクトの開発者は、一時ストレージ変数を使用する前に、そのライフ サイクルを理解する必要があります。一時ストレージはトランザクションの終了時に自動的にクリアされるため、スマート コントラクト開発者は、ガスを節約するために呼び出し中にスロットのクリアを回避しようとする場合があります。ただし、これにより、同じトランザクション内でコントラクトとのさらなる対話が妨げられたり (再入可能ロックの場合など)、他のエラーが発生したりする可能性があるため、スマート コントラクト開発者は、非一時ストレージ スロットが予約されている場合にのみ予約するように注意する必要があります。ゼロ値。同じトランザクション内の将来の呼び出しで使用することを目的としています。それ以外の場合、これらのオペコードは SSTORE および SLOAD とまったく同じように動作するため、特に再入リスクに関して、通常のセキュリティ上の考慮事項がすべて適用されます。
スマート コントラクトの開発者は、メモリ マッピングの代わりに一時ストレージを使用してみることもできます。一時ストレージは呼び出しが戻ったり再開したりするときにメモリのように破棄されないことに注意する必要があり、これらの使用例では、同じトランザクション内での再入時の予期しない動作を避けるためにメモリを優先する必要があります。メモリ上の一時的なストレージ コストは必然的に高くなるため、この使用パターンは抑制されるはずです。インメモリ マッピングのほとんどの使用法は、キー順のエントリ リストを使用して実装する方が適切であり、スマート コントラクトではインメモリ マッピングが必要になることはほとんどありません (つまり、作成者は運用環境での既知の使用例を認識していません)。
EIP-4844
この EIP により、帯域幅要件がビーコン ブロックあたり最大約 0.75 MB 増加します。これは、今日のブロックの理論上の最大サイズ (呼び出しデータ バイトあたり 30 M ガス / 16 ガス = 1.875 M バイト) よりも 40% 大きいため、最悪の場合の帯域幅が大幅に増加するわけではありません。マージ後、ブロック時間は予測不可能なポアソン分布ではなく静的となり、大きなブロックの伝播に保証された期間が提供されます。
通話データが限られている場合でも、負荷が実行される限り BLOB を保存する必要がないため、この EIP の持続的な負荷は通話データのコストを削減する代替手段よりもはるかに低くなります。これにより、これらの BLOB を少なくとも一定期間保持する必要があるポリシーを実装することが可能になります。選択される特定の値は MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS エポックで、これは約 18 日で、ペイロード履歴を実行するために推奨される (ただしまだ実装されていない) 1 年のローテーションよりもはるかに短いレイテンシーです。
EIP-5656
クライアントは、中間バッファを使用しない (たとえば、C stdlibmemmove 関数は中間バッファを使用しない) ことに注意する必要があります。これは、これがサービス妨害 (DoS) の可能性があるためです。ここでは、バイトを移動するための言語の組み込み/標準ライブラリ関数のほとんどが正しいパフォーマンス特性を備えています。
それ以外の場合、メモリ拡張は同じ価格設定ルールに従うため、サービス拒否 (DoS) およびメモリ枯渇攻撃の分析は、メモリに触れる他のオペコードの分析と同じになります。
EIP-6780
次のアプリケーション SELFDESTRUCT は壊れるため、この方法でそれを使用するアプリケーションは安全ではなくなります。
WhereCREATE 2 は、コントラクトを同じ場所に再デプロイして、コントラクトをアップグレード可能にするために使用されます。この機能はサポートされなくなったため、代わりに ERC-2535 または別のタイプのプロキシ コントラクトを使用する必要があります。
受益者として SELFDESTRUCT コントラクトを指定することで、コントラクトがバーニング イーサに依存している場合、そのコントラクトは同じトランザクションで作成されませんでした。
スマートコントラクトに関連するリスク
EIP 1153
オペコード TLOAD および TSTORE を使用する 2 つのシナリオを考えてみましょう。
- 呼び出されたコントラクトはこのオペコードを使用します 
- このオペコードを使用してコントラクトへの呼び出しを開始します 
リスク 1:
従来の SSTORE および SLOAD と比較して、新しい一時ストレージは主にデータの保存期間を変更します。tstore に保存されたデータは tload を通じて読み取られます。データはトランザクションと同時にではなく、トランザクションの実行後に解放されます。コントラクトが作成されます。への保存は永続的に記録されます。開発者は、データがコントラクトに誤って書き込まれ、損失が発生する可能性のある誤った使用を避けるために、このオペコードを使用する際にその特性を認識する必要があります。さらに、tstore 内のデータはプライベート変数であり、コントラクト自体によってのみアクセスできます。データを外部で使用する場合は、パラメータの形式で渡すか、パブリック記憶域変数に一時的に保存することしかできません。
リスク 2:
もう 1 つの潜在的なリスクは、スマート コントラクト開発者が一時ストレージ変数の有効期間を適切に管理しない場合、データが消去されるべきでないときに消去されたり、誤って保持されたりする可能性があることです。コントラクトでは、トランザクションの後続の呼び出しで一時ストレージに保存されたデータを使用することが期待されているが、このデータのライフサイクルを適切に管理できなかった場合、呼び出し間でデータが誤って共有されたり失われたりして、ロジック エラーやセキュリティの脆弱性が発生する可能性があります。トークンプロジェクトと同様の残高や手当のデータを正しく保存できないことを考慮すると、契約ロジックに誤りが生じ、損失が発生する可能性があります。または、所有者アドレスを設定するときにこのオペコードを使用すると、特権アドレスが正しく記録されず、コントラクトの重要なパラメータの変更が失われます。
一時ストレージを使用して仮想通貨取引所で取引価格を一時的に記録するスマート コントラクトを考えてみましょう。この契約では、各取引が完了すると価格が更新され、ユーザーは短期間で最新の価格を照会できるようになります。ただし、トランザクションの終了時に一時ストレージが自動的にクリアされるという機能が契約の設計で考慮されていない場合、ユーザーは、トランザクションの終了から次のトランザクションの開始までの間に、間違ったトランザクションまたは古いトランザクションを取得する可能性があります。取引の価格です。これは、ユーザーが誤った情報に基づいて意思決定を行うよう導くだけでなく、悪用されてプラットフォームの信頼性やユーザー資産のセキュリティに影響を与える可能性があります。
EIP-6780
この提案は、以前の自己破壊オペコードの動作を変更します。これにより、コントラクトは破壊されず、トークンの転送のみが行われ、自己破壊と同じトランザクションで作成されたコントラクトのみが破壊されます。この EIP の影響は比較的大きいです。
create 2 を使用して同じアドレスにコントラクトを再デプロイし、コントラクトをアップグレードします。この機能はサポートされなくなりました。代わりに ERC-2535 または別のタイプのプロキシ コントラクトを使用する必要があります。 (これは、アップグレード可能なコントラクトを実装するための create 2 の使用に影響する可能性があります。オンチェーン契約安全)
スマート コントラクトの SELFDESTRUCT 操作を使用すると、コントラクトを破棄し、コントラクト残高を指定された宛先アドレスに送信できます。この場合、コントラクトは SELFDESTRUCT を使用してイーサを破棄し、破棄されたイーサをコントラクトに送信します。ただし、その契約は、同じトランザクションで作成された契約(この契約または同じトランザクション内の他の契約によって作成された契約)のみにすることができます。それ以外の場合は、コントラクトを破棄せずにエーテルのみが転送されます (たとえば、コントラクトが自己破棄され、受益者が自己破棄するコントラクトである場合、これによって変更は生じません)。これは、引き出しやその他の操作で自爆に依存するすべてのものに影響します。契約。
1 インチ CHI トークンと同様のガス トークンは、オフセットを維持し、常にこのオフセットで CREATE 2 または SELFDESTRUCT を実行することによって機能します。この更新後、現在のオフセットにあるコントラクトが正しく自己破棄されなかった場合、後続の CREATE 2 はコントラクトを正常にデプロイできなくなります。
この提案の実装は、契約への直接的な攻撃にはつながりませんが、自己破壊操作に依存する最初に展開された契約の通常のロジックに損傷を与えます (資金移動の自己破壊のみに依存する契約は影響を受けません)。操作には自己破壊が必要です(契約が削除されると、影響を受けます)、契約が予期せぬ動作を引き起こします。契約とユーザーにのみ、契約のストライキ、資金の損失、およびその他の危険が発生する可能性があります(たとえば、最初は create 2 を使用して元のアドレスに新しいコントラクトをデプロイしていましたが、元のコントラクトは自動的に破棄されました。アップグレードされたコントラクトは正常にデプロイできなくなりました)。長期的には、オペコードの機能を変更すると、集中化の問題が発生する可能性があります。
たとえば、更新する既存のボールト契約ボールトがあります。
- create 2 一時保管契約は、保管庫資金を一時的に保管するために使用されます。 
- 自爆金庫契約、資金は一時契約に移管(契約は破棄せずに資金のみ移管) 
- 元のアドレスに 2 つの新しいボールト コントラクトを作成します (元のボールト コントラクトが破棄されなかったため失敗しました) 
- 自己破壊型の一時契約は資金を保管庫に戻します (資金は失われ、保管庫契約は作成されません)。 
参考文献
カンクンのアップグレードは、イーサリアムの競争上の優位性をさらに強化します。ただし、このアップグレードはコアのスマート コントラクト層への変更にリスクをもたらし、既存の DApps の安全な運用に影響を及ぼします。スマート コントラクトの開発中は、これらの変更とそれが引き起こす可能性のあるリスクにも細心の注意を払う必要があります。これを行うことができますSalusリスクのレビューまたは監査のサポートについてお問い合わせいただくか、変更についてさらに詳しくお読みください。


