Free 30-min Web3 Consultation
Book Now
Smart Contract Security Audits
Learn More
Custom DeFi Protocol Development
Explore
Full-Stack Web3 dApp Development
View Services
Free 30-min Web3 Consultation
Book Now
Smart Contract Security Audits
Learn More
Custom DeFi Protocol Development
Explore
Full-Stack Web3 dApp Development
View Services
Free 30-min Web3 Consultation
Book Now
Smart Contract Security Audits
Learn More
Custom DeFi Protocol Development
Explore
Full-Stack Web3 dApp Development
View Services
Free 30-min Web3 Consultation
Book Now
Smart Contract Security Audits
Learn More
Custom DeFi Protocol Development
Explore
Full-Stack Web3 dApp Development
View Services
LABS
Guides

How to Support Parallel Transaction Execution

This guide explains the architectural patterns and implementation details for adding parallel transaction execution to blockchain nodes, focusing on EVM and SVM environments.
Chainscore © 2026
introduction
BLOCKCHAIN SCALING

Introduction to Parallel Execution

Parallel execution is a fundamental technique for scaling blockchain throughput by processing multiple transactions simultaneously, moving beyond the sequential bottleneck of traditional blockchains.

Traditional blockchains like Bitcoin and early Ethereum use a sequential execution model, where transactions in a block are processed one after another by a single virtual machine. This creates a significant bottleneck, as the network's total throughput is limited by the speed of a single CPU core. Parallel execution flips this model by analyzing transactions for data dependencies. If two transactions do not read from or write to the same on-chain state—such as different user wallets or smart contract storage slots—they can be processed concurrently by multiple CPU cores or threads, dramatically increasing potential transactions per second (TPS).

Implementing parallel execution requires a runtime that can perform conflict detection. The two primary approaches are optimistic and deterministic parallelism. Optimistic execution, used by Solana and Sui, executes all transactions in parallel first, then validates that no conflicting state accesses occurred, reverting any that did. Deterministic execution, used by Aptos and the Ethereum L2 Monad, requires a pre-execution step to analyze a block's transactions and build a directed acyclic graph (DAG) of dependencies, scheduling only non-conflicting transactions to run in parallel. Each method involves trade-offs between complexity, latency, and guaranteed success rates.

For developers, writing parallel-friendly smart contracts is key to leveraging this performance. This involves minimizing global state contention. Best practices include using independent storage locations (e.g., distinct data structures per user), employing owner-based access patterns where only a single account modifies a resource, and utilizing move semantics (as in Sui and Aptos) where assets are owned objects passed by reference rather than shared global state. Contracts designed without these patterns may force sequential execution, negating the performance benefits of the underlying parallel engine.

The impact on the user experience and network economics is substantial. Parallel execution reduces latency for users, as their unrelated transactions no longer wait in a single-file queue. For validators and sequencers, it increases hardware utilization, allowing them to process more transactions per unit of cost, which can lower transaction fees. This scalability is critical for supporting high-frequency DeFi trading, web-scale gaming, and decentralized social media applications that require real-time interaction with the chain.

Looking forward, parallel execution is becoming a standard feature for new L1s and high-performance L2 rollups. Ethereum itself is exploring this through EIP-648 for parallelizable transactions and various L2 implementations. The evolution involves not just runtime changes but also new virtual machine architectures, like the Move VM or FuelVM, built with parallel processing as a first-class design principle. As blockchain applications grow more complex, the shift from sequential to parallel execution represents a fundamental leap in architectural design to meet real-world demand.

prerequisites
PARALLEL EXECUTION

Prerequisites and System Requirements

To implement parallel transaction execution, you need specific hardware, software, and a foundational understanding of concurrent programming and blockchain state management.

Parallel execution requires a modern multi-core CPU (8+ cores recommended) and at least 16GB of RAM to handle concurrent state operations efficiently. The core software prerequisite is a programming language with robust concurrency primitives, such as Rust (with std::sync and std::thread), Go (goroutines and channels), or Java. You'll also need a foundational understanding of data structures for managing shared state, including concurrent hash maps, read-write locks, and atomic operations to prevent race conditions. Familiarity with a blockchain client's codebase, like Geth for Ethereum or Aptos' Move VM, is essential for integration.

