Example #1
0
def test_for_transaction_update():
    wallet_for_sender = Wallet()
    first_recipient = 'first_recipient'
    first_amount_sent = 45
    transaction = SystemTransactions(wallet_for_sender, first_recipient,
                                     first_amount_sent)

    next_recipient = 'next_recipient'
    next_amount_sent = 70
    transaction.transaction_update(wallet_for_sender, next_recipient,
                                   next_amount_sent)

    assert transaction.transaction_output[next_recipient] == next_amount_sent
    assert transaction.transaction_output[wallet_for_sender.address] ==\
        wallet_for_sender.wallet_balance - first_amount_sent - next_amount_sent
    assert Wallet.verify_signature(transaction.transaction_input['public_key'],
                                   transaction.transaction_output,
                                   transaction.transaction_input['signature'])

    amount_resend_to_first_recipient = 30
    transaction.transaction_update(wallet_for_sender, first_recipient,
                                   amount_resend_to_first_recipient)

    assert transaction.transaction_output[first_recipient] == \
        first_amount_sent + amount_resend_to_first_recipient
    assert transaction.transaction_output[wallet_for_sender.address] ==\
        wallet_for_sender.wallet_balance - first_amount_sent - next_amount_sent - amount_resend_to_first_recipient
    assert Wallet.verify_signature(transaction.transaction_input['public_key'],
                                   transaction.transaction_output,
                                   transaction.transaction_input['signature'])
def test_tx_update():
    sender_wallet = Wallet()
    recipient = "b64e8ac4"
    amount = 50
    transaction = Transaction(sender_wallet, recipient, amount)

    next_recipient = "a13b2bf4"
    next_amount = 60

    # update Tx with new recipient
    transaction.tx_update(sender_wallet, next_recipient, next_amount)

    assert transaction.output[next_recipient] == next_amount
    assert transaction.output[sender_wallet.address] == (
        sender_wallet.balance - amount - next_amount)
    assert Wallet.verify_signature(transaction.input["public_key"],
                                   transaction.output,
                                   transaction.input["signature"])

    # update Tx with existing recipient; repeat of first Tx
    transaction.tx_update(sender_wallet, recipient, amount)

    assert transaction.output[recipient] == amount * 2
    assert transaction.output[sender_wallet.address] == (
        sender_wallet.balance - amount * 2 - next_amount)
    assert Wallet.verify_signature(transaction.input["public_key"],
                                   transaction.output,
                                   transaction.input["signature"])
Example #3
0
def test_transaction_update():
    sender_wallet = Wallet()
    recipient = "abcd"
    amount = 500
    transaction = Transaction(sender_wallet, recipient, amount)

    transaction.update_transaction(sender_wallet, "abcde", 300)
    transaction.update_transaction(sender_wallet, "abcd", 700)

    assert transaction.output[recipient] == 700
    assert transaction.output[sender_wallet.address] == 0

    assert Wallet.verify_signature(transaction.input['public_key'],
                                   transaction.output,
                                   transaction.input['signature'])
def test_transaction():
    sender_wallet = Wallet()
    recipient = "b64e8ac4"
    amount = 369
    transaction = Transaction(sender_wallet, recipient, amount)

    assert transaction.output[recipient] == amount
    assert transaction.output[
        sender_wallet.address] == sender_wallet.balance - amount

    assert "timestamp" in transaction.input
    assert transaction.input["amount"] == sender_wallet.balance
    assert transaction.input["address"] == sender_wallet.address
    assert transaction.input["public_key"] == sender_wallet.public_key

    assert Wallet.verify_signature(transaction.input["public_key"],
                                   transaction.output,
                                   transaction.input["signature"])
Example #5
0
def test_transaction():
    sender_wallet = Wallet()
    recipient = "giveto"
    amount = 50
    transaction = Transaction(sender_wallet, recipient, amount)

    assert transaction.output[recipient] == amount
    assert transaction.output[
        sender_wallet.address] == sender_wallet.balance - amount

    assert 'timestamp' in transaction.input
    assert transaction.input['amount'] == sender_wallet.balance

    assert transaction.input['public_key'] == sender_wallet.public_key

    assert Wallet.verify_signature(transaction.input['public_key'],
                                   transaction.output,
                                   transaction.input['signature'])
Example #6
0
    def is_tx_valid(transaction):
        """
        Determine validity of a transaction.
        """
        # Tx is mining reward, must be (a) single Tx and (b) said Tx == MINING_REWARD
        if (transaction.input == MINING_REWARD_INPUT):
            if (list(transaction.output.values()) != [MINING_REWARD]):
                raise Exception("Invalid block reward transaction.")
            return  # exit, mining reward does not have following vals

        output_total = sum(transaction.output.values())

        if (transaction.input["amount"] != output_total):
            raise Exception("Invalid transaction.")

        if not Wallet.verify_signature(transaction.input["public_key"],
                                       transaction.output,
                                       transaction.input["signature"]):
            raise Exception("Invalid signature.")
Example #7
0
    def positively_validate_transaction(transaction):
        """
        This section is responsible for validating a transaction and 
        then to raise an exception for invalid transactions.
        """
        if transaction.transaction_input == INPUT_FOR_MINING_REWARD:
            if list(transaction.transaction_output.values()) != [THE_MINING_REWARD]:
                raise Exception('Mining Reward is Invalid')
            return
        transaction_output_total = sum(transaction.transaction_output.values())

        if transaction.transaction_input['amount'] != transaction_output_total:
            raise Exception('Invalid Transaction Because the Output Values Are Wrong')

        if not Wallet.verify_signature(
            transaction.transaction_input['public_key'],
            transaction.transaction_output,
            transaction.transaction_input['signature']
        ):
            raise Exception('The Signature is Invalid')
Example #8
0
def test_transaction():
    wallet_for_sender = Wallet()
    recipient = 'recipient'
    amount = 50
    transaction = SystemTransactions(wallet_for_sender, recipient, amount)

    assert transaction.transaction_output[recipient] == amount
    assert transaction.transaction_output[
        wallet_for_sender.address] == wallet_for_sender.wallet_balance - amount

    assert 'timestamp' in transaction.transaction_input
    assert transaction.transaction_input[
        'amount'] == wallet_for_sender.wallet_balance
    assert transaction.transaction_input[
        'address'] == wallet_for_sender.address
    assert transaction.transaction_input[
        'public_key'] == wallet_for_sender.public_key

    assert Wallet.verify_signature(transaction.transaction_input['public_key'],
                                   transaction.transaction_output,
                                   transaction.transaction_input['signature'])
Example #9
0
    def is_transaction_valid(transaction):
        """
        Verify if a transaction is valid.
        """

        if transaction.input == MINIING_REWARD_INPUT:
            if list(transaction.output.values())[0] != MINIING_REWARD:
                raise Exception("Invalid reward transaction")
            return

        output_total = sum(transaction.output.values())

        if transaction.input['amount'] != output_total:
            raise Exception(
                "Invalid transaction.  Input amount and sum of output amounts doesnt match"
            )

        if not Wallet.verify_signature(transaction.input['public_key'],
                                       transaction.output,
                                       transaction.input['signature']):
            raise Exception("Invalid Signature")
Example #10
0
def test_verify_signature():
    data = {"block": "chain"}
    wallet = Wallet()
    signature = wallet.sign(data)

    assert Wallet.verify_signature(wallet.public_key, data, signature)
def test_verify_signature_with_valid_signature():
    data = {"foo": "bar"}
    wallet = Wallet()
    sig = wallet.gen_signature(data)

    assert Wallet.verify_signature(wallet.public_key, data, sig)