diff --git a/bigchaindb/backend/localmongodb/query.py b/bigchaindb/backend/localmongodb/query.py index d193ebb9..5ad6a0a0 100644 --- a/bigchaindb/backend/localmongodb/query.py +++ b/bigchaindb/backend/localmongodb/query.py @@ -91,8 +91,12 @@ def get_assets(conn, asset_ids): @register_query(LocalMongoDBConnection) def get_spent(conn, transaction_id, output): - query = {'inputs.fulfills': {'transaction_id': transaction_id, - 'output_index': output}} + query_array = [{'transaction_id': transaction_id, + 'output_index': output}, + {'output_index': output, + 'transaction_id': transaction_id}] + query = {'inputs.fulfills': {'$in': query_array}} + return conn.run( conn.collection('transactions') .find(query, {'_id': 0})) diff --git a/tests/tendermint/test_fastquery.py b/tests/tendermint/test_fastquery.py index 542ae56c..b83722e0 100644 --- a/tests/tendermint/test_fastquery.py +++ b/tests/tendermint/test_fastquery.py @@ -85,14 +85,13 @@ def test_outputs_query_key_order(b, user_pk, user_sk, user2_pk, user2_sk): b.store_bulk_transactions([tx1]) inputs = tx1.to_inputs() - tx2 = Transaction.transfer([inputs[0]], [([user2_pk], 2)], tx1.id).sign([user_sk]) + tx2 = Transaction.transfer([inputs[1]], [([user2_pk], 2)], tx1.id).sign([user_sk]) + assert tx2.validate(b) tx2_dict = tx2.to_dict() fulfills = tx2_dict['inputs'][0]['fulfills'] - tx2_dict['inputs'][0]['fulfills'] = {'transaction_id': fulfills['transaction_id'], 'output_index': fulfills['output_index']} - backend.query.store_transactions(b.connection, [tx2_dict]) outputs = b.get_outputs_filtered(user_pk, spent=False) @@ -109,7 +108,6 @@ def test_outputs_query_key_order(b, user_pk, user_sk, user2_pk, user2_sk): b.store_bulk_transactions([tx1]) tx2_dict = tx2.to_dict() - tx2_dict['inputs'][0]['fulfills'] = {'output_index': fulfills['output_index'], 'transaction_id': fulfills['transaction_id']} diff --git a/tests/tendermint/test_lib.py b/tests/tendermint/test_lib.py index 701ab3ca..f85a3fb9 100644 --- a/tests/tendermint/test_lib.py +++ b/tests/tendermint/test_lib.py @@ -471,3 +471,36 @@ def test_migrate_abci_chain_generates_new_chains(b, chain, block_height, b.migrate_abci_chain() latest_chain = b.get_latest_abci_chain() assert latest_chain == expected + + +@pytest.mark.bdb +def test_get_spent_key_order(b, user_pk, user_sk, user2_pk, user2_sk): + from bigchaindb import backend + from bigchaindb.models import Transaction + from bigchaindb.common.crypto import generate_key_pair + from bigchaindb.common.exceptions import DoubleSpend + + alice = generate_key_pair() + bob = generate_key_pair() + + tx1 = Transaction.create([user_pk], + [([alice.public_key], 3), ([user_pk], 2)], + asset=None)\ + .sign([user_sk]) + b.store_bulk_transactions([tx1]) + + inputs = tx1.to_inputs() + tx2 = Transaction.transfer([inputs[1]], [([user2_pk], 2)], tx1.id).sign([user_sk]) + assert tx2.validate(b) + + tx2_dict = tx2.to_dict() + fulfills = tx2_dict['inputs'][0]['fulfills'] + tx2_dict['inputs'][0]['fulfills'] = {'output_index': fulfills['output_index'], + 'transaction_id': fulfills['transaction_id']} + + backend.query.store_transactions(b.connection, [tx2_dict]) + + tx3 = Transaction.transfer([inputs[1]], [([bob.public_key], 2)], tx1.id).sign([user_sk]) + + with pytest.raises(DoubleSpend): + tx3.validate(b)