The key conceptual prerequisite is understanding a transaction's read-write set—the specific storage slots it accesses and modifies. Parallel execution is only safe for transactions with non-overlapping read-write sets. You must implement a runtime dependency analyzer, often using a Transaction struct that pre-declares its accessed accounts or keys. For example, in a Solana-style model, you would specify required_accounts. Systems like Aptos Block-STM use this information to speculatively execute transactions in parallel and then validate results, requiring mechanisms for conflict detection and re-execution.

Your development environment should include profiling and benchmarking tools (e.g., perf, pprof) to identify concurrency bottlenecks and validate performance gains. Setting up a local testnet with a transaction generator is crucial for simulating realistic load. Essential libraries include a fast cryptographic suite (like libsecp256k1) for signature verification—a common parallelization target—and a high-performance database (RocksDB, Sled) that supports concurrent access. Start by forking a known sequential client and instrumenting its execution pipeline to log transaction dependencies before attempting any parallel modifications.

A critical system requirement is a deterministic execution environment. Parallelism must not introduce non-determinism in block validation. This necessitates a strict, reproducible ordering of transactions post-execution for state commitment. You'll need to design a finalization layer that takes the results of parallel execution and applies them to the canonical state in a deterministic order, ensuring all nodes reach identical final states. Testing for edge cases, such as transactions with complex, nested dependency chains or accessing a large number of shared state elements, is a mandatory part of the setup process.

key-concepts-text
CORE CONCEPTS

Parallel Transaction Execution in Blockchains

Parallel execution allows a blockchain to process multiple transactions simultaneously, dramatically increasing throughput. This guide explains the core concepts of transaction dependencies and concurrency models.

Parallel transaction execution is a performance optimization that processes multiple transactions at the same time, in contrast to the strictly sequential model used by networks like Ethereum's EVM. The primary challenge is identifying which transactions can be safely executed in parallel without causing state conflicts. This requires analyzing transaction dependencies—when one transaction reads or writes data that another transaction intends to modify. For example, two transfers from the same wallet cannot be parallelized because they both update the same nonce and balance.

To enable parallelism, a runtime must implement a concurrency control mechanism. The most common approach is optimistic parallel execution, used by networks like Solana and Aptos. Here, transactions are speculatively executed in parallel based on a predicted set of accessed memory addresses (e.g., accounts, storage keys). After execution, the results are validated. If a read-write conflict is detected—where two transactions touched the same state—one transaction is re-executed sequentially. This model maximizes hardware utilization but requires efficient conflict detection.

An alternative is deterministic parallel execution, where dependencies are declared upfront. A developer or compiler specifies which state a transaction will access using a read/write set. The scheduler can then group non-conflicting transactions with perfect accuracy. Frameworks like the Move language and the Sui Move implementation use this object-centric model. By declaring dependencies on specific objects, the runtime knows exactly which transactions can be safely parallelized, eliminating re-execution overhead and providing predictable performance.

Implementing parallelism requires changes at the node client level. The scheduler component is responsible for grouping transactions into batches for parallel processing. It uses the dependency information—either speculated or declared—to build a Directed Acyclic Graph (DAG) where nodes are transactions and edges are dependencies. Transactions without edges between them can be processed concurrently. The execution engine then processes these independent batches, often leveraging multi-core CPUs or GPUs, before committing results to the blockchain state.

The benefits are substantial: Solana's Sealevel runtime claims to handle tens of thousands of Transactions Per Second (TPS) by parallelizing across GPU cores. Aptos's Block-STM achieves high throughput via optimistic execution and software transactional memory. For developers, understanding these models is key to writing efficient dApps. Structuring transactions to minimize state contention—such as using isolated token accounts or distinct data objects—can significantly improve execution speed and reduce user fees in a parallelized environment.

ARCHITECTURAL APPROACHES

Parallel Execution Models Comparison

A comparison of the primary technical models for parallel transaction execution in blockchain VMs, highlighting key trade-offs for developers.

Execution ModelBlock-STM (Aptos/Sui)Sealevel (Solana)FuelVM (Fuel Network)EVM (Baseline)

Concurrency Control

