diff --git a/src/qora/block/Block.java b/src/qora/block/Block.java index 7ef9651c..dc3de66b 100644 --- a/src/qora/block/Block.java +++ b/src/qora/block/Block.java @@ -5,7 +5,6 @@ import static java.util.stream.Collectors.toMap; import java.math.BigDecimal; import java.math.BigInteger; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -463,10 +462,10 @@ public class Block { *

* Performs various tests like checking for parent block, correct block timestamp, version, generating balance, etc. *

- * Checks block's transactions using an HSQLDB "SAVEPOINT" and hence needs to be called within an ongoing SQL Transaction. + * Checks block's transactions by testing their validity then processing them.
+ * Hence calls repository.discardChanges() before returning. * - * @return true if block is valid, false otherwise. - * @throws SQLException + * @return ValidationResult.OK if block is valid, or some other ValidationResult otherwise. * @throws DataException */ public ValidationResult isValid() throws DataException { @@ -561,13 +560,13 @@ public class Block { } catch (DataException e) { return ValidationResult.TRANSACTION_TIMESTAMP_INVALID; } finally { - // Revert back to savepoint + // Discard changes to repository made by test-processing transactions above try { this.repository.discardChanges(); } catch (DataException e) { /* - * Rollback failure most likely due to prior DataException, so catch rollback's DataException and discard. A "return false" in try-block will - * still return false, prior DataException propagates to caller and successful completion of try-block continues on after rollback. + * Discard failure most likely due to prior DataException, so catch discardChanges' DataException and discard. + * Prior DataException propagates to caller. Successful completion of try-block continues on after discard. */ } } diff --git a/src/qora/block/BlockChain.java b/src/qora/block/BlockChain.java index 053fe2b9..877b8dec 100644 --- a/src/qora/block/BlockChain.java +++ b/src/qora/block/BlockChain.java @@ -17,29 +17,17 @@ import repository.RepositoryManager; */ public class BlockChain { - /** - * Minimum Qora balance. - */ + /** Minimum Qora balance for use in calculations. */ public static final BigDecimal MIN_BALANCE = BigDecimal.valueOf(1L).setScale(8); - /** - * Maximum Qora balance. - */ + /** Maximum Qora balance. */ public static final BigDecimal MAX_BALANCE = BigDecimal.valueOf(10_000_000_000L).setScale(8); - /** - * Number of blocks between recalculating block's generating balance. - */ + /** Number of blocks between recalculating block's generating balance. */ public static final int BLOCK_RETARGET_INTERVAL = 10; - /** - * Minimum target time between blocks, in seconds. - */ + /** Minimum target time between blocks, in seconds. */ public static final long MIN_BLOCK_TIME = 60; - /** - * Maximum target time between blocks, in seconds. - */ + /** Maximum target time between blocks, in seconds. */ public static final long MAX_BLOCK_TIME = 300; - /** - * Maximum acceptable timestamp disagreement offset in milliseconds. - */ + /** Maximum acceptable timestamp disagreement offset in milliseconds. */ public static final long BLOCK_TIMESTAMP_MARGIN = 500L; // Various release timestamps / block heights diff --git a/src/qora/transaction/Transaction.java b/src/qora/transaction/Transaction.java index 978a5466..739eb844 100644 --- a/src/qora/transaction/Transaction.java +++ b/src/qora/transaction/Transaction.java @@ -62,7 +62,7 @@ public abstract class Transaction { } } - // Minimum fee + /** Minimum fee for a transaction */ public static final BigDecimal MINIMUM_FEE = BigDecimal.ONE; // Cached info to make transaction processing faster @@ -75,11 +75,26 @@ public abstract class Transaction { // Constructors + /** + * Basic constructor for use by subclasses. + * + * @param repository + * @param transactionData + */ protected Transaction(Repository repository, TransactionData transactionData) { this.repository = repository; this.transactionData = transactionData; } + /** + * Returns subclass of Transaction constructed using passed transaction data. + *

+ * Uses transaction-type in transaction data to call relevant subclass constructor. + * + * @param repository + * @param transactionData + * @return a Transaction subclass, or null if a transaction couldn't be determined/built from passed data + */ public static Transaction fromData(Repository repository, TransactionData transactionData) { switch (transactionData.getType()) { case GENESIS: diff --git a/src/qora/voting/Poll.java b/src/qora/voting/Poll.java index d8837bc7..5f058885 100644 --- a/src/qora/voting/Poll.java +++ b/src/qora/voting/Poll.java @@ -13,13 +13,19 @@ public class Poll { // Constructors + /** + * Construct Poll business object using poll data. + * + * @param repository + * @param pollData + */ public Poll(Repository repository, PollData pollData) { this.repository = repository; this.pollData = pollData; } /** - * Create Poll business object using info from create poll transaction. + * Construct Poll business object using info from create poll transaction. * * @param repository * @param createPollTransactionData @@ -27,9 +33,17 @@ public class Poll { public Poll(Repository repository, CreatePollTransactionData createPollTransactionData) { this.repository = repository; this.pollData = new PollData(createPollTransactionData.getCreatorPublicKey(), createPollTransactionData.getOwner(), - createPollTransactionData.getPollName(), createPollTransactionData.getDescription(), createPollTransactionData.getPollOptions(), createPollTransactionData.getTimestamp()); + createPollTransactionData.getPollName(), createPollTransactionData.getDescription(), createPollTransactionData.getPollOptions(), + createPollTransactionData.getTimestamp()); } + /** + * Construct Poll business object using existing poll from repository, identified by pollName. + * + * @param repository + * @param pollName + * @throws DataException + */ public Poll(Repository repository, String pollName) throws DataException { this.repository = repository; this.pollData = this.repository.getVotingRepository().fromPollName(pollName); @@ -46,6 +60,13 @@ public class Poll { this.repository.getVotingRepository().save(this.pollData); } + /** + * "Unpublish" poll, removing it from blockchain. + *

+ * Typically used when orphaning create poll transaction. + * + * @throws DataException + */ public void unpublish() throws DataException { this.repository.getVotingRepository().delete(this.pollData.getPollName()); } diff --git a/src/transform/transaction/CancelOrderTransactionTransformer.java b/src/transform/transaction/CancelOrderTransactionTransformer.java index 85de3624..1c08d38a 100644 --- a/src/transform/transaction/CancelOrderTransactionTransformer.java +++ b/src/transform/transaction/CancelOrderTransactionTransformer.java @@ -66,7 +66,9 @@ public class CancelOrderTransactionTransformer extends TransactionTransformer { bytes.write(cancelOrderTransactionData.getOrderId()); Serialization.serializeBigDecimal(bytes, cancelOrderTransactionData.getFee()); - bytes.write(cancelOrderTransactionData.getSignature()); + + if (cancelOrderTransactionData.getSignature() != null) + bytes.write(cancelOrderTransactionData.getSignature()); return bytes.toByteArray(); } catch (IOException | ClassCastException e) { diff --git a/src/transform/transaction/CreateOrderTransactionTransformer.java b/src/transform/transaction/CreateOrderTransactionTransformer.java index 1f771733..6bdd0295 100644 --- a/src/transform/transaction/CreateOrderTransactionTransformer.java +++ b/src/transform/transaction/CreateOrderTransactionTransformer.java @@ -71,7 +71,9 @@ public class CreateOrderTransactionTransformer extends TransactionTransformer { Serialization.serializeBigDecimal(bytes, createOrderTransactionData.getPrice(), AMOUNT_LENGTH); Serialization.serializeBigDecimal(bytes, createOrderTransactionData.getFee()); - bytes.write(createOrderTransactionData.getSignature()); + + if (createOrderTransactionData.getSignature() != null) + bytes.write(createOrderTransactionData.getSignature()); return bytes.toByteArray(); } catch (IOException | ClassCastException e) { diff --git a/src/transform/transaction/IssueAssetTransactionTransformer.java b/src/transform/transaction/IssueAssetTransactionTransformer.java index d7693bf6..7bf1e677 100644 --- a/src/transform/transaction/IssueAssetTransactionTransformer.java +++ b/src/transform/transaction/IssueAssetTransactionTransformer.java @@ -86,7 +86,9 @@ public class IssueAssetTransactionTransformer extends TransactionTransformer { bytes.write((byte) (issueAssetTransactionData.getIsDivisible() ? 1 : 0)); Serialization.serializeBigDecimal(bytes, issueAssetTransactionData.getFee()); - bytes.write(issueAssetTransactionData.getSignature()); + + if (issueAssetTransactionData.getSignature() != null) + bytes.write(issueAssetTransactionData.getSignature()); return bytes.toByteArray(); } catch (IOException | ClassCastException e) { diff --git a/src/transform/transaction/MessageTransactionTransformer.java b/src/transform/transaction/MessageTransactionTransformer.java index 20cdaccb..967f1510 100644 --- a/src/transform/transaction/MessageTransactionTransformer.java +++ b/src/transform/transaction/MessageTransactionTransformer.java @@ -120,7 +120,9 @@ public class MessageTransactionTransformer extends TransactionTransformer { bytes.write((byte) (messageTransactionData.getIsText() ? 1 : 0)); Serialization.serializeBigDecimal(bytes, messageTransactionData.getFee()); - bytes.write(messageTransactionData.getSignature()); + + if (messageTransactionData.getSignature() != null) + bytes.write(messageTransactionData.getSignature()); return bytes.toByteArray(); } catch (IOException | ClassCastException e) { diff --git a/src/transform/transaction/MultiPaymentTransactionTransformer.java b/src/transform/transaction/MultiPaymentTransactionTransformer.java index bb4307e6..93878247 100644 --- a/src/transform/transaction/MultiPaymentTransactionTransformer.java +++ b/src/transform/transaction/MultiPaymentTransactionTransformer.java @@ -84,7 +84,9 @@ public class MultiPaymentTransactionTransformer extends TransactionTransformer { PaymentTransformer.toBytes(paymentData); Serialization.serializeBigDecimal(bytes, multiPaymentTransactionData.getFee()); - bytes.write(multiPaymentTransactionData.getSignature()); + + if (multiPaymentTransactionData.getSignature() != null) + bytes.write(multiPaymentTransactionData.getSignature()); return bytes.toByteArray(); } catch (IOException | ClassCastException e) { diff --git a/src/transform/transaction/TransferAssetTransactionTransformer.java b/src/transform/transaction/TransferAssetTransactionTransformer.java index e908ee70..bcded125 100644 --- a/src/transform/transaction/TransferAssetTransactionTransformer.java +++ b/src/transform/transaction/TransferAssetTransactionTransformer.java @@ -70,7 +70,9 @@ public class TransferAssetTransactionTransformer extends TransactionTransformer Serialization.serializeBigDecimal(bytes, transferAssetTransactionData.getAmount(), AMOUNT_LENGTH); Serialization.serializeBigDecimal(bytes, transferAssetTransactionData.getFee()); - bytes.write(transferAssetTransactionData.getSignature()); + + if (transferAssetTransactionData.getSignature() != null) + bytes.write(transferAssetTransactionData.getSignature()); return bytes.toByteArray(); } catch (IOException | ClassCastException e) {