Interop message passing overview
This is an explanation of how interop works. You can find a step by step tutorial here.
The low-level CrossL2Inbox (opens in a new tab) contract handles basic message execution. It verifies whether an initiating message exists but does not check the message's destination, processing status, or other attributes.
The L2ToL2CrossDomainMessenger (opens in a new tab) contract extends CrossL2Inbox by providing complete cross-domain messaging functionality.
For high-level interoperability, both messages use the L2ToL2CrossDomainMessenger contract on their respective chains.
Initiating message
-
The application sends a transaction to a contract on the source chain.
-
The contract calls
L2ToL2CrossDomainMessenger.SendMessage(opens in a new tab). The call requires these parameters:_destination: The chain ID of the destination blockchain._target: The address of the contract on that blockchain._message: The actual message.
This message is provided to
_targetas calldata, which means it includes a function selector and the parameters for that function call. -
L2ToL2CrossDomainMessengeron the source chain verifies the message is legitimate:- The destination chain is one to which this chain can send messages.
- The destination chain is not the source chain.
- The target is neither
CrossL2InboxnorL2ToL2CrossDomainMessenger.
-
L2ToL2CrossDomainMessengeremits a log entry. In addition to the parameters, the log entry also includes:-
_nonce: A nonce (opens in a new tab) value to ensure the message is only executed once. -
_sender: The contract that sent the cross domain message.
-
Executing message
-
Before the executing message is processed, the log event of the initiating message has to get to
op-supervisoron the destination chain before the expiry window of 7 days. -
The autorelayer, the application, or a contract calling on the application's behalf calls
L2ToL2CrossDomainMessenger.relayMessage(opens in a new tab). This call includes the message that was sent (_sentMessage), as well as the fields required to find that message (_id) (opens in a new tab). -
The
L2ToL2CrossDomainMessengerusesCrossL2Inboxto verify the message was sent from the source. -
L2ToL2CrossDomainMessengeron the destination chain verifies the message is legitimate:_destination: Chain ID of the destination chain._nonce: Nonce of the message sent_sender: Address that sent the message_target: Target contract or wallet address.message: Message payload to call target with.
-
If everything checks out,
L2ToL2CrossDomainMessengercalls the destination contract with the calldata provided in the message.
Next steps
- Build a revolutionary app that uses multiple blockchains within the Superchain
- Learn how to pass messages between blockchains.
- Deploy a SuperchainERC20 to the Superchain.