Optimistic (re-execute conflicts)

Deterministic (pre-declared accounts)

UTXO-based (stateful predicates)

Sequential (global lock)

Conflict Detection

Runtime, post-execution

Static, compile-time

Static, via input/output IDs

N/A

State Access Model

Arbitrary, dynamic

Explicit, declared

UTXO ownership predicates

Global shared state

Throughput (Max TPS)

160,000

~65,000

Theoretical > 10,000

~30 (Ethereum L1)

Developer Overhead

Low (implicit parallelism)

Medium (requires account declaration)

High (requires predicate design)

None

Native Support for Atomic Bundles

Primary Use Case

General-purpose smart contracts

High-frequency trading, DeFi

Modular execution layer, payments

General-purpose (baseline)

evm-implementation-patterns
TUTORIAL

Implementing Parallel EVM Execution

A technical guide to architecting and implementing parallel transaction execution for Ethereum Virtual Machine (EVM) clients, moving beyond sequential processing.

Parallel EVM execution is an architectural optimization that processes multiple transactions concurrently by identifying and executing independent transactions simultaneously. Unlike the default sequential execution model, which processes one transaction at a time, parallel execution leverages multi-core CPUs to increase throughput. The core challenge is dependency analysis—determining which transactions can be run in parallel without causing state conflicts, such as accessing the same smart contract storage slot. This is analogous to techniques used in databases and other high-performance computing systems.

The implementation requires a two-phase approach: a scheduling phase and an execution phase. First, a scheduler analyzes a block's transaction list to build a dependency graph. Transactions are nodes, and edges represent conflicts (e.g., both write to address 0xabc). Independent transactions (no connecting edges) are grouped into batches. This analysis can be based on accessed addresses (tx.to, tx.from) and storage keys, a method known as access list or read/write set analysis. Monad and Sei have pioneered production implementations of this model.

For developers, implementing a basic scheduler involves instrumenting the EVM to track accessed state during a preliminary dry-run. The pseudocode illustrates the concept:

python
# Pseudo-scheduler
def build_dependency_graph(transactions):
    graph = {}
    access_sets = []
    for tx in transactions:
        # Dry-run to get read/write set
        accesses = simulate_and_track_accesses(tx)
        access_sets.append(accesses)
    # Create graph edges for conflicts
    for i, set_i in enumerate(access_sets):
        for j, set_j in enumerate(access_sets):
            if i != j and sets_conflict(set_i, set_j):
                add_edge(graph, i, j)
    return graph

The function sets_conflict returns true if the transactions share a write operation to the same state key.

After building the graph, execute transactions in parallel using the graph's connected components. All transactions within a connected component (a subgraph where nodes are connected by edges) have dependencies and must run sequentially. However, separate components are independent and can be assigned to different CPU cores. A thread pool or work-stealing executor can manage this. The final, deterministic state must match the sequential execution result, making the scheduling algorithm's accuracy critical. Incorrect dependency detection leads to non-deterministic bugs and chain forks.

Key optimizations include speculative execution and optimistic parallelism. Speculative execution assumes transactions are independent, executes them in parallel, and validates post-execution; if a conflict is detected, it re-executes the conflicting transactions sequentially. Optimistic parallelism, used by Solana and Aptos, takes this further by committing results and having a separate conflict resolution layer. For EVM clients, integrating parallel execution requires modifying the core execution engine (e.g., Geth's state_processor.go or Erigon's staging) and adding a concurrent state database with fine-grained locking.

Testing is paramount. Use historical mainnet blocks to verify that parallel execution yields identical state roots and gas consumption as sequential processing. Fuzz testing with random transaction sequences can uncover hidden dependency edge cases. The performance gain is not linear; it depends on the inherent parallelism within a block's transactions. DeFi blocks with many independent token transfers may see 4-8x speedups, while complex, interdependent NFT minting transactions may offer minimal gains. The ultimate goal is reducing block processing time, enabling higher throughput for L2 rollups and making node operation more efficient.

svm-implementation-patterns
GUIDE

Implementing Parallel SVM Execution

This guide explains how to implement parallel transaction execution on the Solana Virtual Machine (SVM) to maximize throughput and reduce latency in high-performance applications.

