From 074cba22663b490a00bf9a6bbccd2ea9f609abc8 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 19 Feb 2023 17:33:17 +0000 Subject: [PATCH 01/13] Added QCHAT_AUDIO and QCHAT_VOICE services (limited to 10MB each) --- src/main/java/org/qortal/arbitrary/misc/Service.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/qortal/arbitrary/misc/Service.java b/src/main/java/org/qortal/arbitrary/misc/Service.java index 01419d2f..5ea1b7aa 100644 --- a/src/main/java/org/qortal/arbitrary/misc/Service.java +++ b/src/main/java/org/qortal/arbitrary/misc/Service.java @@ -84,6 +84,8 @@ public enum Service { QCHAT_IMAGE(420, true, 500*1024L, null), VIDEO(500, false, null, null), AUDIO(600, false, null, null), + QCHAT_AUDIO(610, true, 10*1024*1024L, null), + QCHAT_VOICE(620, true, 10*1024*1024L, null), BLOG(700, false, null, null), BLOG_POST(777, false, null, null), BLOG_COMMENT(778, false, null, null), From edacce1bac10147956fd1c6056bfea5292a014f5 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 19 Feb 2023 17:43:13 +0000 Subject: [PATCH 02/13] Improved logging when creating bootstraps, and catch/log all exceptions. --- src/main/java/org/qortal/api/resource/BootstrapResource.java | 2 +- src/main/java/org/qortal/repository/Bootstrap.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/api/resource/BootstrapResource.java b/src/main/java/org/qortal/api/resource/BootstrapResource.java index b9382dcb..78630dfb 100644 --- a/src/main/java/org/qortal/api/resource/BootstrapResource.java +++ b/src/main/java/org/qortal/api/resource/BootstrapResource.java @@ -60,7 +60,7 @@ public class BootstrapResource { bootstrap.validateBlockchain(); return bootstrap.create(); - } catch (DataException | InterruptedException | IOException e) { + } catch (Exception e) { LOGGER.info("Unable to create bootstrap", e); throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.REPOSITORY_ISSUE, e.getMessage()); } diff --git a/src/main/java/org/qortal/repository/Bootstrap.java b/src/main/java/org/qortal/repository/Bootstrap.java index 626433e8..2d2605cc 100644 --- a/src/main/java/org/qortal/repository/Bootstrap.java +++ b/src/main/java/org/qortal/repository/Bootstrap.java @@ -279,7 +279,9 @@ public class Bootstrap { LOGGER.info("Generating checksum file..."); String checksum = Crypto.digestHexString(compressedOutputPath.toFile(), 1024*1024); + LOGGER.info("checksum: {}", checksum); Path checksumPath = Paths.get(String.format("%s.sha256", compressedOutputPath.toString())); + LOGGER.info("Writing checksum to path: {}", checksumPath); Files.writeString(checksumPath, checksum, StandardOpenOption.CREATE); // Return the path to the compressed bootstrap file From cfa0b1d8ea27b1ca2fd0e6dae47f4b93bbcc2700 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 19 Feb 2023 18:02:22 +0000 Subject: [PATCH 03/13] Bump version to 3.8.6 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1eb8adb1..a7bac334 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 3.8.5 + 3.8.6 jar true From b2d31a7e0232fcaafd9e009e83e2cb7f038d8468 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 19 Feb 2023 22:26:22 +0000 Subject: [PATCH 04/13] Rebuild the name's history before processing a CancelSellNameTransaction. --- .../qortal/transaction/CancelSellNameTransaction.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java b/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java index 788492a9..876f0aed 100644 --- a/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java +++ b/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java @@ -5,6 +5,7 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.asset.Asset; +import org.qortal.controller.repository.NamesDatabaseIntegrityCheck; import org.qortal.data.naming.NameData; import org.qortal.data.transaction.CancelSellNameTransactionData; import org.qortal.data.transaction.TransactionData; @@ -81,7 +82,13 @@ public class CancelSellNameTransaction extends Transaction { @Override public void preProcess() throws DataException { - // Nothing to do + CancelSellNameTransactionData cancelSellNameTransactionData = (CancelSellNameTransactionData) transactionData; + + // Rebuild this name in the Names table from the transaction history + // This is necessary because in some rare cases names can be missing from the Names table after registration + // but we have been unable to reproduce the issue and track down the root cause + NamesDatabaseIntegrityCheck namesDatabaseIntegrityCheck = new NamesDatabaseIntegrityCheck(); + namesDatabaseIntegrityCheck.rebuildName(cancelSellNameTransactionData.getName(), this.repository); } @Override From 52c806f9e6b7171d4dd3c9bc33c371f4772a119f Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 19 Feb 2023 22:44:59 +0000 Subject: [PATCH 05/13] Bump version to 3.8.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a7bac334..fe59d980 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 3.8.6 + 3.8.7 jar true From d30eb6141ae7f8501d8a77d0045563c964fbb184 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Mon, 20 Feb 2023 18:10:21 +0000 Subject: [PATCH 06/13] Default minPeerVersion set to 3.8.7 --- src/main/java/org/qortal/settings/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 5799bd26..ae5dc173 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -215,7 +215,7 @@ public class Settings { public long recoveryModeTimeout = 10 * 60 * 1000L; /** Minimum peer version number required in order to sync with them */ - private String minPeerVersion = "3.8.2"; + private String minPeerVersion = "3.8.7"; /** Whether to allow connections with peers below minPeerVersion * If true, we won't sync with them but they can still sync with us, and will show in the peers list * If false, sync will be blocked both ways, and they will not appear in the peers list */ From c39b9c764b1e4a6589be19106d284a0d7d0e1204 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Mon, 20 Feb 2023 18:12:40 +0000 Subject: [PATCH 07/13] Bump version to 3.8.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fe59d980..f94e39b3 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 3.8.7 + 3.8.8 jar true From 148ca0af05fe15aaf76da9e0a01ecd9d257a460e Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 22 Feb 2023 09:16:52 +0000 Subject: [PATCH 08/13] Fixed long term bug with UPDATE_NAME transactions, causing name data to be incorrectly deleted if newName == name. --- src/main/java/org/qortal/naming/Name.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/naming/Name.java b/src/main/java/org/qortal/naming/Name.java index ecf826a5..1751cca8 100644 --- a/src/main/java/org/qortal/naming/Name.java +++ b/src/main/java/org/qortal/naming/Name.java @@ -16,6 +16,8 @@ import org.qortal.repository.Repository; import org.qortal.transaction.Transaction.TransactionType; import org.qortal.utils.Unicode; +import java.util.Objects; + public class Name { // Properties @@ -116,7 +118,7 @@ public class Name { this.repository.getNameRepository().save(this.nameData); - if (!updateNameTransactionData.getNewName().isEmpty()) + if (!updateNameTransactionData.getNewName().isEmpty() && !Objects.equals(updateNameTransactionData.getName(), updateNameTransactionData.getNewName())) // Name has changed, delete old entry this.repository.getNameRepository().delete(updateNameTransactionData.getNewName()); From ba9f3b335c1efa530a9979b8c1304bf02df77a31 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 22 Feb 2023 18:59:43 +0000 Subject: [PATCH 09/13] Added unit test to reproduce the UPDATE_NAME issue and prove that the fix is working correctly. --- .../org/qortal/test/naming/UpdateTests.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/test/java/org/qortal/test/naming/UpdateTests.java b/src/test/java/org/qortal/test/naming/UpdateTests.java index 24af5317..54227e94 100644 --- a/src/test/java/org/qortal/test/naming/UpdateTests.java +++ b/src/test/java/org/qortal/test/naming/UpdateTests.java @@ -219,6 +219,65 @@ public class UpdateTests extends Common { } } + // Test that multiple UPDATE_NAME transactions work as expected, when using a matching name and newName string + @Test + public void testDoubleUpdateNameWithMatchingNewName() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + // Register-name + PrivateKeyAccount alice = Common.getTestAccount(repository, "alice"); + String name = "name"; + String reducedName = "name"; + String data = "{\"age\":30}"; + + TransactionData initialTransactionData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name, data); + initialTransactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(initialTransactionData.getTimestamp())); + TransactionUtils.signAndMint(repository, initialTransactionData, alice); + + // Check name exists + assertTrue(repository.getNameRepository().nameExists(name)); + assertNotNull(repository.getNameRepository().fromReducedName(reducedName)); + + // Update name + TransactionData middleTransactionData = new UpdateNameTransactionData(TestTransaction.generateBase(alice), name, name, data); + TransactionUtils.signAndMint(repository, middleTransactionData, alice); + + // Check name still exists + assertTrue(repository.getNameRepository().nameExists(name)); + assertNotNull(repository.getNameRepository().fromReducedName(reducedName)); + + // Update name again + TransactionData newestTransactionData = new UpdateNameTransactionData(TestTransaction.generateBase(alice), name, name, data); + TransactionUtils.signAndMint(repository, newestTransactionData, alice); + + // Check name still exists + assertTrue(repository.getNameRepository().nameExists(name)); + assertNotNull(repository.getNameRepository().fromReducedName(reducedName)); + + // Check updated timestamp is correct + assertEquals((Long) newestTransactionData.getTimestamp(), repository.getNameRepository().fromName(name).getUpdated()); + + // orphan and recheck + BlockUtils.orphanLastBlock(repository); + + // Check name still exists + assertTrue(repository.getNameRepository().nameExists(name)); + assertNotNull(repository.getNameRepository().fromReducedName(reducedName)); + + // Check updated timestamp is correct + assertEquals((Long) middleTransactionData.getTimestamp(), repository.getNameRepository().fromName(name).getUpdated()); + + // orphan and recheck + BlockUtils.orphanLastBlock(repository); + + // Check name still exists + assertTrue(repository.getNameRepository().nameExists(name)); + assertNotNull(repository.getNameRepository().fromReducedName(reducedName)); + + // Check updated timestamp is empty + assertNull(repository.getNameRepository().fromName(name).getUpdated()); + } + } + // Test that reverting using previous UPDATE_NAME works as expected @Test public void testIntermediateUpdateName() throws DataException { From 466c727dee8b6a4e5077170bcc5e5de14c88bf43 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 22 Feb 2023 19:01:10 +0000 Subject: [PATCH 10/13] Bump version to 3.8.9 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f94e39b3..35c77bcc 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 3.8.8 + 3.8.9 jar true From 999e8b8aca2a817a56dec810b138cc07ae22db5d Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Fri, 24 Feb 2023 09:12:57 +0100 Subject: [PATCH 11/13] Update pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 35c77bcc..efa84798 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 1.9 1.2.2 28.1-jre - 2.5.1 + 2.7.1 1.2.1 70.1 1.1 @@ -34,7 +34,7 @@ 1.1.0 1.13.1 4.10 - 1.45.1 + 1.53.0 3.19.4 From a3702ac6b08aed78f66a292c9a6da4a4f56363ab Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 26 Feb 2023 12:45:38 +0000 Subject: [PATCH 12/13] Revert "Merge pull request #111 from AlphaX-Projects/master" This reverts commit 69902f7f5b490257998a8a74cf9d26eece4a5680, reversing changes made to 466c727dee8b6a4e5077170bcc5e5de14c88bf43. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index efa84798..35c77bcc 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 1.9 1.2.2 28.1-jre - 2.7.1 + 2.5.1 1.2.1 70.1 1.1 @@ -34,7 +34,7 @@ 1.1.0 1.13.1 4.10 - 1.53.0 + 1.45.1 3.19.4 From cc98abeffb797102446dfb6506afca64288a5959 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 26 Feb 2023 12:51:52 +0000 Subject: [PATCH 13/13] Reduced log spam --- .../controller/arbitrary/ArbitraryDataCleanupManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java index 39425b7e..34acf0cb 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java @@ -204,7 +204,7 @@ public class ArbitraryDataCleanupManager extends Thread { if (completeFileExists && !allChunksExist) { // We have the complete file but not the chunks, so let's convert it - LOGGER.info(String.format("Transaction %s has complete file but no chunks", + LOGGER.debug(String.format("Transaction %s has complete file but no chunks", Base58.encode(arbitraryTransactionData.getSignature()))); ArbitraryTransactionUtils.convertFileToChunks(arbitraryTransactionData, now, STALE_FILE_TIMEOUT);