def filter_unspent_outputs(self, outputs): """Remove outputs that have not been spent Args: outputs: list of TransactionLink """ links = [o.to_dict() for o in outputs] txs = list(query.get_spending_transactions(self.connection, links)) spends = {TransactionLink.from_dict(input_['fulfills']) for tx in txs for input_ in tx['inputs']} return [ff for ff in outputs if ff in spends]
def filter_unspent_outputs(self, outputs): """Remove outputs that have not been spent Args: outputs: list of TransactionLink """ links = [o.to_dict() for o in outputs] txs = list(query.get_spending_transactions(self.connection, links)) spends = {TransactionLink.from_dict(input_['fulfills']) for tx in txs for input_ in tx['inputs']} return [ff for ff in outputs if ff in spends]
def filter_spent_outputs(self, outputs): """Remove outputs that have been spent Args: outputs: list of TransactionLink """ links = [o.to_dict() for o in outputs] res = query.get_spending_transactions(self.connection, links) txs = [tx for _, tx in self.filter_valid_items(res)] spends = {TransactionLink.from_dict(input_['fulfills']) for tx in txs for input_ in tx['inputs']} return [ff for ff in outputs if ff not in spends]
def test_get_spending_transactions_multiple_inputs(): from bigchaindb.backend import connect, query from bigchaindb.models import Transaction from bigchaindb.common.crypto import generate_key_pair conn = connect() (alice_sk, alice_pk) = generate_key_pair() (bob_sk, bob_pk) = generate_key_pair() (carol_sk, carol_pk) = generate_key_pair() out = [([alice_pk], 9)] tx1 = Transaction.create([alice_pk], out).sign([alice_sk]) inputs1 = tx1.to_inputs() tx2 = Transaction.transfer([inputs1[0]], [([alice_pk], 6), ([bob_pk], 3)], tx1.id).sign([alice_sk]) inputs2 = tx2.to_inputs() tx3 = Transaction.transfer([inputs2[0]], [([bob_pk], 3), ([carol_pk], 3)], tx1.id).sign([alice_sk]) inputs3 = tx3.to_inputs() tx4 = Transaction.transfer([inputs2[1], inputs3[0]], [([carol_pk], 6)], tx1.id).sign([bob_sk]) txns = [deepcopy(tx.to_dict()) for tx in [tx1, tx2, tx3, tx4]] conn.db.transactions.insert_many(txns) links = [ ({ 'transaction_id': tx2.id, 'output_index': 0 }, 1, [tx3.id]), ({ 'transaction_id': tx2.id, 'output_index': 1 }, 1, [tx4.id]), ({ 'transaction_id': tx3.id, 'output_index': 0 }, 1, [tx4.id]), ({ 'transaction_id': tx3.id, 'output_index': 1 }, 0, None), ] for l, num, match in links: txns = list(query.get_spending_transactions(conn, [l])) assert len(txns) == num if len(txns): assert [tx['id'] for tx in txns] == match
def filter_spent_outputs(self, outputs): """Remove outputs that have been spent Args: outputs: list of TransactionLink """ links = [o.to_dict() for o in outputs] res = query.get_spending_transactions(self.connection, links) txs = [tx for _, tx in self.filter_valid_items(res)] spends = { TransactionLink.from_dict(input_['fulfills']) for tx in txs for input_ in tx['inputs'] } return [ff for ff in outputs if ff not in spends]
def test_get_spending_transactions(user_pk): from bigchaindb.backend import connect, query from bigchaindb.models import Block, Transaction conn = connect() out = [([user_pk], 1)] tx1 = Transaction.create([user_pk], out * 3) inputs = tx1.to_inputs() tx2 = Transaction.transfer([inputs[0]], out, tx1.id) tx3 = Transaction.transfer([inputs[1]], out, tx1.id) tx4 = Transaction.transfer([inputs[2]], out, tx1.id) block = Block([tx1, tx2, tx3, tx4]) conn.db.bigchain.insert_one(block.to_dict()) links = [inputs[0].fulfills.to_dict(), inputs[2].fulfills.to_dict()] res = list(query.get_spending_transactions(conn, links)) # tx3 not a member because input 1 not asked for assert res == [(block.id, tx2.to_dict()), (block.id, tx4.to_dict())]
def test_get_spending_transactions(user_pk, user_sk): from bigchaindb.backend import connect, query from bigchaindb.models import Transaction conn = connect() out = [([user_pk], 1)] tx1 = Transaction.create([user_pk], out * 3) tx1.sign([user_sk]) inputs = tx1.to_inputs() tx2 = Transaction.transfer([inputs[0]], out, tx1.id) tx3 = Transaction.transfer([inputs[1]], out, tx1.id) tx4 = Transaction.transfer([inputs[2]], out, tx1.id) txns = [tx.to_dict() for tx in [tx1, tx2, tx3, tx4]] conn.db.transactions.insert_many(txns) links = [inputs[0].fulfills.to_dict(), inputs[2].fulfills.to_dict()] txns = list(query.get_spending_transactions(conn, links)) # tx3 not a member because input 1 not asked for assert txns == [tx2.to_dict(), tx4.to_dict()]
def test_get_spending_transactions(user_pk, user_sk): from bigchaindb.backend import connect, query from bigchaindb.models import Transaction conn = connect() out = [([user_pk], 1)] tx1 = Transaction.create([user_pk], out * 3) tx1.sign([user_sk]) inputs = tx1.to_inputs() tx2 = Transaction.transfer([inputs[0]], out, tx1.id).sign([user_sk]) tx3 = Transaction.transfer([inputs[1]], out, tx1.id).sign([user_sk]) tx4 = Transaction.transfer([inputs[2]], out, tx1.id).sign([user_sk]) txns = [deepcopy(tx.to_dict()) for tx in [tx1, tx2, tx3, tx4]] conn.db.transactions.insert_many(txns) links = [inputs[0].fulfills.to_dict(), inputs[2].fulfills.to_dict()] txns = list(query.get_spending_transactions(conn, links)) # tx3 not a member because input 1 not asked for assert txns == [tx2.to_dict(), tx4.to_dict()]
def test_get_spending_transactions_multiple_inputs(): from bigchaindb.backend import connect, query from bigchaindb.models import Transaction from bigchaindb.common.crypto import generate_key_pair conn = connect() (alice_sk, alice_pk) = generate_key_pair() (bob_sk, bob_pk) = generate_key_pair() (carol_sk, carol_pk) = generate_key_pair() out = [([alice_pk], 9)] tx1 = Transaction.create([alice_pk], out).sign([alice_sk]) inputs1 = tx1.to_inputs() tx2 = Transaction.transfer([inputs1[0]], [([alice_pk], 6), ([bob_pk], 3)], tx1.id).sign([alice_sk]) inputs2 = tx2.to_inputs() tx3 = Transaction.transfer([inputs2[0]], [([bob_pk], 3), ([carol_pk], 3)], tx1.id).sign([alice_sk]) inputs3 = tx3.to_inputs() tx4 = Transaction.transfer([inputs2[1], inputs3[0]], [([carol_pk], 6)], tx1.id).sign([bob_sk]) txns = [deepcopy(tx.to_dict()) for tx in [tx1, tx2, tx3, tx4]] conn.db.transactions.insert_many(txns) links = [ ({'transaction_id': tx2.id, 'output_index': 0}, 1, [tx3.id]), ({'transaction_id': tx2.id, 'output_index': 1}, 1, [tx4.id]), ({'transaction_id': tx3.id, 'output_index': 0}, 1, [tx4.id]), ({'transaction_id': tx3.id, 'output_index': 1}, 0, None), ] for l, num, match in links: txns = list(query.get_spending_transactions(conn, [l])) assert len(txns) == num if len(txns): assert [tx['id'] for tx in txns] == match