1717import org .hyperledger .besu .cli .config .NetworkName ;
1818import org .hyperledger .besu .cli .util .VersionProvider ;
1919import org .hyperledger .besu .controller .BesuController ;
20- import org .hyperledger .besu .datatypes .Transaction ;
20+ import org .hyperledger .besu .datatypes .Hash ;
2121import org .hyperledger .besu .ethereum .chain .BlockchainStorage ;
2222
2323import java .nio .file .Path ;
2424import java .util .List ;
25+ import java .util .Optional ;
2526import java .util .concurrent .ExecutorService ;
2627import java .util .concurrent .Executors ;
2728
@@ -45,7 +46,7 @@ public class PrunePreMergeBlockDataSubCommand implements Runnable {
4546 private static final long MAINNET_MERGE_BLOCK_NUMBER = 15_537_393 ;
4647 private static final long SEPOLIA_MERGE_BLOCK_NUMBER = 1_735_371 ;
4748
48- private static final int DEFAULT_THREADS = 4 ;
49+ private static final int DEFAULT_THREADS = Runtime . getRuntime (). availableProcessors () - 1 ;
4950 private static final int DEFAULT_PRUNE_RANGE_SIZE = 10000 ;
5051
5152 @ SuppressWarnings ("unused" )
@@ -85,6 +86,9 @@ public void run() {
8586 network ,
8687 dataPath );
8788 final long mergeBlockNumber = getMergeBlockNumber (network );
89+ LOG .info ("Parallelizing with number of threads: {}" , threads );
90+ LOG .info ("Merge block number: {}" , mergeBlockNumber );
91+ LOG .info ("Prune range size: {}" , pruneRangeSize );
8892
8993 try (BesuController besuController = storageSubCommand .besuCommand .buildController ()) {
9094
@@ -97,13 +101,22 @@ public void run() {
97101 besuController .getDataStorageConfiguration ());
98102
99103 try (ExecutorService executor = Executors .newFixedThreadPool (threads )) {
104+ // cannot prune genesis block so start at 1
100105 for (long i = 1 ; i < mergeBlockNumber ; i += pruneRangeSize ) {
101- final long headerNumber = i ;
106+ LOG .info (
107+ "Starting pruning of block range {} to {}..." ,
108+ i ,
109+ Math .min (i + pruneRangeSize , mergeBlockNumber ));
110+ final long startBlockNumber = i ;
111+ final long endBlockNumber = Math .min (startBlockNumber + pruneRangeSize , mergeBlockNumber );
102112 executor .submit (
103- () -> deleteBlockRange (headerNumber , mergeBlockNumber , blockchainStorage ));
113+ () ->
114+ deleteBlockRange (
115+ startBlockNumber , endBlockNumber , mergeBlockNumber , blockchainStorage ));
104116 }
105117 }
106118 }
119+ LOG .info ("Pruning pre-merge blocks and transaction receipts completed" );
107120 }
108121
109122 private static long getMergeBlockNumber (final NetworkName network ) {
@@ -116,31 +129,25 @@ private static long getMergeBlockNumber(final NetworkName network) {
116129
117130 private void deleteBlockRange (
118131 final long startBlockNumber ,
132+ final long endBlockNumber ,
119133 final long mergeBlockNumber ,
120134 final BlockchainStorage blockchainStorage ) {
121135 BlockchainStorage .Updater updater = blockchainStorage .updater ();
122136 long headerNumber = startBlockNumber ;
123- final long endBlockNumber = Math .min (startBlockNumber + pruneRangeSize , mergeBlockNumber );
124137 do {
125- blockchainStorage
126- .getBlockHash (headerNumber )
127- .filter ((h ) -> blockchainStorage .getBlockBody (h ).isPresent ())
128- .ifPresent (
129- (h ) -> {
130- updater .removeTransactionReceipts (h );
131- updater .removeTotalDifficulty (h );
132- blockchainStorage
133- .getBlockBody (h )
134- .map ((bb ) -> bb .getTransactions ())
135- .ifPresent (
136- (transactions ) ->
137- transactions .stream ()
138- .map (Transaction ::getHash )
139- .forEach ((th ) -> updater .removeTransactionLocation (th )));
140- updater .removeBlockBody (h );
141- });
138+ final Optional <Hash > maybeBlockHash = blockchainStorage .getBlockHash (headerNumber );
139+ if (maybeBlockHash .isEmpty ()) {
140+ continue ;
141+ }
142+ final Hash h = maybeBlockHash .get ();
143+ updater .removeTransactionReceipts (h );
144+ updater .removeBlockBody (h );
142145 } while (++headerNumber < endBlockNumber );
143146 updater .commit ();
144- LOG .info ("Completed deletion of block range {} to {}" , startBlockNumber , endBlockNumber );
147+ LOG .info (
148+ "...completed pruning of block range {} to {}; estimated {} blocks remaining" ,
149+ startBlockNumber ,
150+ endBlockNumber ,
151+ mergeBlockNumber - endBlockNumber );
145152 }
146153}
0 commit comments