Module limits
LinethLineth (Formerly the Linea Stack) The open-source ZK-rollup stack, codebase, and technical protocol that's the foundation of Linea Mainnet. Operators can deploy this stack to launch their own Ethereum-compatible L2 or L3 networks. uses module limits to keep proof complexity manageable and ensure that the prover can generate proofs efficiently without overwhelming the infrastructure.
Lineth's arithmetization specification is divided into modules, and each module represents a collection of EVMEthereum Virtual Machine (EVM) A stack-based virtual machine that executes bytecode. In Ethereum, the execution model specifies how the system state is altered given a series of bytecode instructions and a small tuple of environmental data. This is specified through a formal model of a virtual state machine. or Lineth zkEVMzkEVM A virtual machine that executes smart contracts and proves the correctness of execution using zero-knowledge proofs. zkEVMs recreate aspects of Ethereum's design, which provides an "Ethereum-like" experience for developers and users. operations (opcodes). Modules can:
- Process transaction data.
- Manage zkEVM memory.
- Coordinate interactions between modules.
Each module has a specific limit on the number of lines of data its operations can generate, regardless of its purpose. You can view these limits in the Lineth source code. Additional lines are generated each time unique instructions are provided to a module's operations, but repeat calls with the same arguments do not generate new lines.
High-complexity transactions that repeatedly use a large volume of operations may generate too many lines of data and exceed a module's limit. Transactions that reach this point are rejected by the sequencerSequencer The set of Linea Besu plugins responsible for ordering, building, and executing blocks in a way that allows the subsequent ZK proof to be made, including the tracer. The sequencer is a plugin set rather than a standalone process; a node that runs it alongside a Maru validator is a sequencer node. to ensure that the trace data passed to the prover is of a manageable scope, and that a proof can be generated.
Transactions rejected for exceeding module limits can be identified through the following methods, which return an error:
Use linea_getTransactionExclusionStatusV1
to get the rejection status of a transaction that was sent, but was not rejected immediately
nor included in a block.
You can use this method to identify the reason for rejection in edge cases where
linea_estimateGas or eth_sendRawTransaction do not return an error. It's intended to be used
only in cases the transaction execution differs between an RPC nodeRPC node A node configured to expose JSON-RPC APIs to applications, users, or internal services, optionally behind load balancers and RBAC. Any node can serve RPC, regardless of its consensus role. Which methods it serves depends on its execution client and enabled plugins: standard Ethereum namespaces are available on any client, while the linea_ namespace requires Linea Besu with the relevant plugins enabled. RPC nodes also differ in how much state history they retain, from current state and recent history by default up to a full archive node. and the sequencer.