Message passing

The Lighter protocol supports message passing across all three of its domains.

EVM and Core communicate through stateful write streams, one in each direction. These streams are settled on L1 together with Core and EVM state, allowing the sequencer to fulfill cross-domain write requests without waiting for L1 finality.

Message passing between L1 and Core and between L1 and EVM goes through the ZkLighter bridge on L1. The bridge maintains a separate priority queue for messages sent from L1 to each domain. It also handles messages arriving on L1 from Core and EVM, called L1 calls.

A batch may contain many L1 calls generated by Core and EVM. Once such a batch has been executed on L1, anyone can call the bridge to execute the included L1 calls. Batch execution makes the calls eligible but does not execute them itself.

Each L1 Call carries the following fields.

struct L1Call {
    // Sender on the originating domain, authenticated by the bridge.
    address l2Sender;

    // L1 address to call.
    address to;

    // Amount of ETH to send with the call, in wei.
    uint256 value;

    // Nonce that distinguishes this call from other calls.
    uint256 msgNonce;

    // Calldata to pass to the L1 target.
    bytes data;
}

Did this page help you?