From 52470ee6d8ca18918b220b7eccce7e69d996a392 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Thu, 22 May 2025 11:59:25 +0200 Subject: [PATCH] further electrum server optimization tweaks --- .../sparrow/net/ElectrumServer.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sparrowwallet/sparrow/net/ElectrumServer.java b/src/main/java/com/sparrowwallet/sparrow/net/ElectrumServer.java index 83441f97..88972ada 100644 --- a/src/main/java/com/sparrowwallet/sparrow/net/ElectrumServer.java +++ b/src/main/java/com/sparrowwallet/sparrow/net/ElectrumServer.java @@ -1048,6 +1048,10 @@ public class ElectrumServer { List recentTransactions = feeRatesSource.getRecentMempoolTransactions(); Map setReferences = new HashMap<>(); setReferences.put(recentTransactions.getFirst(), null); + Random random = new Random(); + if(random.nextBoolean()) { + setReferences.put(recentTransactions.get(random.nextInt(recentTransactions.size())), null); + } Map transactions = getTransactions(null, setReferences, Collections.emptyMap()); return transactions.values().stream().filter(blxTx -> blxTx.getTransaction() != null).toList(); } catch(Exception e) { @@ -2005,12 +2009,15 @@ public class ElectrumServer { Map subscribeScriptHashes = new HashMap<>(); List recentTransactions = electrumServer.getRecentMempoolTransactions(); for(BlockTransaction blkTx : recentTransactions) { - for(int i = 0; i < blkTx.getTransaction().getOutputs().size() && subscribeScriptHashes.size() < 10; i++) { + for(int i = 0; i < blkTx.getTransaction().getOutputs().size(); i++) { TransactionOutput txOutput = blkTx.getTransaction().getOutputs().get(i); String scriptHash = getScriptHash(txOutput); if(!subscribedScriptHashes.containsKey(scriptHash)) { subscribeScriptHashes.put("m/" + i, getScriptHash(txOutput)); } + if(Math.random() < 0.1d) { + break; + } } } @@ -2023,21 +2030,31 @@ public class ElectrumServer { } } + if(!recentTransactions.isEmpty()) { + broadcastRecent(electrumServer, recentTransactions); + } + } + + private void broadcastRecent(ElectrumServer electrumServer, List recentTransactions) { ScheduledService broadcastService = new ScheduledService<>() { @Override protected Task createTask() { return new Task<>() { @Override protected Void call() throws Exception { - for(BlockTransaction blkTx : recentTransactions) { - electrumServer.broadcastTransaction(blkTx.getTransaction()); + if(!recentTransactions.isEmpty()) { + Random random = new Random(); + if(random.nextBoolean()) { + BlockTransaction blkTx = recentTransactions.get(random.nextInt(recentTransactions.size())); + electrumServer.broadcastTransaction(blkTx.getTransaction()); + } } return null; } }; } }; - broadcastService.setDelay(Duration.seconds(Math.random() * 60 * 10)); + broadcastService.setDelay(Duration.seconds(Math.random() * 60 )); broadcastService.setPeriod(Duration.hours(1)); broadcastService.setOnSucceeded(_ -> broadcastService.cancel()); broadcastService.setOnFailed(_ -> broadcastService.cancel());