further electrum server optimization tweaks

This commit is contained in:
Craig Raw 2025-05-22 11:59:25 +02:00
parent 853949675e
commit 52470ee6d8

View file

@ -1048,6 +1048,10 @@ public class ElectrumServer {
List<BlockTransactionHash> recentTransactions = feeRatesSource.getRecentMempoolTransactions(); List<BlockTransactionHash> recentTransactions = feeRatesSource.getRecentMempoolTransactions();
Map<BlockTransactionHash, Transaction> setReferences = new HashMap<>(); Map<BlockTransactionHash, Transaction> setReferences = new HashMap<>();
setReferences.put(recentTransactions.getFirst(), null); setReferences.put(recentTransactions.getFirst(), null);
Random random = new Random();
if(random.nextBoolean()) {
setReferences.put(recentTransactions.get(random.nextInt(recentTransactions.size())), null);
}
Map<Sha256Hash, BlockTransaction> transactions = getTransactions(null, setReferences, Collections.emptyMap()); Map<Sha256Hash, BlockTransaction> transactions = getTransactions(null, setReferences, Collections.emptyMap());
return transactions.values().stream().filter(blxTx -> blxTx.getTransaction() != null).toList(); return transactions.values().stream().filter(blxTx -> blxTx.getTransaction() != null).toList();
} catch(Exception e) { } catch(Exception e) {
@ -2005,12 +2009,15 @@ public class ElectrumServer {
Map<String, String> subscribeScriptHashes = new HashMap<>(); Map<String, String> subscribeScriptHashes = new HashMap<>();
List<BlockTransaction> recentTransactions = electrumServer.getRecentMempoolTransactions(); List<BlockTransaction> recentTransactions = electrumServer.getRecentMempoolTransactions();
for(BlockTransaction blkTx : recentTransactions) { 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); TransactionOutput txOutput = blkTx.getTransaction().getOutputs().get(i);
String scriptHash = getScriptHash(txOutput); String scriptHash = getScriptHash(txOutput);
if(!subscribedScriptHashes.containsKey(scriptHash)) { if(!subscribedScriptHashes.containsKey(scriptHash)) {
subscribeScriptHashes.put("m/" + i, getScriptHash(txOutput)); 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<BlockTransaction> recentTransactions) {
ScheduledService<Void> broadcastService = new ScheduledService<>() { ScheduledService<Void> broadcastService = new ScheduledService<>() {
@Override @Override
protected Task<Void> createTask() { protected Task<Void> createTask() {
return new Task<>() { return new Task<>() {
@Override @Override
protected Void call() throws Exception { protected Void call() throws Exception {
for(BlockTransaction blkTx : recentTransactions) { if(!recentTransactions.isEmpty()) {
electrumServer.broadcastTransaction(blkTx.getTransaction()); Random random = new Random();
if(random.nextBoolean()) {
BlockTransaction blkTx = recentTransactions.get(random.nextInt(recentTransactions.size()));
electrumServer.broadcastTransaction(blkTx.getTransaction());
}
} }
return null; return null;
} }
}; };
} }
}; };
broadcastService.setDelay(Duration.seconds(Math.random() * 60 * 10)); broadcastService.setDelay(Duration.seconds(Math.random() * 60 ));
broadcastService.setPeriod(Duration.hours(1)); broadcastService.setPeriod(Duration.hours(1));
broadcastService.setOnSucceeded(_ -> broadcastService.cancel()); broadcastService.setOnSucceeded(_ -> broadcastService.cancel());
broadcastService.setOnFailed(_ -> broadcastService.cancel()); broadcastService.setOnFailed(_ -> broadcastService.cancel());