Parallel execution on the Solana Virtual Machine (SVM) is a core architectural feature that allows multiple non-conflicting transactions to be processed simultaneously. Unlike sequential blockchains, the SVM uses a runtime that can identify independent transactions—those that access different state accounts—and schedule them across multiple CPU cores. This is enabled by Solana's Sealevel parallel smart contracts runtime, which requires transactions to declare all accounts they will read from or write to during execution. This upfront declaration allows the scheduler to build a dependency graph and execute transactions in parallel where possible, significantly increasing the network's overall capacity.

To support parallel execution in your application, you must structure your programs and transactions correctly. The key is minimizing state conflicts. Transactions that touch overlapping accounts cannot run in parallel and will be serialized. For developers, this means designing programs with isolated state accounts where feasible. For example, an NFT mint program that writes to a unique mint account per user allows those mints to execute in parallel, while a program that updates a single global counter will force all related transactions into a sequential queue. Use solana-program's declare_id! macro and the AccountMeta struct to explicitly list all accounts a transaction will access.

Implementing parallel execution involves both on-chain program logic and off-chain transaction construction. On-chain, ensure your program's instruction uses the accounts constraint to specify each account's permissions (signer, mutable, etc.). Off-chain, when building a bundle of transactions, you can use the Connection API's sendTransaction method or RPC's sendTransaction endpoint. However, to truly leverage parallelism, you should batch transactions that are independent. Tools like the @solana/web3.js library's sendAndConfirmRawTransaction can be used with a custom client-side scheduler that groups non-overlapping transactions based on their stated account keys before submission.

Here is a simplified code example demonstrating an instruction that supports parallel execution by operating on isolated user accounts:

rust
use solana_program::{
    account_info::{next_account_info, AccountInfo},
    entrypoint,
    entrypoint::ProgramResult,
    msg,
    program_error::ProgramError,
    pubkey::Pubkey,
};

entrypoint!(process_instruction);

fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    _instruction_data: &[u8],
) -> ProgramResult {
    let accounts_iter = &mut accounts.iter();
    let user_account = next_account_info(accounts_iter)?;
    let user_data_account = next_account_info(accounts_iter)?;

    // Ensure this transaction only mutates this user's specific data account.
    if !user_account.is_signer {
        return Err(ProgramError::MissingRequiredSignature);
    }
    if !user_data_account.is_writable {
        return Err(ProgramError::InvalidAccountData);
    }
    // ... logic to write to user_data_account ...
    msg!("Processed transaction for: {:?}", user_account.key);
    Ok(())
}

This design allows multiple invocations for different user_data_accounts to run in parallel.

To optimize for parallelism, monitor and analyze transaction patterns. Use Solana's RPC methods like getRecentPerformanceSamples or tools like Solana Explorer to see if your transactions are being processed concurrently. Common pitfalls include unintentional sharing of "program-derived address" (PDA) accounts or global state, which creates bottlenecks. For advanced use cases, consider using the rayon crate within your program for CPU-bound parallel processing within a single instruction, though this is distinct from the SVM's runtime-level parallelism. The goal is to architect your application's state model to maximize the number of non-overlapping transactions, directly translating to higher throughput and a better user experience.

Parallel execution is not automatic; it requires deliberate design. Start by auditing your program's account dependencies. Use local test validators and simulate transaction loads to identify contention points. The Solana Cookbook provides further examples on account constraints and program design. By adhering to the principles of explicit state declaration and isolated account design, you can build applications that fully leverage the SVM's parallel capabilities, achieving the scalability that defines the Solana network.

dependency-analysis-deep-dive
PARALLEL EXECUTION

Advanced Dependency Analysis

A guide to identifying independent transactions to maximize throughput in blockchain execution engines.

Parallel transaction execution is a performance optimization that allows a blockchain node to process multiple transactions simultaneously, rather than sequentially. This is achieved by identifying which transactions are independent—meaning they do not access the same state variables—and executing them in parallel. The core challenge is performing dependency analysis to construct a Directed Acyclic Graph (DAG) of transactions, where edges represent read/write conflicts. Modern execution clients like Solana's Sealevel, Aptos' Block-STM, and Sui's object-centric model implement variations of this concept to achieve high throughput.

