本文: 以前の記事で、シーケンサー受信トレイ コントラクトは、レイヤー 1 でシーケンサーによって公開されたトランザクション データのバッチを受信するように特別に設計されていると述べました。 同時に、シーケンサーの受信トレイは「ファストボックス」とも呼ばれ、対応するのがディレイド受信トレイ(受信トレイと呼ばれる)であることも指摘しました。 次に、Delayed Inboxなど、クロスチェーンメッセージ送信に関連するコンポーネントについて詳しく説明します。
クロスチェーン取引は、L1からL2(入金)とL2からL1(出金)に分けることができます。 ここで言及されている入出金は、必ずしもクロスチェーン資産に関連しているわけではなく、資産を直接含まないメッセージングである可能性があることに注意してください。 したがって、これらの2つの単語は、クロスチェーン関連の動作の2つの方向のみを表しています。
純粋なL2トランザクションと比較して、クロスチェーントランザクションはL1とL2の2つの異なるシステムで情報を交換するため、プロセスはより複雑になります。
さらに、通常クロスチェーン動作と呼ばれるのは、witnessモードのクロスチェーンブリッジを使用した2つの無関係なネットワークでのクロスチェーンです。 このクロスチェーンのセキュリティは、クロスチェーンブリッジに依存します。 歴史的に、目撃者モードに基づくクロスチェーンブリッジでは、盗難事件が頻繁に発生してきました。
対照的に、RollupとEthereumメインネット間のクロスチェーン動作は、前述のクロスチェーン操作とは根本的に異なります。 これは、レイヤ 2 の状態がレイヤ 1 に記録されたデータによって決定されるためです。 公式のRollupクロスチェーンブリッジを使用する限り、その運用構造は絶対に安全です。
これはまた、ユーザーの視点から見ると、独立したチェーンとして表示される Rollup の本質を強調しています。 ただし、実際には、いわゆる「レイヤー 2」は、ロールアップによってユーザーに開かれる高速表示ウィンドウにすぎず、その真のチェーンのような構造はレイヤー 1 に記録されます。 したがって、L2はハーフチェーン、または「レイヤー1で作成されたチェーン」と見なすことができます。
クロスチェーン操作は非同期であり、非アトミックであることに注意することが重要です。 トランザクションの結果が確認されるとわかるシングルチェーンとは異なり、クロスチェーントランザクションでは、特定の時間に反対側で特定のイベントが発生することを保証することはできません。 したがって、クロスチェーントランザクションはソフトな問題が原因で失敗する可能性がありますが、再試行可能なチケットなどの正しい方法を使用すると、資金がスタックするなどの問題は発生しません。
再試行可能なチケットは、ETHトークンとERC20トークンの両方について、Arbitrumの公式ブリッジを通じて資金を入金する際に使用される基本的なツールです。 そのライフサイクルは、次の 3 つのステップで構成されます。
L1 でのチケットの送信: 遅延受信トレイ コントラクトの createRetryableTicket() メソッドを使用して入金チケットを作成し、送信します。
L2での自動引き換え:ほとんどの場合、シーケンサーは、手動での介入なしに、ユーザーのチケットを自動的に引き換えることができます。
L2での手動引き換え:チケットのプリペイドガスが不足しているL2でのガス料金の急激な上昇など、特定のエッジケースでは、自動引き換えが失敗することがあります。 このような場合は、ユーザーによる手動の介入が必要です。 自動引き換えに失敗した場合、チケットは7日以内に手動で引き換える必要があります。そうしないと、チケットが削除されるか(資金が永久に失われる)、リースを更新するための料金の支払いが必要になる可能性があります。
さらに、Arbitrumオフィシャルブリッジの出金プロセスでは、プロセスに関してはデポジット動作と対称的な類似性がありますが、再試行可能という概念はありません。 これは、Rollup プロトコル自体の観点からも、いくつかの違いを調べることでも理解できます。
EVMにはタイマーや自動化がないため、引き出し時の自動償還はありません。 自動償還はシーケンサーの助けを借りてL2に実装できますが、L1のユーザーは資産を請求するために送信トレイコントラクトを手動で操作する必要があります。
また、出金時のチケットの有効期限の問題もありません。チャレンジ期間が過ぎている限り、資産はいつでも請求できます。
ERC-20資産を含むクロスチェーン取引は複雑です。 いくつかの質問を考えることができます。
これらの質問は複雑すぎて包括的に対処することができないため、すべてに答えるつもりはありません。 これらの質問は、ERC-20クロスチェーントランザクションの複雑さを説明するためのものです。
現在、多くのスケーリングソリューションでは、ホワイトリスト+手動リストソリューションを使用して、さまざまな複雑な問題や境界条件を回避しています。
Arbitrumは、ERC20クロスチェーントランザクションのほとんどの問題点に対処するためにゲートウェイシステムを採用しており、以下の特徴を備えています。
カスタムゲートウェイの必要性を説明するために、クロスチェーンWETH転送の比較的簡単な例を考えてみましょう。
WETHはETHのERC20版です。 イーサリアムが主要通貨として機能するため、dAppsの多くの複雑な機能を直接実現することは不可能です。 したがって、WETHのようなERC20に相当するものが必要です。 ETHをWETHコントラクトに預けることで、コントラクト内にロックされ、同量のWETHが生成されます。
同様に、WETHを燃やしてETHを引き出すことができます。 明らかに、WETHの流通量とETHのロック量は常に1:1の比率を維持します。
WETHをL2に直接クロスチェーンすると、いくつかの奇妙な問題が見つかります。
明らかに、これはWETHの設計原則に違反しています。 したがって、WETHクロスチェーンをクロスする場合は、入金する場合でも出金する場合でも、最初にETHにアンラップしてからクロスオーバーし、WETHにラップし直す必要があります。 そこでWETHゲートウェイの出番です。
同様に、より複雑なロジックを持つ他のトークンの場合、クロスチェーン環境で適切に機能するためには、より高度で慎重に設計されたゲートウェイが必要です。 ArbitrumのカスタムGatewayは、標準Gatewayのクロスチェーン通信ロジックを継承しており、開発者はトークンロジックに関連するクロスチェーン動作をカスタマイズして、ほとんどの要件を満たすことができます。
SequencerInbox に対応するのは、ファスト ボックスとも呼ばれ、受信トレイ (正式名称は遅延受信トレイ) です。 高速ボックスと遅延ボックスを区別するのはなぜですか? ファスト ボックスは、シーケンサーによって発行された L2 トランザクションのバッチを受信するように特別に設計されているため、L2 ネットワーク内のシーケンサーによって前処理されていないトランザクションは、ファスト ボックス コントラクトに表示されません。
スローボックスの最初の役割は、L1からL2への入金動作を処理することです。ユーザーはスローボックスから入金を開始し、シーケンサーはそれをL2に反映します。 最終的に、この入金記録はシーケンサーによって L2 トランザクション シーケンスに含まれ、ファスト ボックス コントラクトである SequencerInbox に送信されます。
このシナリオでは、SequencerInbox に送信されたトランザクションがレイヤー 2 の通常のトランザクション シーケンスに干渉し、シーケンサーの動作に影響を与えるため、ユーザーがデポジット トランザクションをファスト ボックスに直接送信することは不適切です。
遅延ボックスの2つ目の役割は、検閲への抵抗です。 遅延ボックスコントラクトに直接送信されたトランザクションは、通常、シーケンサーによって 10 分以内にファストボックスに集約されます。 ただし、シーケンサーが悪意を持って要求を無視した場合、遅延ボックスには強制包含機能があります。
トランザクションが遅延受信トレイに送信され、24 時間後にシーケンサーによってトランザクション シーケンスに集約されないままの場合、ユーザーはレイヤー 1 で強制包含機能を手動でトリガーできます。 このアクションにより、シーケンサーによって無視されたトランザクション要求は、高速ボックスである SequencerInbox に集約され、その後、すべての Arbitrum One ノードによって検出され、レイヤー 2 トランザクション シーケンスに強制的に含まれます。
前述したように、ファストボックス内のデータは、L2の履歴データエンティティを表します。 したがって、悪意のある検閲の場合、遅延ボックスを使用してトランザクションを最終的にL2台帳に含めることができ、レイヤー2からの強制引き出しなどのシナリオをカバーできます。
このことから、シーケンサーは最終的に、どの方向またはレイヤーでもトランザクションを永続的に打ち切ることはできないことがわかります。
スローボックス受信トレイのコア機能は次のとおりです。
ただし、forceInclusion() 関数は実際には高速ボックスコントラクトに存在することに注意することが重要です。 わかりやすくするために、ここではスローボックス関数と並行して説明しました。
送信トレイは出金にのみ関連し、出金行動の記録および管理システムとして理解できます。
以下では、ETHを例に入出金のプロセスについて解説します。 ERC20トークンのプロセスは、ゲートウェイが追加されたことで似ていますが、ここでは詳しく説明しません。
ユーザーは、L2でArbSysコントラクトのwithdrawEth()関数を呼び出し、L2で対応する量のETHをバーンします。
シーケンサーは、出金リクエストをファストボックスに送信します。
バリデーターノードは、上記の引き出しトランザクションを含むファストボックス内のトランザクションシーケンスに基づいて、新しいロールアップブロックを作成します。
ロールアップ ブロックがチャレンジ期間を過ぎて確認されると、ユーザーは L1 で Outbox.execute Transaction() 関数を呼び出して、パラメータが上記の ArbSys コントラクトによって指定されていることを証明できます。
送信箱の契約が正しいことが確認されると、ブリッジ内の対応する量のETHのロックが解除され、ユーザーに送信されます。
楽観的なロールアップ公式ブリッジを使用するには、チャレンジ期間を待つ必要があります。 この問題を回避するには、プライベートなサードパーティのクロスチェーンブリッジを利用します。
forceInclusion() 関数は、シーケンサーの検閲に対抗するために使用されます。 これは、任意の L2 ローカル トランザクション、L1 から L2 へのトランザクション、および L2 から L1 へのトランザクションに適用できます。 シーケンサーの悪意のある検閲はトランザクション体験に大きく影響するため、L2からの撤退を選択することがよくあります。以下は、強制的な引き出しにforceInclusion()を使用する例です。
ETHの引き出しのコンテキストでは、ステップ1と2のみがシーケンサー検閲を伴います。 したがって、次の2つの手順を変更するだけで済みます。
最後に、ユーザーは送信トレイから出金することができ、残りの手順は通常の出金プロセスと同じです。
さらに、arbitrum-tutorialsリポジトリには、Arb SDKを介してforceInclusion()を使用してL2ローカルトランザクションとL2からL1へのトランザクションを実行する方法をユーザーに案内する詳細なチュートリアルがあります。
本文: 以前の記事で、シーケンサー受信トレイ コントラクトは、レイヤー 1 でシーケンサーによって公開されたトランザクション データのバッチを受信するように特別に設計されていると述べました。 同時に、シーケンサーの受信トレイは「ファストボックス」とも呼ばれ、対応するのがディレイド受信トレイ(受信トレイと呼ばれる)であることも指摘しました。 次に、Delayed Inboxなど、クロスチェーンメッセージ送信に関連するコンポーネントについて詳しく説明します。
クロスチェーン取引は、L1からL2(入金)とL2からL1(出金)に分けることができます。 ここで言及されている入出金は、必ずしもクロスチェーン資産に関連しているわけではなく、資産を直接含まないメッセージングである可能性があることに注意してください。 したがって、これらの2つの単語は、クロスチェーン関連の動作の2つの方向のみを表しています。
純粋なL2トランザクションと比較して、クロスチェーントランザクションはL1とL2の2つの異なるシステムで情報を交換するため、プロセスはより複雑になります。
さらに、通常クロスチェーン動作と呼ばれるのは、witnessモードのクロスチェーンブリッジを使用した2つの無関係なネットワークでのクロスチェーンです。 このクロスチェーンのセキュリティは、クロスチェーンブリッジに依存します。 歴史的に、目撃者モードに基づくクロスチェーンブリッジでは、盗難事件が頻繁に発生してきました。
対照的に、RollupとEthereumメインネット間のクロスチェーン動作は、前述のクロスチェーン操作とは根本的に異なります。 これは、レイヤ 2 の状態がレイヤ 1 に記録されたデータによって決定されるためです。 公式のRollupクロスチェーンブリッジを使用する限り、その運用構造は絶対に安全です。
これはまた、ユーザーの視点から見ると、独立したチェーンとして表示される Rollup の本質を強調しています。 ただし、実際には、いわゆる「レイヤー 2」は、ロールアップによってユーザーに開かれる高速表示ウィンドウにすぎず、その真のチェーンのような構造はレイヤー 1 に記録されます。 したがって、L2はハーフチェーン、または「レイヤー1で作成されたチェーン」と見なすことができます。
クロスチェーン操作は非同期であり、非アトミックであることに注意することが重要です。 トランザクションの結果が確認されるとわかるシングルチェーンとは異なり、クロスチェーントランザクションでは、特定の時間に反対側で特定のイベントが発生することを保証することはできません。 したがって、クロスチェーントランザクションはソフトな問題が原因で失敗する可能性がありますが、再試行可能なチケットなどの正しい方法を使用すると、資金がスタックするなどの問題は発生しません。
再試行可能なチケットは、ETHトークンとERC20トークンの両方について、Arbitrumの公式ブリッジを通じて資金を入金する際に使用される基本的なツールです。 そのライフサイクルは、次の 3 つのステップで構成されます。
L1 でのチケットの送信: 遅延受信トレイ コントラクトの createRetryableTicket() メソッドを使用して入金チケットを作成し、送信します。
L2での自動引き換え:ほとんどの場合、シーケンサーは、手動での介入なしに、ユーザーのチケットを自動的に引き換えることができます。
L2での手動引き換え:チケットのプリペイドガスが不足しているL2でのガス料金の急激な上昇など、特定のエッジケースでは、自動引き換えが失敗することがあります。 このような場合は、ユーザーによる手動の介入が必要です。 自動引き換えに失敗した場合、チケットは7日以内に手動で引き換える必要があります。そうしないと、チケットが削除されるか(資金が永久に失われる)、リースを更新するための料金の支払いが必要になる可能性があります。
さらに、Arbitrumオフィシャルブリッジの出金プロセスでは、プロセスに関してはデポジット動作と対称的な類似性がありますが、再試行可能という概念はありません。 これは、Rollup プロトコル自体の観点からも、いくつかの違いを調べることでも理解できます。
EVMにはタイマーや自動化がないため、引き出し時の自動償還はありません。 自動償還はシーケンサーの助けを借りてL2に実装できますが、L1のユーザーは資産を請求するために送信トレイコントラクトを手動で操作する必要があります。
また、出金時のチケットの有効期限の問題もありません。チャレンジ期間が過ぎている限り、資産はいつでも請求できます。
ERC-20資産を含むクロスチェーン取引は複雑です。 いくつかの質問を考えることができます。
これらの質問は複雑すぎて包括的に対処することができないため、すべてに答えるつもりはありません。 これらの質問は、ERC-20クロスチェーントランザクションの複雑さを説明するためのものです。
現在、多くのスケーリングソリューションでは、ホワイトリスト+手動リストソリューションを使用して、さまざまな複雑な問題や境界条件を回避しています。
Arbitrumは、ERC20クロスチェーントランザクションのほとんどの問題点に対処するためにゲートウェイシステムを採用しており、以下の特徴を備えています。
カスタムゲートウェイの必要性を説明するために、クロスチェーンWETH転送の比較的簡単な例を考えてみましょう。
WETHはETHのERC20版です。 イーサリアムが主要通貨として機能するため、dAppsの多くの複雑な機能を直接実現することは不可能です。 したがって、WETHのようなERC20に相当するものが必要です。 ETHをWETHコントラクトに預けることで、コントラクト内にロックされ、同量のWETHが生成されます。
同様に、WETHを燃やしてETHを引き出すことができます。 明らかに、WETHの流通量とETHのロック量は常に1:1の比率を維持します。
WETHをL2に直接クロスチェーンすると、いくつかの奇妙な問題が見つかります。
明らかに、これはWETHの設計原則に違反しています。 したがって、WETHクロスチェーンをクロスする場合は、入金する場合でも出金する場合でも、最初にETHにアンラップしてからクロスオーバーし、WETHにラップし直す必要があります。 そこでWETHゲートウェイの出番です。
同様に、より複雑なロジックを持つ他のトークンの場合、クロスチェーン環境で適切に機能するためには、より高度で慎重に設計されたゲートウェイが必要です。 ArbitrumのカスタムGatewayは、標準Gatewayのクロスチェーン通信ロジックを継承しており、開発者はトークンロジックに関連するクロスチェーン動作をカスタマイズして、ほとんどの要件を満たすことができます。
SequencerInbox に対応するのは、ファスト ボックスとも呼ばれ、受信トレイ (正式名称は遅延受信トレイ) です。 高速ボックスと遅延ボックスを区別するのはなぜですか? ファスト ボックスは、シーケンサーによって発行された L2 トランザクションのバッチを受信するように特別に設計されているため、L2 ネットワーク内のシーケンサーによって前処理されていないトランザクションは、ファスト ボックス コントラクトに表示されません。
スローボックスの最初の役割は、L1からL2への入金動作を処理することです。ユーザーはスローボックスから入金を開始し、シーケンサーはそれをL2に反映します。 最終的に、この入金記録はシーケンサーによって L2 トランザクション シーケンスに含まれ、ファスト ボックス コントラクトである SequencerInbox に送信されます。
このシナリオでは、SequencerInbox に送信されたトランザクションがレイヤー 2 の通常のトランザクション シーケンスに干渉し、シーケンサーの動作に影響を与えるため、ユーザーがデポジット トランザクションをファスト ボックスに直接送信することは不適切です。
遅延ボックスの2つ目の役割は、検閲への抵抗です。 遅延ボックスコントラクトに直接送信されたトランザクションは、通常、シーケンサーによって 10 分以内にファストボックスに集約されます。 ただし、シーケンサーが悪意を持って要求を無視した場合、遅延ボックスには強制包含機能があります。
トランザクションが遅延受信トレイに送信され、24 時間後にシーケンサーによってトランザクション シーケンスに集約されないままの場合、ユーザーはレイヤー 1 で強制包含機能を手動でトリガーできます。 このアクションにより、シーケンサーによって無視されたトランザクション要求は、高速ボックスである SequencerInbox に集約され、その後、すべての Arbitrum One ノードによって検出され、レイヤー 2 トランザクション シーケンスに強制的に含まれます。
前述したように、ファストボックス内のデータは、L2の履歴データエンティティを表します。 したがって、悪意のある検閲の場合、遅延ボックスを使用してトランザクションを最終的にL2台帳に含めることができ、レイヤー2からの強制引き出しなどのシナリオをカバーできます。
このことから、シーケンサーは最終的に、どの方向またはレイヤーでもトランザクションを永続的に打ち切ることはできないことがわかります。
スローボックス受信トレイのコア機能は次のとおりです。
ただし、forceInclusion() 関数は実際には高速ボックスコントラクトに存在することに注意することが重要です。 わかりやすくするために、ここではスローボックス関数と並行して説明しました。
送信トレイは出金にのみ関連し、出金行動の記録および管理システムとして理解できます。
以下では、ETHを例に入出金のプロセスについて解説します。 ERC20トークンのプロセスは、ゲートウェイが追加されたことで似ていますが、ここでは詳しく説明しません。
ユーザーは、L2でArbSysコントラクトのwithdrawEth()関数を呼び出し、L2で対応する量のETHをバーンします。
シーケンサーは、出金リクエストをファストボックスに送信します。
バリデーターノードは、上記の引き出しトランザクションを含むファストボックス内のトランザクションシーケンスに基づいて、新しいロールアップブロックを作成します。
ロールアップ ブロックがチャレンジ期間を過ぎて確認されると、ユーザーは L1 で Outbox.execute Transaction() 関数を呼び出して、パラメータが上記の ArbSys コントラクトによって指定されていることを証明できます。
送信箱の契約が正しいことが確認されると、ブリッジ内の対応する量のETHのロックが解除され、ユーザーに送信されます。
楽観的なロールアップ公式ブリッジを使用するには、チャレンジ期間を待つ必要があります。 この問題を回避するには、プライベートなサードパーティのクロスチェーンブリッジを利用します。
forceInclusion() 関数は、シーケンサーの検閲に対抗するために使用されます。 これは、任意の L2 ローカル トランザクション、L1 から L2 へのトランザクション、および L2 から L1 へのトランザクションに適用できます。 シーケンサーの悪意のある検閲はトランザクション体験に大きく影響するため、L2からの撤退を選択することがよくあります。以下は、強制的な引き出しにforceInclusion()を使用する例です。
ETHの引き出しのコンテキストでは、ステップ1と2のみがシーケンサー検閲を伴います。 したがって、次の2つの手順を変更するだけで済みます。
最後に、ユーザーは送信トレイから出金することができ、残りの手順は通常の出金プロセスと同じです。
さらに、arbitrum-tutorialsリポジトリには、Arb SDKを介してforceInclusion()を使用してL2ローカルトランザクションとL2からL1へのトランザクションを実行する方法をユーザーに案内する詳細なチュートリアルがあります。