add double spend test, fix double spend validation

This commit is contained in:
codegeschrei 2017-11-16 11:53:14 +01:00
parent e27c1e9cef
commit 63f0baf1b7
3 changed files with 55 additions and 2 deletions

View File

@ -55,7 +55,7 @@ def get_spent(conn, transaction_id, output):
try:
return conn.run(
conn.collection('transactions')
.find_one({'id': transaction_id,
.find_one({'inputs.fulfills.transaction_id': transaction_id,
'inputs.fulfills.output_index': output},
{'_id': 0}))
except IndexError:

View File

@ -68,7 +68,19 @@ class BigchainDB(Bigchain):
def get_spent(self, txid, output):
transaction = backend.query.get_spent(self.connection, txid,
output)
return Transaction.from_dict(transaction)
if transaction and transaction['operation'] == 'CREATE':
asset = backend.query.get_asset(self.connection, transaction['id'])
if asset:
transaction['asset'] = asset
else:
transaction['asset'] = {'data': None}
return Transaction.from_dict(transaction)
elif transaction and transaction['operation'] == 'TRANSFER':
return Transaction.from_dict(transaction)
else:
return None
def store_block(self, block):
"""Create a new block."""

View File

@ -74,3 +74,44 @@ def test_deliver_tx__double_spend_fails(b):
assert b.get_transaction(tx.id).id == tx.id
result = app.deliver_tx(encode_tx_to_bytes(tx))
assert result.is_error()
def test_deliver_transfer_tx__double_spend_fails(b):
from bigchaindb.tendermint import App
from bigchaindb.models import Transaction
from bigchaindb.common.crypto import generate_key_pair
from bigchaindb.common.transaction import Input
alice = generate_key_pair()
bob = generate_key_pair()
carly = generate_key_pair()
asset = {
"msg": "live long and prosper"
}
tx = Transaction.create([alice.public_key],
[([alice.public_key], 1)],
asset = asset)\
.sign([alice.private_key])
app = App(b)
result = app.deliver_tx(encode_tx_to_bytes(tx))
assert result.is_ok()
tx_transfer = Transaction.transfer(tx.to_inputs(),
[([bob.public_key], 1)],
asset_id = tx.id)\
.sign([alice.private_key])
app = App(b)
result = app.deliver_tx(encode_tx_to_bytes(tx_transfer))
assert result.is_ok()
double_spend = Transaction.transfer(tx.to_inputs(),
[([carly.public_key], 1)],
asset_id = tx.id)\
.sign([alice.private_key])
app = App(b)
result = app.deliver_tx(encode_tx_to_bytes(double_spend))
assert result.is_error()