From af8d0a3965d477a4ebc20b22ce2548fb22e2539b Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 24 Nov 2021 11:02:17 +0000 Subject: [PATCH] Separated computeNonce() from build() in the transaction builder. This gives the option of the nonce to be computed elsewhere, such as in the UI, and also allows transaction unit tests to run much more quickly. --- .../api/resource/ArbitraryResource.java | 3 +- .../ArbitraryDataTransactionBuilder.java | 38 +++++++++++-------- .../test/arbitrary/ArbitraryDataTests.java | 3 +- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index 0e3673c0..44b8c62e 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -563,10 +563,11 @@ public class ArbitraryResource { try { ArbitraryDataTransactionBuilder transactionBuilder = new ArbitraryDataTransactionBuilder( - publicKey58, Paths.get(path), name, null, service, identifier + repository, publicKey58, Paths.get(path), name, null, service, identifier ); transactionBuilder.build(); + transactionBuilder.computeNonce(); ArbitraryTransactionData transactionData = transactionBuilder.getArbitraryTransactionData(); return Base58.encode(ArbitraryTransactionTransformer.toBytes(transactionData)); diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java index 3b8a93dc..1aba93ae 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java @@ -14,7 +14,6 @@ import org.qortal.data.transaction.BaseTransactionData; import org.qortal.group.Group; import org.qortal.repository.DataException; import org.qortal.repository.Repository; -import org.qortal.repository.RepositoryManager; import org.qortal.transaction.ArbitraryTransaction; import org.qortal.transaction.Transaction; import org.qortal.transform.Transformer; @@ -48,11 +47,14 @@ public class ArbitraryDataTransactionBuilder { private Method method; private final Service service; private final String identifier; + private final Repository repository; private ArbitraryTransactionData arbitraryTransactionData; + private ArbitraryDataFile arbitraryDataFile; - public ArbitraryDataTransactionBuilder(String publicKey58, Path path, String name, + public ArbitraryDataTransactionBuilder(Repository repository, String publicKey58, Path path, String name, Method method, Service service, String identifier) { + this.repository = repository; this.publicKey58 = publicKey58; this.path = path; this.name = name; @@ -134,8 +136,8 @@ public class ArbitraryDataTransactionBuilder { } private void createTransaction() throws DataException { - ArbitraryDataFile arbitraryDataFile = null; - try (final Repository repository = RepositoryManager.getRepository()) { + arbitraryDataFile = null; + try { Long now = NTP.getTime(); if (now == null) { throw new DataException("NTP time not synced yet"); @@ -201,17 +203,6 @@ public class ArbitraryDataTransactionBuilder { version, service, nonce, size, name, identifier, method, secret, compression, digest, dataType, chunkHashes, payments); - ArbitraryTransaction transaction = (ArbitraryTransaction) Transaction.fromData(repository, transactionData); - LOGGER.info("Computing nonce..."); - transaction.computeNonce(); - - Transaction.ValidationResult result = transaction.isValidUnconfirmed(); - if (result != Transaction.ValidationResult.OK) { - arbitraryDataFile.deleteAll(); - throw new DataException(String.format("Arbitrary transaction invalid: %s", result)); - } - LOGGER.info("Transaction is valid"); - this.arbitraryTransactionData = transactionData; } catch (DataException e) { @@ -223,6 +214,23 @@ public class ArbitraryDataTransactionBuilder { } + public void computeNonce() throws DataException { + if (this.arbitraryTransactionData == null) { + throw new DataException("Arbitrary transaction data is required to compute nonce"); + } + + ArbitraryTransaction transaction = (ArbitraryTransaction) Transaction.fromData(repository, this.arbitraryTransactionData); + LOGGER.info("Computing nonce..."); + transaction.computeNonce(); + + Transaction.ValidationResult result = transaction.isValidUnconfirmed(); + if (result != Transaction.ValidationResult.OK) { + arbitraryDataFile.deleteAll(); + throw new DataException(String.format("Arbitrary transaction invalid: %s", result)); + } + LOGGER.info("Transaction is valid"); + } + public ArbitraryTransactionData getArbitraryTransactionData() { return this.arbitraryTransactionData; } diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java index 797ad5ae..c0b209c6 100644 --- a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java +++ b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataTests.java @@ -369,9 +369,10 @@ public class ArbitraryDataTests extends Common { Method method, Service service, PrivateKeyAccount account) throws DataException { ArbitraryDataTransactionBuilder txnBuilder = new ArbitraryDataTransactionBuilder( - publicKey58, path, name, method, service, identifier); + repository, publicKey58, path, name, method, service, identifier); txnBuilder.build(); + txnBuilder.computeNonce(); ArbitraryTransactionData transactionData = txnBuilder.getArbitraryTransactionData(); Transaction.ValidationResult result = TransactionUtils.signAndImport(repository, transactionData, account); assertEquals(Transaction.ValidationResult.OK, result);