mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
Decouple metadata from transaction
This commit is contained in:
parent
d9d0585228
commit
94ce03cbec
@ -395,6 +395,13 @@ class Bigchain(object):
|
||||
' with the chain'.format(txid))
|
||||
# if its not and invalid transaction
|
||||
if status is not None:
|
||||
if 'metadata' not in transaction:
|
||||
metadata = list(self.get_metadata([transaction['id']]))
|
||||
metadata = metadata[0] if metadata else None
|
||||
if metadata:
|
||||
metadata.pop('id', None)
|
||||
transaction.update({'metadata': metadata})
|
||||
|
||||
non_invalid_transactions.append(transaction)
|
||||
|
||||
if non_invalid_transactions:
|
||||
|
@ -5,7 +5,7 @@ from bigchaindb.common.exceptions import (InvalidHash, InvalidSignature,
|
||||
DoubleSpend, InputDoesNotExist,
|
||||
TransactionNotInValidBlock,
|
||||
AssetIdMismatch, AmountError,
|
||||
SybilError,
|
||||
SybilError, ValidationError,
|
||||
DuplicateTransaction)
|
||||
from bigchaindb.common.transaction import Transaction
|
||||
from bigchaindb.common.utils import (gen_timestamp, serialize,
|
||||
@ -47,9 +47,7 @@ class Transaction(Transaction):
|
||||
'input `{}` does not exist in a valid block'.format(
|
||||
input_txid))
|
||||
|
||||
print(input_txid, self.id)
|
||||
spent = bigchain.get_spent(input_txid, input_.fulfills.output)
|
||||
print(spent)
|
||||
if spent and spent.id != self.id:
|
||||
raise DoubleSpend('input `{}` was already spent'
|
||||
.format(input_txid))
|
||||
@ -116,9 +114,11 @@ class Transaction(Transaction):
|
||||
|
||||
# get metadata of the transaction
|
||||
metadata = list(bigchain.get_metadata([tx_dict['id']]))
|
||||
if metadata:
|
||||
metadata = metadata[0]
|
||||
del metadata['id']
|
||||
if 'metadata' not in tx_dict:
|
||||
metadata = metadata[0] if metadata else None
|
||||
if metadata:
|
||||
metadata.pop('id', None)
|
||||
|
||||
tx_dict.update({'metadata': metadata})
|
||||
|
||||
return cls.from_dict(tx_dict)
|
||||
@ -407,8 +407,8 @@ class Block(object):
|
||||
if isinstance(metadata, dict):
|
||||
metadata.update({'id': transaction['id']})
|
||||
metadatas.append(metadata)
|
||||
else:
|
||||
transaction.update({'metadata': metadata})
|
||||
elif metadata:
|
||||
raise ValidationError('Invalid value for metadata')
|
||||
|
||||
return (metadatas, block_dict)
|
||||
|
||||
@ -444,6 +444,10 @@ class Block(object):
|
||||
and a list of metadata, reconstruct the original block by putting the
|
||||
metadata of each transaction back into its original transaction.
|
||||
|
||||
NOTE: Till a transaction gets accepted the `metadata` of the transaction
|
||||
is not moved outside of the transaction. So, if a transaction is found to
|
||||
have metadata then it should not be overridden.
|
||||
|
||||
Args:
|
||||
block_dict (:obj:`dict`): The block dict as returned from a
|
||||
database call.
|
||||
@ -457,9 +461,13 @@ class Block(object):
|
||||
metadatal = {m.pop('id'): m for m in metadatal}
|
||||
# add the metadata to their corresponding transactions
|
||||
for transaction in block_dict['block']['transactions']:
|
||||
metadata = metadatal.get(transaction['id'])
|
||||
if metadata:
|
||||
transaction.update({'metadata': metadata})
|
||||
if 'metadata' not in transaction:
|
||||
metadata = metadatal.get(transaction['id'])
|
||||
if metadata:
|
||||
metadata.pop('id', None)
|
||||
transaction.update({'metadata': metadata})
|
||||
else:
|
||||
transaction.update({'metadata': None})
|
||||
return block_dict
|
||||
|
||||
@staticmethod
|
||||
|
@ -421,7 +421,8 @@ def test_get_new_blocks_feed(b, create_tx):
|
||||
ts = str(random.random())
|
||||
block = Block(transactions=[create_tx], timestamp=ts)
|
||||
b.write_block(block)
|
||||
return block.decouple_assets()[1]
|
||||
block_dict = block.decouple_assets()[1]
|
||||
return block.decouple_metadata(block_dict)[1]
|
||||
|
||||
create_block()
|
||||
b1 = create_block()
|
||||
|
@ -64,7 +64,8 @@ def test_create_tables():
|
||||
assert conn.run(r.db(dbname).table_list().contains('backlog')) is True
|
||||
assert conn.run(r.db(dbname).table_list().contains('votes')) is True
|
||||
assert conn.run(r.db(dbname).table_list().contains('assets')) is True
|
||||
assert len(conn.run(r.db(dbname).table_list())) == 4
|
||||
assert conn.run(r.db(dbname).table_list().contains('metadata')) is True
|
||||
assert len(conn.run(r.db(dbname).table_list())) == 5
|
||||
|
||||
|
||||
@pytest.mark.bdb
|
||||
|
@ -38,7 +38,6 @@ def test_get_owned_ids_works_after_double_spend(b, user_pk, user_sk):
|
||||
input_valid.id,
|
||||
{'1': 1}).sign([user_sk])
|
||||
|
||||
print(tx_valid)
|
||||
# write the valid tx and wait for voting/block to catch up
|
||||
b.write_transaction(tx_valid)
|
||||
time.sleep(5)
|
||||
|
Loading…
x
Reference in New Issue
Block a user