From c90e4fcc2789d3b0f27434e0af3ff7e98ac5c8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Wed, 11 Jan 2023 21:34:28 +0100 Subject: [PATCH] added raiing CriticialDoubleSpend Exception for governance and transactions fixed search space issue with election / voting commit lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jürgen Eckel --- planetmint/backend/tarantool/query.py | 12 +++++++++--- planetmint/lib.py | 6 +++--- tests/db/test_planetmint_api.py | 8 ++++---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/planetmint/backend/tarantool/query.py b/planetmint/backend/tarantool/query.py index 475698b..a003992 100644 --- a/planetmint/backend/tarantool/query.py +++ b/planetmint/backend/tarantool/query.py @@ -14,6 +14,7 @@ from operator import itemgetter from planetmint.backend import query from planetmint.backend.models.dbtransaction import DbTransaction from planetmint.backend.exceptions import OperationDataInsertionError +from planetmint.exceptions import CriticalDoubleSpend from planetmint.backend.tarantool.const import ( TARANT_TABLE_META_DATA, TARANT_TABLE_ASSETS, @@ -133,7 +134,10 @@ def store_transaction(connection, transaction): connection.run(connection.space(TARANT_TABLE_TRANSACTION).insert(tx), only_data=False) except Exception as e: logger.info(f"Could not insert transactions: {e}") - raise OperationDataInsertionError() + if e.args[0] == 3 and e.args[1].startswith('Duplicate key exists in'): + raise CriticalDoubleSpend() + else: + raise OperationDataInsertionError() @register_query(TarantoolDBConnection) @@ -163,8 +167,10 @@ def store_governance_transaction(connection, transaction): try: connection.run(connection.space(TARANT_TABLE_GOVERNANCE).insert(tx), only_data=False) except Exception as e: - logger.info(f"Could not insert governance transaction: {e}") - raise OperationDataInsertionError() + if e.args[0] == 3 and e.args[1].startswith('Duplicate key exists in'): + raise CriticalDoubleSpend() + else: + raise OperationDataInsertionError() @register_query(TarantoolDBConnection) diff --git a/planetmint/lib.py b/planetmint/lib.py index 924af5e..84f341a 100644 --- a/planetmint/lib.py +++ b/planetmint/lib.py @@ -245,8 +245,8 @@ class Planetmint(object): if unspent_outputs: return backend.query.delete_unspent_outputs(self.connection, *unspent_outputs) - def is_committed(self, transaction_id): - transaction = backend.query.get_transaction_by_id(self.connection, transaction_id) + def is_committed(self, transaction_id, table=TARANT_TABLE_TRANSACTION): + transaction = backend.query.get_transaction_by_id(self.connection, transaction_id, table) return bool(transaction) def get_transaction(self, transaction_id, table=TARANT_TABLE_TRANSACTION): @@ -614,7 +614,7 @@ class Planetmint(object): """ duplicates = any(txn for txn in current_transactions if txn.id == transaction.id) - if self.is_committed(transaction.id) or duplicates: + if self.is_committed(transaction.id, TARANT_TABLE_GOVERNANCE) or duplicates: raise DuplicateTransaction("transaction `{}` already exists".format(transaction.id)) current_validators = self.get_validators_dict() diff --git a/tests/db/test_planetmint_api.py b/tests/db/test_planetmint_api.py index f87a569..2711d31 100644 --- a/tests/db/test_planetmint_api.py +++ b/tests/db/test_planetmint_api.py @@ -18,6 +18,7 @@ from transactions.types.assets.transfer import Transfer from planetmint.backend.models import Output +from planetmint.exceptions import CriticalDoubleSpend pytestmark = pytest.mark.bdb @@ -46,10 +47,9 @@ class TestBigchainApi(object): with pytest.raises(DoubleSpend): b.validate_transaction(transfer_tx2) - b.store_bulk_transactions([transfer_tx2]) - with pytest.raises(CriticalDoubleSpend): - b.get_spent(tx.id, 0) + b.store_bulk_transactions([transfer_tx2]) + def test_double_inclusion(self, b, alice): from tarantool.error import DatabaseError @@ -62,7 +62,7 @@ class TestBigchainApi(object): b.store_bulk_transactions([tx]) if isinstance(b.connection, TarantoolDBConnection): - with pytest.raises(DatabaseError): + with pytest.raises(CriticalDoubleSpend): b.store_bulk_transactions([tx]) else: with pytest.raises(OperationError):