def test_bank_balances():
    # Create bank and issue Alice some coins
    bank = Bank()
    coinbase = bank.issue(1000, alice_public_key)

    # Alice sends 10 coins to Bob
    tx_ins = [TxIn(tx_id=coinbase.id, index=0, signature=None)]
    tx_id = uuid.uuid4()
    tx_outs = [
        TxOut(tx_id=tx_id, index=0, amount=10, public_key=bob_public_key),
        TxOut(tx_id=tx_id, index=1, amount=990, public_key=alice_public_key),
    ]
    alice_to_bob = Tx(id=tx_id, tx_ins=tx_ins, tx_outs=tx_outs)
    alice_to_bob.sign_input(0, alice_private_key)

    # After signing, Bob modifies transaction to get more $$$
    alice_to_bob.tx_outs[0].amount = 990
    alice_to_bob.tx_outs[1].amount = 10

    with pytest.raises(BadSignatureError):
        bank.handle_tx(alice_to_bob)
Esempio n. 2
0
def test_bank_balances():
    # Create bank and issue Alice some coins
    bank = Bank()
    coinbase = bank.issue(1000, alice_public_key)

    # Alice sends 10 coins to Bob
    tx_ins = [
        TxIn(tx_id=coinbase.id, index=0, signature=None),
    ]
    tx_id = uuid.uuid4()
    tx_outs = [
        TxOut(tx_id=tx_id, index=0, amount=10, public_key=bob_public_key),
        TxOut(tx_id=tx_id, index=1, amount=990, public_key=alice_public_key),
    ]
    alice_to_bob = Tx(id=tx_id, tx_ins=tx_ins, tx_outs=tx_outs)
    alice_to_bob.sign_input(0, alice_private_key)

    bank.handle_tx(alice_to_bob)

    alice_balance = bank.fetch_balance(alice_public_key)
    assert alice_balance == 990

    # Alice sends 10 coins to Bob
    tx_ins = [
        TxIn(tx_id=tx_id, index=1, signature=None),
    ]
    tx_id = uuid.uuid4()
    tx_outs = [
        TxOut(tx_id=tx_id, index=0, amount=10, public_key=bob_public_key),
        TxOut(tx_id=tx_id, index=1, amount=980, public_key=alice_public_key),
    ]
    alice_to_bob = Tx(id=tx_id, tx_ins=tx_ins, tx_outs=tx_outs)
    alice_to_bob.sign_input(0, alice_private_key)
    bank.handle_tx(alice_to_bob)

    alice_balance = bank.fetch_balance(alice_public_key)
    assert alice_balance == 980
Esempio n. 3
0
def prepare_simple_tx(utxos, sender_private_key, recipient_public_key, amount):
    from mybanknetcoin import Tx, TxIn, TxOut
    sender_public_key = sender_private_key.get_verifying_key()

    # Construct tx.tx_outs
    tx_ins = []
    tx_in_sum = 0
    for tx_out in utxos:
        tx_ins.append(
            TxIn(tx_id=tx_out.tx_id, index=tx_out.index, signature=None))
        tx_in_sum += tx_out.amount
        if tx_in_sum > amount:
            break

    # Make sure sender can afford it
    assert tx_in_sum >= amount

    # Construct tx.tx_outs
    tx_id = uuid.uuid4()
    change = tx_in_sum - amount
    tx_outs = [
        TxOut(tx_id=tx_id,
              index=0,
              amount=amount,
              public_key=recipient_public_key),
        TxOut(tx_id=tx_id,
              index=1,
              amount=change,
              public_key=sender_public_key),
    ]

    # Construct tx and sign inputs
    tx = Tx(id=tx_id, tx_ins=tx_ins, tx_outs=tx_outs)
    for i in range(len(tx.tx_ins)):
        tx.sign_input(i, sender_private_key)

    return tx