From cc6ac4c9d962e38e1cc24988009947b03757f64c Mon Sep 17 00:00:00 2001 From: CalDescent Date: Mon, 31 May 2021 17:36:21 +0100 Subject: [PATCH 1/8] Bump version to 1.5.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0bc2c495..59f0bb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 1.5.2 + 1.5.3 jar true From 0345c5c03b1990f5fb8a0b059ca4fe9836e9ede6 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Mon, 31 May 2021 21:27:42 +0100 Subject: [PATCH 2/8] Updated AdvancedInstaller project for v1.5.3 --- WindowsInstaller/Qortal.aip | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WindowsInstaller/Qortal.aip b/WindowsInstaller/Qortal.aip index 2c181933..b7423ada 100755 --- a/WindowsInstaller/Qortal.aip +++ b/WindowsInstaller/Qortal.aip @@ -17,10 +17,10 @@ - + - + @@ -212,7 +212,7 @@ - + From 8c305d8390f88fe35aaa85b26908c27a9d026a6d Mon Sep 17 00:00:00 2001 From: CalDescent Date: Tue, 1 Jun 2021 08:39:38 +0100 Subject: [PATCH 3/8] Reduced log levels of recent synchronizer / controller log additions from INFO to DEBUG. These are no longer necessary now that we have achieved good stability in the network. --- src/main/java/org/qortal/controller/Controller.java | 4 ++-- src/main/java/org/qortal/controller/Synchronizer.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 9d80dba7..185f344a 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -678,7 +678,7 @@ public class Controller extends Thread { final int peersRemoved = peersBeforeComparison - peers.size(); if (peersRemoved > 0 && peers.size() > 0) - LOGGER.info(String.format("Ignoring %d peers on inferior chains. Peers remaining: %d", peersRemoved, peers.size())); + LOGGER.debug(String.format("Ignoring %d peers on inferior chains. Peers remaining: %d", peersRemoved, peers.size())); if (peers.isEmpty()) return; @@ -687,7 +687,7 @@ public class Controller extends Thread { StringBuilder finalPeersString = new StringBuilder(); for (Peer peer : peers) finalPeersString = finalPeersString.length() > 0 ? finalPeersString.append(", ").append(peer) : finalPeersString.append(peer); - LOGGER.info(String.format("Choosing random peer from: [%s]", finalPeersString.toString())); + LOGGER.debug(String.format("Choosing random peer from: [%s]", finalPeersString.toString())); } // Pick random peer to sync with diff --git a/src/main/java/org/qortal/controller/Synchronizer.java b/src/main/java/org/qortal/controller/Synchronizer.java index 62064d96..c0792117 100644 --- a/src/main/java/org/qortal/controller/Synchronizer.java +++ b/src/main/java/org/qortal/controller/Synchronizer.java @@ -139,7 +139,7 @@ public class Synchronizer { if (wereNewRequestsMade) { final long totalTimeTaken = System.currentTimeMillis() - startTime; - LOGGER.info(String.format("Finished searching for common blocks with %d peer%s. Found: %d. Total time taken: %d ms", peers.size(), (peers.size() != 1 ? "s" : ""), commonBlocksFound, totalTimeTaken)); + LOGGER.debug(String.format("Finished searching for common blocks with %d peer%s. Found: %d. Total time taken: %d ms", peers.size(), (peers.size() != 1 ? "s" : ""), commonBlocksFound, totalTimeTaken)); } return SynchronizationResult.OK; From c443187d0b28a2e800e8acbc0ce239963ec3c3ef Mon Sep 17 00:00:00 2001 From: CalDescent Date: Tue, 1 Jun 2021 20:06:37 +0100 Subject: [PATCH 4/8] Reduce log spam by logging the total number of expired unconfirmed transactions that are deleted, rather than each one individually. The individual deletion logs have been moved from INFO to DEBUG. --- src/main/java/org/qortal/controller/Controller.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 185f344a..86d405a4 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -883,14 +883,19 @@ public class Controller extends Thread { List transactions = repository.getTransactionRepository().getUnconfirmedTransactions(); + int deletedCount = 0; for (TransactionData transactionData : transactions) { Transaction transaction = Transaction.fromData(repository, transactionData); if (now >= transaction.getDeadline()) { - LOGGER.info(() -> String.format("Deleting expired, unconfirmed transaction %s", Base58.encode(transactionData.getSignature()))); + LOGGER.debug(() -> String.format("Deleting expired, unconfirmed transaction %s", Base58.encode(transactionData.getSignature()))); repository.getTransactionRepository().delete(transactionData); + deletedCount++; } } + if (deletedCount > 0) { + LOGGER.info(String.format("Deleted %d expired, unconfirmed transaction%s", deletedCount, (deletedCount == 1 ? "" : "s"))); + } repository.saveChanges(); } catch (DataException e) { From 1648a74ed725e28af86fbc0aed6914d0b0f3fe05 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 5 Jun 2021 11:25:05 +0100 Subject: [PATCH 5/8] Removed code which auto deletes trade bot data if it can't locate the AT after 24 hours. It's not a good idea to ever delete trade bot data, since it can contain private keys necessary to redeem or refund LTC. We have seen at least one instance of this where the trade bot data was deleted for an active trade. We still have the auto backup in these cases, so the keys are recoverable, but it's safest to avoid any auto deletions. --- .../controller/tradebot/BitcoinACCTv1TradeBot.java | 9 --------- .../controller/tradebot/LitecoinACCTv1TradeBot.java | 9 --------- 2 files changed, 18 deletions(-) diff --git a/src/main/java/org/qortal/controller/tradebot/BitcoinACCTv1TradeBot.java b/src/main/java/org/qortal/controller/tradebot/BitcoinACCTv1TradeBot.java index 802a2870..ca2e2518 100644 --- a/src/main/java/org/qortal/controller/tradebot/BitcoinACCTv1TradeBot.java +++ b/src/main/java/org/qortal/controller/tradebot/BitcoinACCTv1TradeBot.java @@ -383,15 +383,6 @@ public class BitcoinACCTv1TradeBot implements AcctTradeBot { atData = repository.getATRepository().fromATAddress(tradeBotData.getAtAddress()); if (atData == null) { LOGGER.debug(() -> String.format("Unable to fetch trade AT %s from repository", tradeBotData.getAtAddress())); - - // If it has been over 24 hours since we last updated this trade-bot entry then assume AT is never coming back - // and so wipe the trade-bot entry - if (tradeBotData.getTimestamp() + MAX_AT_CONFIRMATION_PERIOD < NTP.getTime()) { - LOGGER.info(() -> String.format("AT %s has been gone for too long - deleting trade-bot entry", tradeBotData.getAtAddress())); - repository.getCrossChainRepository().delete(tradeBotData.getTradePrivateKey()); - repository.saveChanges(); - } - return; } diff --git a/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java b/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java index 286cbf74..3d8d5054 100644 --- a/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java +++ b/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java @@ -387,15 +387,6 @@ public class LitecoinACCTv1TradeBot implements AcctTradeBot { atData = repository.getATRepository().fromATAddress(tradeBotData.getAtAddress()); if (atData == null) { LOGGER.debug(() -> String.format("Unable to fetch trade AT %s from repository", tradeBotData.getAtAddress())); - - // If it has been over 24 hours since we last updated this trade-bot entry then assume AT is never coming back - // and so wipe the trade-bot entry - if (tradeBotData.getTimestamp() + MAX_AT_CONFIRMATION_PERIOD < NTP.getTime()) { - LOGGER.info(() -> String.format("AT %s has been gone for too long - deleting trade-bot entry", tradeBotData.getAtAddress())); - repository.getCrossChainRepository().delete(tradeBotData.getTradePrivateKey()); - repository.saveChanges(); - } - return; } From 76e1de38e8118f6af4b30ab399991282a693cadb Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 5 Jun 2021 12:31:49 +0100 Subject: [PATCH 6/8] Workaround for issue where sometimes an AT stays in "TRADING" mode even after it is marked as finished. This caused Bob's tradebot to enter BOB_REFUNDED mode instead of redeeming the LTC. This workaround treats "TRADING" as "REDEEMED" as long as the AT is finished. It will still enter the BOB_REFUNDED state if the AT's trade state is "REFUNDED" or "CANCELLED", to prevent it trying to redeem LTC without the secret. Longer term we need to prevent the AT itself from getting in this state to begin with, but this should at least solve the LTC redemption problem that occurs as a result. --- .../qortal/controller/tradebot/LitecoinACCTv1TradeBot.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java b/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java index 3d8d5054..0bd2972b 100644 --- a/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java +++ b/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java @@ -716,9 +716,9 @@ public class LitecoinACCTv1TradeBot implements AcctTradeBot { // Not finished yet return; - // If AT is not REDEEMED then something has gone wrong - if (crossChainTradeData.mode != AcctMode.REDEEMED) { - // Not redeemed so must be refunded/cancelled + // If AT is REFUNDED or CANCELLED then something has gone wrong + if (crossChainTradeData.mode == AcctMode.REFUNDED || crossChainTradeData.mode == AcctMode.CANCELLED) { + // Alice hasn't redeemed the QORT, so there is no point in trying to redeem the LTC TradeBot.updateTradeBotState(repository, tradeBotData, State.BOB_REFUNDED, () -> String.format("AT %s has auto-refunded - trade aborted", tradeBotData.getAtAddress())); From ecf044bed1704e8f06a93e42e88170d2681a5d74 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 6 Jun 2021 10:29:58 +0100 Subject: [PATCH 7/8] Removed qortal-backup folder from git --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d983d858..f1053cff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /db* /bin/ /target/ +/qortal-backup/ /log.txt.* /arbitrary* /Qortal-BTC* From 319e64bacc5f446a406c12511f843dcefff3f10a Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 6 Jun 2021 10:34:20 +0100 Subject: [PATCH 8/8] Defend against an edge case NPE in the chat messages websocket. --- .../java/org/qortal/api/websocket/ChatMessagesWebSocket.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java b/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java index 57ef1504..3dc2d494 100644 --- a/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/ChatMessagesWebSocket.java @@ -115,6 +115,9 @@ public class ChatMessagesWebSocket extends ApiWebSocket { } private void onNotify(Session session, ChatTransactionData chatTransactionData, List involvingAddresses) { + if (chatTransactionData == null) + return; + // We only want direct/non-group messages where sender/recipient match our addresses String recipient = chatTransactionData.getRecipient(); if (recipient == null)