To support parallel execution, a runtime must first define its state access model. The two primary models are: 1) an account-based model (like Ethereum) where transactions specify which accounts they will read from or write to, and 2) an object-based model (like Sui) where transactions operate on distinct, versioned objects. Before execution, a scheduler analyzes the declared access sets of all transactions in a block. Transactions with non-overlapping access sets are marked as independent and can be scheduled for parallel processing, dramatically improving block execution time.

Implementing dependency analysis requires instrumenting the execution environment. For Ethereum Virtual Machine (EVM) transactions, this involves tracking accessed storage slots via the SLOAD and SSTORE opcodes. A pre-execution simulation or a static analysis of calldata can build an initial dependency graph. More advanced systems like Block-STM use an optimistic approach: they execute all transactions in parallel first, then validate the results and re-execute only those with conflicts in a later round. This reduces the need for perfect pre-analysis.

Here is a simplified conceptual example of building a dependency graph in pseudocode:

python
# Pseudo-code for dependency analysis
transactions = [tx1, tx2, tx3]
access_sets = {}
for tx in transactions:
    access_sets[tx] = simulate_access_pattern(tx)  # Returns set of storage keys

graph = DependencyGraph()
for tx_a in transactions:
    for tx_b in transactions:
        if tx_a != tx_b and access_sets[tx_a].intersects(access_sets[tx_b]):
            graph.add_dependency(tx_a, tx_b)  # Conflict found
# Schedule independent transactions (no edges between them) in parallel

Key challenges in dependency analysis include handling false conflicts from overly broad access declarations and managing dynamic calls that access unpredictable addresses. Solutions involve using more granular state identifiers (like individual storage slots versus whole contracts) and hybrid optimistic/pessimistic scheduling. The performance gain is substantial; parallel execution can increase throughput by 5-10x for blocks with many independent DeFi swaps or NFT transfers, making it a critical optimization for scaling monolithic blockchains.

To integrate parallel execution, developers should audit their smart contracts for state access patterns. Minimizing the scope of storage writes and using dedicated contracts for unrelated logic can increase a transaction's independence. For node operators, choosing a client with robust parallel execution support, like Erigon for Ethereum or the official Aptos node, is essential. The future of this field involves standardized state access lists in transactions (EIP-2930) and more intelligent schedulers that learn from historical patterns to optimize the DAG.

ARCHITECTURE COMPARISON

Expected Performance Metrics and Bottlenecks

Key performance indicators and common bottlenecks for different parallel execution models.

Metric / BottleneckBlock-STM (Aptos/Sui)Sharded State (NEAR)EVM Parallel (Monad)

Theoretical Peak TPS

160,000

~ 100,000

10,000

Average Latency (Finality)

< 1 sec

1-2 sec

1-3 sec

State Access Conflicts

High (Optimistic)

Low (Shard Isolation)

Medium (DAG Scheduling)

Memory Bottleneck

True

False

True

Cross-Shard Tx Cost

2-5x Base Cost

Read-Write Set Size Limit

~5 MB per block

Per-shard limit

Block gas limit

Developer Complexity

Low (Automatic)

High (Manual Sharding)

Medium (Explicit Hints)

Worst-Case Re-execution

Up to 30% of block

Minimal

Up to 15% of block

testing-and-debugging
CONSENSUS SAFETY

How to Support Parallel Transaction Execution

Parallel transaction execution is a performance optimization that processes multiple transactions simultaneously, but it introduces unique challenges for testing, debugging, and maintaining consensus safety.

Parallel execution requires a runtime that can identify which transactions are independent and can be processed concurrently without causing state conflicts. This is typically achieved through techniques like deterministic concurrency control or software transactional memory (STM). The goal is to maximize throughput while ensuring the final state is identical to a serial execution. For blockchains, this determinism is non-negotiable; all nodes must reach the same state. Frameworks like Aptos' Block-STM and Sui's object-centric model demonstrate different architectural approaches to this problem.

