Checkpoints were initially designed as minimal, immutable representations of atomic progress (a single transaction or bundle application). While this ensures cheap cloning and linear memory allocation, it introduces significant performance bottlenecks as the chain deepens:

Goal: Optimize state access time and payload building without sacrificing the flexibility of the checkpointing system.

Initial Profiling Results

These initial profiles were run on a standard slow laptop (so performance/timing is relative, not absolute) to try identify bottlenecks in the current checkpoint architecture and give a rough intuition of where we should focus first.

Test Case: Application of 1,000 simple transfer transactions (same sender, same value, random to address).

Logic Profiled: We targets CheckpointInner mutations. Specifically the execute_transaction flow where BundleState is produced (as our test case only produces transaction executables).

Timeline between “Apply Transactions” and “Build Payload”

image.png

Timeline of apply()

image.png