2.3 KiB
Cross Domain Messaging
Like other layer 2 protocol, Scroll allow dapps to communicate between layer 1 and layer 2. More specifically, dapps on layer 1 can trigger contract functions in layer 2, and vice versa.
Message Between L1 and L2
The Scroll protocol implements two core contracts L1ScrollMessenger and L2ScrollMessenger to enable cross domain messaging. The only entry to send cross domain message is to call the following function:
function sendMessage(
address _to,
bytes memory _message,
uint256 _gasLimit
) external payable
The function is attached in both messenger in layer 1 and layer 2. After that, the Sequencer will handle the rest part for you. We will explain the detailed workflow in the following docs.
Send Message from L1 to L2
As described above, the first step is to call L1ScrollMessenger.sendMessage in layer 1. The L1ScrollMessenger contract will emit a SentMessage event, which will be notified by the Sequencer. The Sequencer will for the confirmation of the function call in layer 1. Normally, the Sequencer will wait for 10-20 blocks. After that, the Sequencer will initiate a transaction in layer 2, calling function L2ScrollMessenger.relayMessage and finally, the message is executed in layer 2.
The execution in layer 2 may be failed due to out of gas problem. In such case, one can call L1ScrollMessenger.replayMessage to replace the message with a larger gas limit. And the Sequencer will follow the steps and execute the message again in layer 2.
Send Message from L2 to L1
Similar to sending message from L1 to L2, you should call L2ScrollMessenger.sendMessage first in layer 2. The L2ScrollMessenger contract will emit a SentMessage event, which will be notified by the Sequencer. Unlike above, the Sequencer will first batch submit layer 2 transactions (or block) to ZKRollup contract in layer 1. Then the Sequencer will wait the proof generated by roller and submit the proof to ZKRollup contract in layer 1 again. Finally, anyone can call L1ScrollMessenger.relayMessageWithProof with correct proof to execute the message in layer 1.
Currently, for the safety reason, we only allow privileged contracts to send cross domain messages. And only privileged accounts can call L2ScrollMessenger.relayMessage.
Fee For Sending Message
to be discussed.