Testing parallel execution demands a focus on race conditions and non-determinism. Traditional unit tests are insufficient because they often run serially. You must implement fuzz testing with randomized transaction ordering and property-based testing to verify invariants hold under all possible parallel schedules. Tools like the Move Prover for Aptos or custom deterministic replay loggers are essential. A core test is to run the same block of transactions in parallel and serial modes and assert the resulting state root hash is identical.

Debugging failures in a parallel environment is significantly more complex. A bug may only manifest under a specific, rare interleaving of transactions. Effective strategies include:

  • Detailed execution traces that log read/write sets for each transaction.
  • Cycle detection in transaction dependencies to identify deadlocks.
  • Visualization tools that graph transaction dependencies and execution timelines. When a non-deterministic bug is found, you must be able to reproduce the exact schedule, which requires capturing and replaying a precise execution trace.

Consensus safety hinges on the guarantee that all validators produce the same output. Parallel execution adds a layer where validators must have identical logic for dependency detection and conflict resolution. A vulnerability could allow a malicious validator to propose a valid block that causes honest validators to compute a different state. Formal verification of the parallel scheduling algorithm is crucial. Furthermore, the system must be resilient to read/write set ambiguities and ensure that the gas metering and fee calculation are also deterministic in a parallel context.

To implement support safely, start with a simple, correct serial executor. Then, incrementally add concurrency with a lock-based or multi-version concurrency control (MVCC) system, instrumenting each step with rigorous equivalence checks. Profile to ensure the overhead of dependency tracking doesn't negate performance gains. Finally, integrate parallel execution testing into your CI/CD pipeline, requiring that every commit passes a battery of randomized parallel/sequential equivalence tests. This disciplined approach is key to unlocking scalability without compromising the bedrock of consensus.

PARALLEL EXECUTION

Frequently Asked Questions

Answers to common technical questions and troubleshooting for developers implementing parallel transaction execution in EVM environments.

Parallel transaction execution is a performance optimization where multiple transactions are processed simultaneously, rather than sequentially. It works by identifying transactions that are independent—meaning they access non-overlapping state—and executing them concurrently across multiple CPU cores.

Key Mechanism:

  • A scheduler analyzes the transaction mempool for conflicts in read/write sets.
  • Transactions modifying the same smart contract storage slot or address must be executed in order.
  • Independent transactions (e.g., two unrelated ERC-20 transfers) are dispatched to parallel execution threads.
  • Results are validated and committed to the blockchain state in a deterministic order.

This approach, used by networks like Solana and Monad, and by clients like Erigon, can significantly increase throughput (TPS) by utilizing modern multi-core hardware.

conclusion
IMPLEMENTATION GUIDE

Conclusion and Next Steps

Parallel transaction execution is a fundamental scaling technique. This guide concludes with key takeaways and practical steps for developers.

Implementing parallel execution requires a shift in smart contract design. Key principles include minimizing shared state dependencies, using storage keys to identify independent operations, and adopting a data-oriented architecture. For example, an NFT marketplace can process transfers, listings, and bids in parallel if they affect different token IDs. The primary challenge is identifying the read-write sets of transactions before execution, a technique known as optimistic concurrency control used by networks like Solana and Aptos.

To start building, choose a framework that supports parallelism. For Ethereum L2s, explore the EVM Parallelism research from teams like Polygon. For new chains, consider SDKs like Aptos Move or Sui Move, which have parallelism designed into their object model. Begin by profiling your dApp: identify transactions that are frequently batched together but operate on distinct data, such as approve and swap in a DEX. These are ideal candidates for your first parallel execution tests.

The next step is to write contracts with parallelism in mind. Use mappings with unique keys instead of single global variables. Structure functions to accept arrays of items to process, enabling vectorization. Thoroughly test with tools like Aptos Localnet or Sui Devnet to detect state conflicts. Remember, the goal is not just speed but also maximizing validator hardware utilization, which reduces costs for end-users.

Looking forward, the ecosystem is evolving rapidly. Keep an eye on EIP-6480 for parallel EVM standardization and new virtual machines like FuelVM that prioritize parallel processing. The integration of parallel execution with other scaling solutions like sharding and optimistic rollups will define the next generation of high-throughput blockchains. Start experimenting now to build the scalable applications of tomorrow.

How to Support Parallel Transaction Execution in Blockchains | ChainScore Guides