Skip to main content
Block rotation on a SKALE Chain limits the disk space used by consensus and full-sync nodes by pruning old blocks, ensuring efficient storage and performance. [Graphic placeholder: Sliding window of retained blocks with archive node storing full history]

Storage Allocation

Each SKALE Chain reserves 12.6 GB of storage for core blockchain data on consensus and full-sync nodes. This includes:
  • blocks
  • transactions and their receipts
  • log blooms (for efficient event filtering)
  • "best" — latest block info (lastBlockHash)
  • "chainStart" — earliest available block (firstBlockHash, useful after importing snapshots)
Block rotation does not apply to SKALE Archive Nodes or SKALE Indexer Nodes, which both store the full block history.

How Block Rotation Works

To stay within the 12.6 GB limit, SKALE Chains maintain a dynamic range of block data:
  • Only the most recent 80–100% of data is retained.
  • The oldest 20% is pruned as new blocks are added.
  • The rotation is based on data size, not block count.

Example

If block storage nears the 12.6 GB cap:
  • The chain deletes the oldest blocks until usage returns to ~80% of the cap.
  • Only recent blocks remain accessible on consensus and full-sync nodes.
This sliding-window model ensures that the chain operates efficiently without growing indefinitely in size.

Benefits

  • Efficient resource use — prevents storage bloat.
  • High performance — reduces read/write overhead.
  • Scalability — supports many lightweight SKALE Chains running in parallel. [Graphic placeholder: Performance vs. storage comparison for rotated vs. full history]

Full Historical Access

If your app or service requires the entire blockchain history (e.g. for analytics, block explorers, or archival indexing), use a SKALE Archive Node, which:
  • Stores all past blocks
  • Maintains full transaction and log history
  • Is not affected by block rotation
Want to run a SKALE Archive Node or build on top of historical data? Reach out on SKALE’s Discord or explore the developer docs.

API Changes

CallsChanges
eth_getBlockByNumber/eth_getBlockByHashmay return null
eth_getBlockTransactionCountByNumbermay return null
eth_getBlockTransactionCountByHashmay return null
eth_getUncleCountByBlockNumbermay return null
eth_getUncleCountByBlockHashmay return null
eth_getTransactionByBlockHashAndIndexmay return null
eth_getTransactionByBlockNumberAndIndexmay return null
eth_getUncleByBlockHashAndIndexmay return null
eth_getUncleByBlockNumberAndIndexmay return null
eth_getTransactionByHashmay return null
eth_getTransactionReceiptmay return null
eth_getFilterLogswill treat removed blocks as if they have 0 logs
eth_getLogswill treat removed blocks as if they have 0 logs