From 9a82930ae0dcab7d72817cefb98689727276844f Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Sun, 24 Dec 2023 08:18:51 -0800 Subject: [PATCH] refactor(coinjoin): manually call CoinJoinManager.start and stop --- .../bitcoinj/coinjoin/CoinJoinClientSession.java | 2 +- .../bitcoinj/coinjoin/utils/CoinJoinManager.java | 13 +++++++++++-- core/src/main/java/org/bitcoinj/core/Context.java | 5 +---- .../org/bitcoinj/coinjoin/CoinJoinSessionTest.java | 5 ++++- .../main/java/org/bitcoinj/tools/WalletTool.java | 1 + 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/coinjoin/CoinJoinClientSession.java b/core/src/main/java/org/bitcoinj/coinjoin/CoinJoinClientSession.java index 4387792ef..7cfbebd28 100644 --- a/core/src/main/java/org/bitcoinj/coinjoin/CoinJoinClientSession.java +++ b/core/src/main/java/org/bitcoinj/coinjoin/CoinJoinClientSession.java @@ -151,7 +151,7 @@ public int compare(CompactTallyItem o, CompactTallyItem t1) { boolean fCreateMixingCollaterals = !mixingWallet.hasCollateralInputs(); for (CompactTallyItem item : vecTally) { - if (!createDenominated(balanceToDenominate, item, fCreateMixingCollaterals)) continue; + if (!createDenominated(balanceToDenominate, item, fCreateMixingCollaterals, dryRun)) continue; return true; } diff --git a/core/src/main/java/org/bitcoinj/coinjoin/utils/CoinJoinManager.java b/core/src/main/java/org/bitcoinj/coinjoin/utils/CoinJoinManager.java index c26cd4608..a8652309e 100644 --- a/core/src/main/java/org/bitcoinj/coinjoin/utils/CoinJoinManager.java +++ b/core/src/main/java/org/bitcoinj/coinjoin/utils/CoinJoinManager.java @@ -76,11 +76,13 @@ public class CoinJoinManager { private RequestKeyParameter requestKeyParameter; private RequestDecryptedKey requestDecryptedKey; + private final ScheduledExecutorService scheduledExecutorService; - public CoinJoinManager(Context context) { + public CoinJoinManager(Context context, ScheduledExecutorService scheduledExecutorService) { this.context = context; coinJoinClientManagers = new HashMap<>(); coinJoinClientQueueManager = new CoinJoinClientQueueManager(context); + this.scheduledExecutorService = scheduledExecutorService; } public static boolean isCoinJoinMessage(Message message) { @@ -141,12 +143,14 @@ public void run() { } }; - public void start(ScheduledExecutorService scheduledExecutorService) { + public void start() { + log.info("CoinJoinManager starting..."); schedule = scheduledExecutorService.scheduleWithFixedDelay( maintenanceRunnable, 1, 1, TimeUnit.SECONDS); } public void stop() { + log.info("CoinJoinManager stopping..."); if (schedule != null) { schedule.cancel(false); schedule = null; @@ -159,6 +163,10 @@ public void stop() { } } + public boolean isRunning() { + return schedule != null && !schedule.isCancelled(); + } + public void initMasternodeGroup(AbstractBlockChain blockChain) { this.blockChain = blockChain; masternodeGroup = new MasternodeGroup(context, blockChain); @@ -231,6 +239,7 @@ public boolean disconnectMasternode(Masternode service) { @VisibleForTesting public void setMasternodeGroup(MasternodeGroup masternodeGroup) { this.masternodeGroup = masternodeGroup; + masternodeGroup.setCoinJoinManager(this); } public SettableFuture getMixingFinishedFuture(Wallet wallet) { diff --git a/core/src/main/java/org/bitcoinj/core/Context.java b/core/src/main/java/org/bitcoinj/core/Context.java index fa3629bf9..b0b4b73c5 100644 --- a/core/src/main/java/org/bitcoinj/core/Context.java +++ b/core/src/main/java/org/bitcoinj/core/Context.java @@ -282,7 +282,7 @@ public void initDash(boolean liteMode, boolean allowInstantX, @Nullable EnumSet< chainLockHandler = new ChainLocksHandler(this); llmqBackgroundThread = new LLMQBackgroundThread(this); masternodeMetaDataManager = new MasternodeMetaDataManager(this); - coinJoinManager = new CoinJoinManager(this); + coinJoinManager = new CoinJoinManager(this, scheduledExecutorService); initializedObjects = true; } @@ -532,9 +532,6 @@ public void start() { scheduledGovernance = scheduledExecutorService.scheduleWithFixedDelay( () -> governanceManager.doMaintenance(), 60, 5, TimeUnit.MINUTES); } - if (initializedObjects) { - coinJoinManager.start(scheduledExecutorService); - } } public void shutdown() { diff --git a/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java b/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java index 202ec6310..30080880f 100644 --- a/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java +++ b/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java @@ -40,6 +40,7 @@ import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.core.Utils; import org.bitcoinj.crypto.BLSLazyPublicKey; +import org.bitcoinj.crypto.BLSScheme; import org.bitcoinj.crypto.BLSSecretKey; import org.bitcoinj.evolution.SimplifiedMasternodeListDiff; import org.bitcoinj.evolution.SimplifiedMasternodeListEntry; @@ -108,7 +109,7 @@ public CoinJoinSessionTest(ClientType clientType) { @Before public void setUp() throws Exception { super.setUp(); - + BLSScheme.setLegacyDefault(false); BriefLogFormatter.initVerbose(); Utils.setMockClock(); // Use mock clock wallet.freshReceiveKey(); @@ -164,6 +165,7 @@ public void setUp() throws Exception { globalTimeout = Timeout.seconds(30); mixingWallet = (WalletEx) wallet; + wallet.getContext().coinJoinManager.start(); } protected Wallet createWallet(KeyChainGroup keyChainGroup) { @@ -173,6 +175,7 @@ protected Wallet createWallet(KeyChainGroup keyChainGroup) { @Override @After public void tearDown() { + wallet.getContext().coinJoinManager.stop(); super.tearDown(); } diff --git a/tools/src/main/java/org/bitcoinj/tools/WalletTool.java b/tools/src/main/java/org/bitcoinj/tools/WalletTool.java index bf4955669..6761dec7a 100644 --- a/tools/src/main/java/org/bitcoinj/tools/WalletTool.java +++ b/tools/src/main/java/org/bitcoinj/tools/WalletTool.java @@ -1682,6 +1682,7 @@ private static void mix() { wallet.getContext().coinJoinManager.addTransationListener (Threading.SAME_THREAD, reporter); wallet.getContext().blockChain.addNewBestBlockListener(Threading.SAME_THREAD, reporter); + wallet.getContext().coinJoinManager.start(); // mix coins try { CoinJoinClientManager it = wallet.getContext().coinJoinManager.coinJoinClientManagers.get(wallet.getDescription());