Some payments don't always initialize the recipient's
last reference, depending on whether the asset is QORA or not and
what type of transaction is being processed.
Calls to Payment.process/orphan now take boolean to indicate
whether recipient's last reference should always be initialized
regardless of asset.
("initialized" here means setting an initial last reference for
an account if the current value is null/empty/missing)
When matching orders to produce trades, it isn't enough to only
sort orders with best price first. Orders with the same price also
need to be further sorted by earliest order first. (This was
implicitly done in Qora v1). Added additional ORDER BY sub-clause
to achieve this and improved the corresponding table index too.
Converted a lot of logging from simplistic System.out/err.println
to Apache log4j2. Added several "trace"-level logging statements
to aid debugging which can be activated given appropriate
configuration in log4j2.properties.
With voting, detection of previous votes was broken during orphan
as previousOptionIndex was set to 0 instead of null when fetching
a VoteOnPollTransaction from the HSQLDB repository. This was due
to lack of null-checking - now fixed.
Corresponding changes made in IssueAsset and Message
transaction HSQLDB repository classes.
v1feeder now syncs up to block 99055. Block 99056 contains DeployAT.
Orphaning back to block 1 and then resync works without issue too.
NOTE: requires HSQLDB built from svn rev 5836 or later
Fixed BuyNameTransactionData constructors not picking up nameReference.
Added new "orphan" tool to regress blockchain back to specified block.
Added new Block constructor for when receiving a block from the network.
Fixed Block generatingBalance/forging code to be compliant with v1.
Added logging of transactions that fail validation during block validation.
Fixed buyer/seller balances not being updated during name purchase.
Generally replace BigDecimal.compareTo expressions with "<operator> 0" form.
e.g. instead of someBigDecimal.compareTo(anotherBigDecimal) == 1
we now have someBigDecimal.compareTo(anotherBigDecimal) > 0
Fix amounts involved in BuyNameTransactions.
Renamed Transaction.calcSignature to .sign
Refactored Transaction.toBytesLessSignature to TransactionTransformer.toBytesForSigning,
which itself calls subclass' toBytesForSigningImpl,
which might override Transaction.toBytesForSigningImpl when special v1 mangling is required.
Corrected more cases of NTP.getTime in transaction processing
which should really be transaction's timestmap instead.
Fixed HSQLDB-related issue where strings were padded with spaces during comparison.
Some column types no longer case-insensitive as that mode of comparison
is done during transaction validation.
Added missing option_index column to CreatePollTransactionOptions which was causing
out-of-order options during fetching from repository and hence signature failures.
Added unit tests for v1-special mangled transaction signature checking.
Removed checks for remaining bytes to ByteBuffer in various transaction transformers'
fromByteBuffer() methods as the buffer underflow exception is now caught in
TransactionTransformer.fromBytes.
Corrected byte-related transformations of CreatePollTransactions that were missing
voter counts (albeit always zero).
Corrected byte-related transformations of IssueAssetTransactions that were missing
duplicate signature/reference (v1-special).
Added "txhex" tool to output transaction in hex form, given base58 tx signature.
Added "v1feeder" tool to fetch blocks from v1 node and process them.
Fixed IssueAssetTransactions not being constructed with signature.
Fixed incorrect MessageTransactionData constructors.
Refactored various transactions to remove duplicate code.
e.g. in CancelOrderTransaction.process() use getCreator() instead of explicit repository call.
Added name_reference to BuyNameTransactions HSQLDB table.
Fixed incorrect SQL in HSQLDBMultiPaymentTransactionRepository.
More unit tests!
Fixed wrong data length in CancelOrderTransactionTransformer.
Fixed wrong data length in CreateOrderTransactionTransformer.
Fixed missing payment bytes in MultiPaymentTransactionTransformer.toBytes();
* Added more columns/properties to NameData to support updating timestamps, name sales
and reference to last transaction that changed Name (for orphaning support).
* Fixed serialization/deserialization bugs in MessageTransactions
* More tests
* Added simple genesis block timestamp setting to help testing
* Fixed setting account's last reference
* Moved some Poll constants from CreatePollTransaction to Poll
* HSQLDB: added TYPE PollOptionIndex
* HSQLDB: added previous_option_index to VoteOnPollTransactions table to help orphaning
* HSQLDB: renamed "poll" to "poll_name" in same table
* HSQLDB: PollOptions now has additional option_index column
* Improved TransactionTests to allow for different genesis block timestamps.
* Also added VoteOnPollTransaction test
* Moved Asset issue/deissue code from IssueAssetTransaction to Asset business object.
* Added more constructors for Asset using IssueAssetTransactionData or assetId.
* Moved some constants from transaction transfers to business objects (e.g. IssueAssetTransaction)
(They might now make more sense being in Asset)
* Changed some transaction isValid() checks to use transaction's timestamp instead of NTP.getTime()
* New VotingRepository - as yet unimplemented
Really need to rewrite "migrate" and add a ton of unit tests.
* Add implementation for Account.getBalance(assetId, numberOfConfirmations)
* Added orphan() code to Block (CIYAM AT not yet supported)
* Added getOrder() 'navigation' method to CreateOrderTransaction
* Added missing transaction-type cases to various switches in Transaction, transformers, repositories, etc.
* Various repository delete() methods added
* Added save/delete support for transaction types that include payments, like multipayment and arbitrary
* Changed "recipient" in HSQLDB SharedTransactionPayments from QoraPublicKey to QoraAddress
* Added AssetData transfer object
* Added IssueAssetTransactionData transfer object
* Reworked qora.assets.Asset into business layer object
* Reworked qora.transaction.IssueAssetTransaction into business layer object
* Added corresponding AssetRepository and support in TransactionRepository et al
* Fixed BlockChain in line with asset changes
* Some renaming inside GenesisTransaction to reflect use of transfer object, not business object
* Business transaction objects now take Repository param
* Moved HSQLDB transaction repositories into a sub-package
* Changed HSQLDBSaver.execute(Connection connection) to .execute(Repository repository) to fix visibility issues
and allow repository more control in the future if need be
* Changed from "return null" statements in HSQLDB repositories to throw DataException when an error occurs.
Better to throw than to silently return null?
* Added static version of PublicKeyAccount.verify() for when a repository-backed PublicKeyAccount is not needed
* Fixed getter/setter code template incorrectly producing "this.this.field = param"
Still converting to repository layout.
This commit is just in case my dev computer blows up and also for interim code review.
Removed data.block.BlockData as an interface (with data.block.Block as implementation) for now.
qora.* packages are business logic/handler/processing
data.* packages are "value objects" or are they "business objects"?
toBytes(), fromBytes() (which used to be called parse()) and toJSON() moved to transform.* packages
new issues:
Lost control of SQL Transactions. Previously, some class "knew" whether to call COMMIT or not.
e.g. simply saving a payment transaction would involve updating Transactions table first, then the PaymentTransactions table after (to satisfy foreign key constraints) then commit.
Processing a block would involve a new transaction, a savepoint, a rollback and then maybe a further commit or rollback.
Not sure how this is going to work with the repository, especially if business logic isn't supposed to be aware of such things.
Growing number of stupid try-catch blocks. Probably best to ditch TransformationException (was ParseException) and throw IllegalStateExceptions instead as they're "unchecked".
What happens if the repository fails to save() to the database? It can't throw SQLException any more as that has no meaning outside the repository. Ditto with delete().