mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
fix spend input twice bug (https://github.com/bigchaindb/bigchaindb/issues/1099) 0.8.2
This commit is contained in:
parent
c4cf0a5231
commit
27dbf6157d
@ -79,6 +79,11 @@ class Transaction(Transaction):
|
|||||||
raise AmountError('`amount` needs to be greater than zero')
|
raise AmountError('`amount` needs to be greater than zero')
|
||||||
input_amount += input_tx.conditions[input_cid].amount
|
input_amount += input_tx.conditions[input_cid].amount
|
||||||
|
|
||||||
|
# Validate that all inputs are distinct
|
||||||
|
links = [(f.tx_input.txid, f.tx_input.cid) for f in self.fulfillments]
|
||||||
|
if len(links) != len(set(links)):
|
||||||
|
raise DoubleSpend('tx "{}" spends inputs twice'.format(self.id))
|
||||||
|
|
||||||
# validate asset id
|
# validate asset id
|
||||||
asset_id = Asset.get_asset_id(input_txs)
|
asset_id = Asset.get_asset_id(input_txs)
|
||||||
if asset_id != self.asset.data_id:
|
if asset_id != self.asset.data_id:
|
||||||
|
|||||||
@ -1178,3 +1178,34 @@ class TestMultipleInputs(object):
|
|||||||
# check that the other remain marked as unspent
|
# check that the other remain marked as unspent
|
||||||
for unspent in transactions[1:]:
|
for unspent in transactions[1:]:
|
||||||
assert b.get_spent(unspent.id, 0) is None
|
assert b.get_spent(unspent.id, 0) is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_cant_spend_same_input_twice_in_tx(b):
|
||||||
|
"""
|
||||||
|
Recreate duplicated fulfillments bug
|
||||||
|
https://github.com/bigchaindb/bigchaindb/issues/1099
|
||||||
|
"""
|
||||||
|
from bigchaindb.models import Asset, Transaction
|
||||||
|
from bigchaindb.common.exceptions import DoubleSpend
|
||||||
|
|
||||||
|
# create a divisible asset
|
||||||
|
tx_create = Transaction.create([b.me], [([b.me], 100)],
|
||||||
|
asset=Asset(divisible=True))
|
||||||
|
tx_create_signed = tx_create.sign([b.me_private])
|
||||||
|
assert b.validate_transaction(tx_create_signed) == tx_create_signed
|
||||||
|
|
||||||
|
## create a block and valid vote
|
||||||
|
b.create_genesis_block()
|
||||||
|
block = b.create_block([tx_create_signed])
|
||||||
|
b.write_block(block, durability='hard')
|
||||||
|
vote = b.vote(block.id, b.get_last_voted_block().id, True)
|
||||||
|
b.write_vote(vote)
|
||||||
|
|
||||||
|
# Create a transfer transaction with duplicated fulfillments
|
||||||
|
dup_inputs = tx_create.to_inputs() + tx_create.to_inputs()
|
||||||
|
tx_transfer = Transaction.transfer(dup_inputs, [([b.me], 200)],
|
||||||
|
asset=tx_create_signed.asset)
|
||||||
|
tx_transfer_signed = tx_transfer.sign([b.me_private])
|
||||||
|
assert b.is_valid_transaction(tx_transfer_signed) is False
|
||||||
|
with pytest.raises(DoubleSpend):
|
||||||
|
tx_transfer_signed.validate(b)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user