diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index de53db721..879098bda 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [libraries] -yaci = "com.bloxbean.cardano:yaci:0.3.0-beta12-627cb58-SNAPSHOT" +yaci = "com.bloxbean.cardano:yaci:0.3.0-beta12" cardano-client-lib = "com.bloxbean.cardano:cardano-client-lib:0.5.1" cardano-client-backend = "com.bloxbean.cardano:cardano-client-backend:0.5.1" cardano-client-backend-ogmios = "com.bloxbean.cardano:cardano-client-backend-ogmios:0.5.1" diff --git a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/TransactionStoreConfiguration.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/TransactionStoreConfiguration.java index 316dff8e4..ff1e3b45f 100644 --- a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/TransactionStoreConfiguration.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/TransactionStoreConfiguration.java @@ -3,6 +3,7 @@ import com.bloxbean.cardano.yaci.store.transaction.storage.*; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.*; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.mapper.TxnMapper; +import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.InvalidTransactionRepository; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.TxnEntityRepository; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.TxnWitnessRepository; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.WithdrawalRepository; @@ -68,4 +69,11 @@ public WithdrawalStorage withdrawalStorage(WithdrawalRepository withdrawalReposi public WithdrawalStorageReader withdrawalStorageReader(WithdrawalRepository withdrawalRepository, TxnMapper mapper) { return new WithdrawalStorageReaderImpl(withdrawalRepository, mapper); } + + @Bean + @ConditionalOnMissingBean + public InvalidTransactionStorage invalidTransactionStorage(InvalidTransactionRepository invalidTransactionRepository, + TxnMapper txnMapper) { + return new InvalidTransactionStorageImpl(invalidTransactionRepository, txnMapper); + } } diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/domain/InvalidTransaction.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/domain/InvalidTransaction.java similarity index 90% rename from stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/domain/InvalidTransaction.java rename to stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/domain/InvalidTransaction.java index b2411a43a..cf5a46253 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/domain/InvalidTransaction.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/domain/InvalidTransaction.java @@ -1,4 +1,4 @@ -package com.bloxbean.cardano.yaci.store.utxo.domain; +package com.bloxbean.cardano.yaci.store.transaction.domain; import com.bloxbean.cardano.yaci.helper.model.Transaction; import com.fasterxml.jackson.databind.PropertyNamingStrategies; diff --git a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessor.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessor.java index d25e9b693..2681c2f84 100644 --- a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessor.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessor.java @@ -10,10 +10,13 @@ import com.bloxbean.cardano.yaci.store.common.domain.Amt; import com.bloxbean.cardano.yaci.store.common.domain.TxOuput; import com.bloxbean.cardano.yaci.store.common.domain.UtxoKey; +import com.bloxbean.cardano.yaci.store.events.EventMetadata; import com.bloxbean.cardano.yaci.store.events.TransactionEvent; +import com.bloxbean.cardano.yaci.store.transaction.domain.InvalidTransaction; import com.bloxbean.cardano.yaci.store.transaction.domain.TxWitnessType; import com.bloxbean.cardano.yaci.store.transaction.domain.Txn; import com.bloxbean.cardano.yaci.store.transaction.domain.TxnWitness; +import com.bloxbean.cardano.yaci.store.transaction.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionWitnessStorage; import com.fasterxml.jackson.databind.ObjectMapper; @@ -39,6 +42,7 @@ public class TransactionProcessor { private final TransactionStorage transactionStorage; private final TransactionWitnessStorage transactionWitnessStorage; + private final InvalidTransactionStorage invalidTransactionStorage; private final ObjectMapper objectMapper; @EventListener @@ -98,6 +102,9 @@ public void handleTransactionEvent(TransactionEvent event) { .build(); txList.add(txn); + + if (transaction.isInvalid()) + saveInvalidTransaction(event.getMetadata(), transaction); }); if (txList.size() > 0) { @@ -105,6 +112,17 @@ public void handleTransactionEvent(TransactionEvent event) { } } + private void saveInvalidTransaction(EventMetadata metadata, Transaction transaction) { + //insert invalid transactions + InvalidTransaction invalidTransaction = InvalidTransaction.builder() + .txHash(transaction.getTxHash()) + .slot(metadata.getSlot()) + .blockHash(metadata.getBlockHash()) + .transaction(transaction) + .build(); + invalidTransactionStorage.save(invalidTransaction); + } + @EventListener @Transactional diff --git a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessor.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessor.java index 93bfe4fe4..43cf6179f 100644 --- a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessor.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessor.java @@ -1,6 +1,7 @@ package com.bloxbean.cardano.yaci.store.transaction.processor; import com.bloxbean.cardano.yaci.store.events.RollbackEvent; +import com.bloxbean.cardano.yaci.store.transaction.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionWitnessStorage; import lombok.RequiredArgsConstructor; @@ -16,6 +17,7 @@ public class TransactionRollbackProcessor { private final TransactionStorage transactionStorage; private final TransactionWitnessStorage transactionWitnessStorage; + private final InvalidTransactionStorage invalidTransactionStorage; @EventListener @Transactional @@ -25,6 +27,9 @@ public void handleRollbackEvent(RollbackEvent rollbackEvent) { count = transactionWitnessStorage.deleteBySlotGreaterThan(rollbackEvent.getRollbackTo().getSlot()); log.info("Rollback -- {} transaction_witness records", count); + + count = invalidTransactionStorage.deleteBySlotGreaterThan(rollbackEvent.getRollbackTo().getSlot()); + log.info("Rollback -- {} invalid_transaction records", count); } } diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/InvalidTransactionStorage.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/InvalidTransactionStorage.java similarity index 53% rename from stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/InvalidTransactionStorage.java rename to stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/InvalidTransactionStorage.java index 9f438dd6a..146c26569 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/InvalidTransactionStorage.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/InvalidTransactionStorage.java @@ -1,6 +1,6 @@ -package com.bloxbean.cardano.yaci.store.utxo.storage; +package com.bloxbean.cardano.yaci.store.transaction.storage; -import com.bloxbean.cardano.yaci.store.utxo.domain.InvalidTransaction; +import com.bloxbean.cardano.yaci.store.transaction.domain.InvalidTransaction; public interface InvalidTransactionStorage { InvalidTransaction save(InvalidTransaction invalidTransaction); diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/InvalidTransactionStorageImpl.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/InvalidTransactionStorageImpl.java similarity index 54% rename from stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/InvalidTransactionStorageImpl.java rename to stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/InvalidTransactionStorageImpl.java index e9a76ab75..b0f01d283 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/InvalidTransactionStorageImpl.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/InvalidTransactionStorageImpl.java @@ -1,10 +1,10 @@ -package com.bloxbean.cardano.yaci.store.utxo.storage.impl; +package com.bloxbean.cardano.yaci.store.transaction.storage.impl; -import com.bloxbean.cardano.yaci.store.utxo.domain.InvalidTransaction; -import com.bloxbean.cardano.yaci.store.utxo.storage.InvalidTransactionStorage; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.mapper.UtxoMapper; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.InvalidTransactionEntity; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.repository.InvalidTransactionRepository; +import com.bloxbean.cardano.yaci.store.transaction.domain.InvalidTransaction; +import com.bloxbean.cardano.yaci.store.transaction.storage.InvalidTransactionStorage; +import com.bloxbean.cardano.yaci.store.transaction.storage.impl.mapper.TxnMapper; +import com.bloxbean.cardano.yaci.store.transaction.storage.impl.model.InvalidTransactionEntity; +import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.InvalidTransactionRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -12,7 +12,7 @@ @Slf4j public class InvalidTransactionStorageImpl implements InvalidTransactionStorage { private final InvalidTransactionRepository repository; - private final UtxoMapper mapper = UtxoMapper.INSTANCE; + private final TxnMapper mapper; @Override public InvalidTransaction save(InvalidTransaction invalidTransaction) { diff --git a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/mapper/TxnMapper.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/mapper/TxnMapper.java index c8d7869f9..e69b9509c 100644 --- a/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/mapper/TxnMapper.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/mapper/TxnMapper.java @@ -1,8 +1,10 @@ package com.bloxbean.cardano.yaci.store.transaction.storage.impl.mapper; +import com.bloxbean.cardano.yaci.store.transaction.domain.InvalidTransaction; import com.bloxbean.cardano.yaci.store.transaction.domain.Txn; import com.bloxbean.cardano.yaci.store.transaction.domain.TxnWitness; import com.bloxbean.cardano.yaci.store.transaction.domain.Withdrawal; +import com.bloxbean.cardano.yaci.store.transaction.storage.impl.model.InvalidTransactionEntity; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.model.TxnEntity; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.model.TxnWitnessEntity; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.model.WithdrawalEntity; @@ -18,4 +20,7 @@ public abstract class TxnMapper { public abstract Withdrawal toWithdrawal(WithdrawalEntity withdrawalEntity); public abstract WithdrawalEntity toWithdrawalEntity(Withdrawal withdrawal); + + public abstract InvalidTransactionEntity toInvalidTransactionEntity(InvalidTransaction invalidTransaction); + public abstract InvalidTransaction toInvalidTransaction(InvalidTransactionEntity invalidTransactionEntity); } diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/model/InvalidTransactionEntity.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/model/InvalidTransactionEntity.java similarity index 95% rename from stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/model/InvalidTransactionEntity.java rename to stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/model/InvalidTransactionEntity.java index ce4d4b6ef..4debb5132 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/model/InvalidTransactionEntity.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/model/InvalidTransactionEntity.java @@ -1,4 +1,4 @@ -package com.bloxbean.cardano.yaci.store.utxo.storage.impl.model; +package com.bloxbean.cardano.yaci.store.transaction.storage.impl.model; import com.bloxbean.cardano.yaci.helper.model.Transaction; import com.bloxbean.cardano.yaci.store.common.model.BaseEntity; diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/repository/InvalidTransactionRepository.java b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/repository/InvalidTransactionRepository.java similarity index 61% rename from stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/repository/InvalidTransactionRepository.java rename to stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/repository/InvalidTransactionRepository.java index c954ed5c0..f275560d5 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/repository/InvalidTransactionRepository.java +++ b/stores/transaction/src/main/java/com/bloxbean/cardano/yaci/store/transaction/storage/impl/repository/InvalidTransactionRepository.java @@ -1,6 +1,6 @@ -package com.bloxbean.cardano.yaci.store.utxo.storage.impl.repository; +package com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.InvalidTransactionEntity; +import com.bloxbean.cardano.yaci.store.transaction.storage.impl.model.InvalidTransactionEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/stores/transaction/src/main/resources/db/store/h2/V0_300_1__init.sql b/stores/transaction/src/main/resources/db/store/h2/V0_300_1__init.sql index 1cb838587..85185fe20 100644 --- a/stores/transaction/src/main/resources/db/store/h2/V0_300_1__init.sql +++ b/stores/transaction/src/main/resources/db/store/h2/V0_300_1__init.sql @@ -63,3 +63,19 @@ create table withdrawal CREATE INDEX idx_withdrawal_slot ON withdrawal(slot); + +-- invalid_transaction +drop table if exists invalid_transaction; +create table invalid_transaction +( + tx_hash varchar(64) not null + primary key, + slot bigint not null, + block_hash varchar(64), + transaction json null, + create_datetime timestamp, + update_datetime timestamp +); + +CREATE INDEX idx_invalid_transaction_slot + ON invalid_transaction(slot); diff --git a/stores/transaction/src/main/resources/db/store/mysql/V0_300_1__init.sql b/stores/transaction/src/main/resources/db/store/mysql/V0_300_1__init.sql index d864695a0..51cfbad0c 100644 --- a/stores/transaction/src/main/resources/db/store/mysql/V0_300_1__init.sql +++ b/stores/transaction/src/main/resources/db/store/mysql/V0_300_1__init.sql @@ -61,3 +61,19 @@ create table withdrawal CREATE INDEX idx_withdrawal_slot ON withdrawal(slot); + +-- invalid_transaction +drop table if exists invalid_transaction; +create table invalid_transaction +( + tx_hash varchar(64) not null + primary key, + slot bigint not null, + block_hash varchar(64), + transaction json null, + create_datetime timestamp, + update_datetime timestamp +); + +CREATE INDEX idx_invalid_transaction_slot + ON invalid_transaction(slot); diff --git a/stores/transaction/src/main/resources/db/store/postgresql/V0_300_1__init.sql b/stores/transaction/src/main/resources/db/store/postgresql/V0_300_1__init.sql index 001c50a58..8639c51fc 100644 --- a/stores/transaction/src/main/resources/db/store/postgresql/V0_300_1__init.sql +++ b/stores/transaction/src/main/resources/db/store/postgresql/V0_300_1__init.sql @@ -63,3 +63,19 @@ create table withdrawal CREATE INDEX idx_withdrawal_slot ON withdrawal(slot); + +-- invalid_transaction +drop table if exists invalid_transaction; +create table invalid_transaction +( + tx_hash varchar(64) not null + primary key, + slot bigint not null, + block_hash varchar(64), + transaction jsonb, + create_datetime timestamp, + update_datetime timestamp +); + +CREATE INDEX idx_invalid_transaction_slot + ON invalid_transaction(slot); diff --git a/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessorTest.java b/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessorTest.java index 3660564ec..e1510a4bf 100644 --- a/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessorTest.java +++ b/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionProcessorTest.java @@ -6,9 +6,11 @@ import com.bloxbean.cardano.yaci.store.common.domain.UtxoKey; import com.bloxbean.cardano.yaci.store.events.EventMetadata; import com.bloxbean.cardano.yaci.store.events.TransactionEvent; +import com.bloxbean.cardano.yaci.store.transaction.domain.InvalidTransaction; import com.bloxbean.cardano.yaci.store.transaction.domain.TxWitnessType; import com.bloxbean.cardano.yaci.store.transaction.domain.Txn; import com.bloxbean.cardano.yaci.store.transaction.domain.TxnWitness; +import com.bloxbean.cardano.yaci.store.transaction.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionWitnessStorage; import com.fasterxml.jackson.databind.ObjectMapper; @@ -37,15 +39,20 @@ class TransactionProcessorTest { private TransactionStorage transactionStorage; @Mock private TransactionWitnessStorage transactionWitnessStorage; + @Mock + private InvalidTransactionStorage invalidTransactionStorage; + private TransactionProcessor transactionProcessor; @Captor private ArgumentCaptor> txnListCaptor; @Captor private ArgumentCaptor> txnWitnessesCaptor; + @Captor + private ArgumentCaptor invalidTxCaptor; @BeforeEach public void setup() { - transactionProcessor = new TransactionProcessor(transactionStorage, transactionWitnessStorage, new ObjectMapper()); + transactionProcessor = new TransactionProcessor(transactionStorage, transactionWitnessStorage, invalidTransactionStorage, new ObjectMapper()); } @Test @@ -58,6 +65,7 @@ void givenTransactionEvent_shouldSaveTxnList() { transactionProcessor.handleTransactionEvent(transactionEvent); verify(transactionStorage, Mockito.times(1)).saveAll(txnListCaptor.capture()); + verify(invalidTransactionStorage, Mockito.never()).save(invalidTxCaptor.capture()); List txnList = txnListCaptor.getValue(); assertThat(txnList).hasSize(1); @@ -158,6 +166,22 @@ void givenTransactionEvent_shouldSaveTxnWitnessList() { } } + @Test + void givenTransactionEvent_withInvalidTransaction_shouldSaveInvalidTransaction() { + var transactions = transactions(); + transactions.get(0).setInvalid(true); + + TransactionEvent transactionEvent = TransactionEvent.builder() + .transactions(transactions) + .metadata(eventMetadata()) + .build(); + + transactionProcessor.handleTransactionEvent(transactionEvent); + + verify(transactionStorage, Mockito.times(1)).saveAll(txnListCaptor.capture()); + verify(invalidTransactionStorage, Mockito.times(1)).save(invalidTxCaptor.capture()); + } + private EventMetadata eventMetadata() { return EventMetadata.builder() .era(Era.Babbage) @@ -215,7 +239,7 @@ private List transactions() { .build() ) .utxos(utxos(txHash, transactionOutputs())) - .invalid(true) + .invalid(false) .build(); return List.of(transaction); diff --git a/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorIT.java b/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorIT.java index 54c66c2d6..fdca7cc1b 100644 --- a/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorIT.java +++ b/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorIT.java @@ -2,6 +2,7 @@ import com.bloxbean.cardano.yaci.core.protocol.chainsync.messages.Point; import com.bloxbean.cardano.yaci.store.events.RollbackEvent; +import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.InvalidTransactionRepository; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.TxnEntityRepository; import com.bloxbean.cardano.yaci.store.transaction.storage.impl.repository.TxnWitnessRepository; import org.junit.jupiter.api.Test; @@ -22,6 +23,9 @@ class TransactionRollbackProcessorIT { @Autowired private TxnWitnessRepository txnWitnessRepository; + @Autowired + private InvalidTransactionRepository invalidTransactionRepository; + @Autowired private TransactionRollbackProcessor transactionRollbackProcessor; @@ -43,4 +47,20 @@ void handleRollBackEvent() { assertThat(countEntity).isEqualTo(3); assertThat(countWitness).isEqualTo(9); } + + @Test + @SqlGroup({ + @Sql(value = "classpath:scripts/invalid_transaction_data.sql", executionPhase = BEFORE_TEST_METHOD) + }) + void givenRollbackEvent_shouldDeleteInvalidTransactions() throws Exception { + RollbackEvent rollbackEvent = RollbackEvent.builder() + .rollbackTo(new Point(13133973, "96bb7918a219dbe0cb01d3962b78a883931da27b5a4987af7c1bd964d7ffc6ff")) + .currentPoint(new Point(13518703, "5470beb0a38e7793db667269e55ed74b339d35db57e640d8f82de831ee348ba0")) + .build(); + + transactionRollbackProcessor.handleRollbackEvent(rollbackEvent); + + int count = invalidTransactionRepository.findAll().size(); + assertThat(count).isEqualTo(12); + } } diff --git a/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorTest.java b/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorTest.java index 4a263f43a..a013a1375 100644 --- a/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorTest.java +++ b/stores/transaction/src/test/java/com/bloxbean/cardano/yaci/store/transaction/processor/TransactionRollbackProcessorTest.java @@ -2,6 +2,7 @@ import com.bloxbean.cardano.yaci.core.protocol.chainsync.messages.Point; import com.bloxbean.cardano.yaci.store.events.RollbackEvent; +import com.bloxbean.cardano.yaci.store.transaction.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionStorage; import com.bloxbean.cardano.yaci.store.transaction.storage.TransactionWitnessStorage; import org.junit.jupiter.api.Test; @@ -20,6 +21,9 @@ class TransactionRollbackProcessorTest { @Mock private TransactionWitnessStorage transactionWitnessStorage; + @Mock + private InvalidTransactionStorage invalidTransactionStorage; + @InjectMocks private TransactionRollbackProcessor transactionRollbackProcessor; @@ -34,5 +38,6 @@ void testHandleRollbackProcessor() { Mockito.verify(transactionStorage, Mockito.times(1)).deleteBySlotGreaterThan(rollbackEvent.getRollbackTo().getSlot()); Mockito.verify(transactionWitnessStorage, Mockito.times(1)).deleteBySlotGreaterThan(rollbackEvent.getRollbackTo().getSlot()); + Mockito.verify(invalidTransactionStorage, Mockito.times(1)).deleteBySlotGreaterThan(rollbackEvent.getRollbackTo().getSlot()); } } diff --git a/stores/utxo/src/test/resources/scripts/invalid_transaction_data.sql b/stores/transaction/src/test/resources/scripts/invalid_transaction_data.sql similarity index 100% rename from stores/utxo/src/test/resources/scripts/invalid_transaction_data.sql rename to stores/transaction/src/test/resources/scripts/invalid_transaction_data.sql diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/UtxoStoreConfiguration.java b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/UtxoStoreConfiguration.java index 3681b109c..4d82dab85 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/UtxoStoreConfiguration.java +++ b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/UtxoStoreConfiguration.java @@ -1,13 +1,10 @@ package com.bloxbean.cardano.yaci.store.utxo; -import com.bloxbean.cardano.yaci.store.utxo.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.utxo.storage.UtxoStorage; import com.bloxbean.cardano.yaci.store.utxo.storage.UtxoStorageReader; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.InvalidTransactionStorageImpl; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.UtxoCache; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.UtxoStorageImpl; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.UtxoStorageReaderImpl; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.repository.InvalidTransactionRepository; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.repository.TxInputRepository; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.repository.UtxoRepository; import org.jooq.DSLContext; @@ -39,12 +36,6 @@ public UtxoStorage utxoStorage(UtxoRepository utxoRepository, TxInputRepository return new UtxoStorageImpl(utxoRepository, spentOutputRepository, dslContext, utxoCache); } - @Bean - @ConditionalOnMissingBean - public InvalidTransactionStorage invalidTransactionStorage(InvalidTransactionRepository invalidTransactionRepository) { - return new InvalidTransactionStorageImpl(invalidTransactionRepository); - } - @Bean @ConditionalOnMissingBean public UtxoStorageReader utxoStorageReader(UtxoRepository utxoRepository, TxInputRepository spentOutputRepository, DSLContext dslContext) { diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessor.java b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessor.java index 0eb8c704d..571acdabb 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessor.java +++ b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessor.java @@ -15,9 +15,7 @@ import com.bloxbean.cardano.yaci.store.events.EventMetadata; import com.bloxbean.cardano.yaci.store.events.TransactionEvent; import com.bloxbean.cardano.yaci.store.utxo.domain.AddressUtxoEvent; -import com.bloxbean.cardano.yaci.store.utxo.domain.InvalidTransaction; import com.bloxbean.cardano.yaci.store.utxo.domain.TxInputOutput; -import com.bloxbean.cardano.yaci.store.utxo.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.utxo.storage.UtxoStorage; import io.micrometer.core.instrument.MeterRegistry; import lombok.NonNull; @@ -44,7 +42,6 @@ @Slf4j public class UtxoProcessor { private final UtxoStorage utxoStorage; - private final InvalidTransactionStorage invalidTransactionStorage; private final ApplicationEventPublisher publisher; private final MeterRegistry meterRegistry; @@ -127,15 +124,6 @@ private Optional handleInvalidTransaction(EventMetadata metadata, if (!transaction.isInvalid()) return Optional.empty(); - //insert invalid transactions and collateral return utxo if any - InvalidTransaction invalidTransaction = InvalidTransaction.builder() - .txHash(transaction.getTxHash()) - .slot(metadata.getSlot()) - .blockHash(metadata.getBlockHash()) - .transaction(transaction) - .build(); - invalidTransactionStorage.save(invalidTransaction); - //collateral output AddressUtxo collateralOutputUtxo = Optional.ofNullable(transaction.getCollateralReturnUtxo()) .map(utxo -> getCollateralReturnAddressUtxo(metadata, utxo)) diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessor.java b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessor.java index 3df6a1837..1a21e8f79 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessor.java +++ b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessor.java @@ -1,7 +1,6 @@ package com.bloxbean.cardano.yaci.store.utxo.processor; import com.bloxbean.cardano.yaci.store.events.RollbackEvent; -import com.bloxbean.cardano.yaci.store.utxo.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.utxo.storage.UtxoStorage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,7 +13,6 @@ @Slf4j public class UtxoRollbackProcessor { private final UtxoStorage utxoStorage; - private final InvalidTransactionStorage invalidTransactionStorage; @EventListener @Transactional @@ -23,11 +21,8 @@ public void handleRollbackEvent(RollbackEvent rollbackEvent) { int deletedUnspent = utxoStorage.deleteUnspentBySlotGreaterThan(rollBackToSlot); int deletedSpent = utxoStorage.deleteSpentBySlotGreaterThan(rollBackToSlot); - int invalidTxnDeleted = invalidTransactionStorage.deleteBySlotGreaterThan(rollBackToSlot); - log.info("Rollback -- {} address_utxos records", deletedUnspent); log.info("Rollback -- {} spent output records", deletedSpent); - log.info("Rollback -- {} invalid_transactions records", invalidTxnDeleted); } } diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapper.java b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapper.java index d2ea276e6..e2d54a3d9 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapper.java +++ b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapper.java @@ -2,9 +2,7 @@ import com.bloxbean.cardano.yaci.store.common.domain.AddressUtxo; import com.bloxbean.cardano.yaci.store.common.domain.TxInput; -import com.bloxbean.cardano.yaci.store.utxo.domain.InvalidTransaction; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.AddressUtxoEntity; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.InvalidTransactionEntity; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.TxInputEntity; import org.mapstruct.DecoratedWith; import org.mapstruct.Mapper; @@ -19,7 +17,4 @@ public interface UtxoMapper { AddressUtxo toAddressUtxo(AddressUtxoEntity entity); TxInput toTxInput(TxInputEntity txInputEntity); - - InvalidTransactionEntity toInvalidTransactionEntity(InvalidTransaction invalidTransaction); - InvalidTransaction toInvalidTransaction(InvalidTransactionEntity invalidTransactionEntity); } diff --git a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapperDecorator.java b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapperDecorator.java index 7b814dc1f..d6892725d 100644 --- a/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapperDecorator.java +++ b/stores/utxo/src/main/java/com/bloxbean/cardano/yaci/store/utxo/storage/impl/mapper/UtxoMapperDecorator.java @@ -2,9 +2,7 @@ import com.bloxbean.cardano.yaci.store.common.domain.AddressUtxo; import com.bloxbean.cardano.yaci.store.common.domain.TxInput; -import com.bloxbean.cardano.yaci.store.utxo.domain.InvalidTransaction; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.AddressUtxoEntity; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.InvalidTransactionEntity; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.model.TxInputEntity; public class UtxoMapperDecorator implements UtxoMapper { @@ -42,13 +40,4 @@ public TxInput toTxInput(TxInputEntity txInputEntity) { return delegate.toTxInput(txInputEntity); } - @Override - public InvalidTransactionEntity toInvalidTransactionEntity(InvalidTransaction invalidTransaction) { - return delegate.toInvalidTransactionEntity(invalidTransaction); - } - - @Override - public InvalidTransaction toInvalidTransaction(InvalidTransactionEntity invalidTransactionEntity) { - return delegate.toInvalidTransaction(invalidTransactionEntity); - } } diff --git a/stores/utxo/src/main/resources/db/store/h2/V0_200_1__init.sql b/stores/utxo/src/main/resources/db/store/h2/V0_200_1__init.sql index 8c1ae40e8..ed0a6c472 100644 --- a/stores/utxo/src/main/resources/db/store/h2/V0_200_1__init.sql +++ b/stores/utxo/src/main/resources/db/store/h2/V0_200_1__init.sql @@ -67,18 +67,3 @@ CREATE INDEX idx_tx_input_slot CREATE INDEX idx_tx_input_block ON tx_input(spent_at_block); --- invalid_transaction -drop table if exists invalid_transaction; -create table invalid_transaction -( - tx_hash varchar(64) not null - primary key, - slot bigint not null, - block_hash varchar(64), - transaction json null, - create_datetime timestamp, - update_datetime timestamp -); - -CREATE INDEX idx_invalid_transaction_slot - ON invalid_transaction(slot); diff --git a/stores/utxo/src/main/resources/db/store/mysql/V0_200_1__init.sql b/stores/utxo/src/main/resources/db/store/mysql/V0_200_1__init.sql index 59c208001..727682a16 100644 --- a/stores/utxo/src/main/resources/db/store/mysql/V0_200_1__init.sql +++ b/stores/utxo/src/main/resources/db/store/mysql/V0_200_1__init.sql @@ -67,18 +67,3 @@ CREATE INDEX idx_tx_input_slot CREATE INDEX idx_tx_input_block ON tx_input(spent_at_block); --- invalid_transaction -drop table if exists invalid_transaction; -create table invalid_transaction -( - tx_hash varchar(64) not null - primary key, - slot bigint not null, - block_hash varchar(64), - transaction json null, - create_datetime timestamp, - update_datetime timestamp -); - -CREATE INDEX idx_invalid_transaction_slot - ON invalid_transaction(slot); diff --git a/stores/utxo/src/main/resources/db/store/postgresql/V0_200_1__init.sql b/stores/utxo/src/main/resources/db/store/postgresql/V0_200_1__init.sql index 2fded2c88..197ffe0ba 100644 --- a/stores/utxo/src/main/resources/db/store/postgresql/V0_200_1__init.sql +++ b/stores/utxo/src/main/resources/db/store/postgresql/V0_200_1__init.sql @@ -68,18 +68,3 @@ CREATE INDEX idx_tx_input_slot CREATE INDEX idx_tx_input_block ON tx_input(spent_at_block); --- invalid_transaction -drop table if exists invalid_transaction; -create table invalid_transaction -( - tx_hash varchar(64) not null - primary key, - slot bigint not null, - block_hash varchar(64), - transaction jsonb, - create_datetime timestamp, - update_datetime timestamp -); - -CREATE INDEX idx_invalid_transaction_slot - ON invalid_transaction(slot); diff --git a/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessorTest.java b/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessorTest.java index b36c5c3d7..354171639 100644 --- a/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessorTest.java +++ b/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoProcessorTest.java @@ -7,7 +7,6 @@ import com.bloxbean.cardano.yaci.store.common.domain.TxInput; import com.bloxbean.cardano.yaci.store.events.EventMetadata; import com.bloxbean.cardano.yaci.store.events.TransactionEvent; -import com.bloxbean.cardano.yaci.store.utxo.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.utxo.storage.UtxoStorage; import io.micrometer.core.instrument.MeterRegistry; import org.junit.jupiter.api.BeforeEach; @@ -38,9 +37,6 @@ public class UtxoProcessorTest { @Mock private UtxoStorage utxoStorage; - @Mock - private InvalidTransactionStorage invalidTransactionStorage; - @Mock private ApplicationEventPublisher publisher; @@ -57,7 +53,7 @@ public class UtxoProcessorTest { @BeforeEach public void setup() { // openMocks(this); - utxoProcessor = new UtxoProcessor(utxoStorage, invalidTransactionStorage, publisher, meterRegistry); + utxoProcessor = new UtxoProcessor(utxoStorage, publisher, meterRegistry); } @Test diff --git a/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorIT.java b/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorIT.java index 60ba3cab6..7f2af3e5e 100644 --- a/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorIT.java +++ b/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorIT.java @@ -2,7 +2,6 @@ import com.bloxbean.cardano.yaci.core.protocol.chainsync.messages.Point; import com.bloxbean.cardano.yaci.store.events.RollbackEvent; -import com.bloxbean.cardano.yaci.store.utxo.storage.impl.repository.InvalidTransactionRepository; import com.bloxbean.cardano.yaci.store.utxo.storage.impl.repository.UtxoRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -22,8 +21,6 @@ public class UtxoRollbackProcessorIT { @Autowired private UtxoRepository utxoRepository; - @Autowired - private InvalidTransactionRepository invalidTransactionRepository; @Test @SqlGroup({ @@ -41,20 +38,4 @@ void givenRollbackEvent_shouldDeleteAddressUtxos() throws Exception { assertThat(count).isEqualTo(14); } - @Test - @SqlGroup({ - @Sql(value = "classpath:scripts/invalid_transaction_data.sql", executionPhase = BEFORE_TEST_METHOD) - }) - void givenRollbackEvent_shouldDeleteInvalidTransactions() throws Exception { - RollbackEvent rollbackEvent = RollbackEvent.builder() - .rollbackTo(new Point(13133973, "96bb7918a219dbe0cb01d3962b78a883931da27b5a4987af7c1bd964d7ffc6ff")) - .currentPoint(new Point(13518703, "5470beb0a38e7793db667269e55ed74b339d35db57e640d8f82de831ee348ba0")) - .build(); - - utxoRollbackProcessor.handleRollbackEvent(rollbackEvent); - - int count = invalidTransactionRepository.findAll().size(); - assertThat(count).isEqualTo(12); - } - } diff --git a/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorTest.java b/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorTest.java index 54ba0a9a9..84d396169 100644 --- a/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorTest.java +++ b/stores/utxo/src/test/java/com/bloxbean/cardano/yaci/store/utxo/processor/UtxoRollbackProcessorTest.java @@ -1,15 +1,10 @@ package com.bloxbean.cardano.yaci.store.utxo.processor; -import com.bloxbean.cardano.yaci.core.protocol.chainsync.messages.Point; -import com.bloxbean.cardano.yaci.store.events.RollbackEvent; -import com.bloxbean.cardano.yaci.store.utxo.storage.InvalidTransactionStorage; import com.bloxbean.cardano.yaci.store.utxo.storage.UtxoStorage; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) @@ -18,9 +13,6 @@ class UtxoRollbackProcessorTest { @Mock private UtxoStorage utxoStorage; - @Mock - private InvalidTransactionStorage invalidTransactionStorage; - @InjectMocks private UtxoRollbackProcessor utxoRollbackProcessor; @@ -29,16 +21,4 @@ void setup() { } - @Test - void handleRollbackEvent() { - RollbackEvent rollbackEvent = RollbackEvent.builder() - .currentPoint(new Point(78650212, "07de1aad598dd499d44be8bd8c28d5cadf4f47fbfb6b2144ccfb376c996ffcec")) - .rollbackTo(new Point(78650198, "ff86fbda2fc051e9337c9bcd7d58d82948000cb7ed5658f306046ad154f8389e")) - .build(); - - utxoRollbackProcessor.handleRollbackEvent(rollbackEvent); - - Mockito.verify(utxoStorage, Mockito.times(1)).deleteUnspentBySlotGreaterThan(rollbackEvent.getRollbackTo().getSlot()); - Mockito.verify(invalidTransactionStorage, Mockito.times(1)).deleteBySlotGreaterThan(rollbackEvent.getRollbackTo().getSlot()); - } }