예제 #1
0
    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]
예제 #2
0
    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]
예제 #3
0
    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]
예제 #4
0
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
예제 #5
0
    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())]
예제 #7
0
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()]
예제 #8
0
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()]
예제 #9
0
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