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"])
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"])
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'])
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.")
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')
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'])
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")
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)