def test_is_valid_transaction_chain(): blockchain = Blockchain() blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_bad_transaction(blockchain_three_blocks): bad_transaction = Transaction(Wallet(), 'recipient', 1) bad_transaction.input['signature'] = Wallet().sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_duplicate_transactions( blockchain_three_blocks): transaction = Transaction(Wallet(), 'recipient', 1).to_json() blockchain_three_blocks.add_block([transaction, transaction]) with pytest.raises(Exception, match="is not unique"): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_multiple_rewards(blockchain_three_blocks): reward_1 = Transaction.reward_transaction(Wallet()).to_json() reward_2 = Transaction.reward_transaction(Wallet()).to_json() blockchain_three_blocks.add_block([reward_1, reward_2]) with pytest.raises(Exception, match='one mining reward per block'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_invalid_transaction_chain_malformed_transaction(blockchain_init): bad_transaction = Transaction(Wallet(), "recipient", 1) bad_transaction.input["signature"] = Wallet().sign(bad_transaction.output) blockchain_init.add_block([bad_transaction.to_json()]) with pytest.raises(Exception): Blockchain.is_valid_transaction_chain(blockchain_init.chain)
def test_invalid_transaction_chain_multiple_mining_rewards(blockchain_init): reward_1 = Transaction.reward_transaction(Wallet()).to_json() reward_2 = Transaction.reward_transaction(Wallet()).to_json() blockchain_init.add_block([reward_1, reward_2]) with pytest.raises(Exception, match="There can only be one mining reward per block."): Blockchain.is_valid_transaction_chain(blockchain_init.chain)
def test_is_valid_transaction_chain_bad_balance_history(populated_blockchain): wallet = Wallet() bad_transaction = Transaction(wallet, 'recipient', 1) bad_transaction.output[wallet.address] = 9000 bad_transaction.input['amount'] = 9001 bad_transaction.input['signature'] = wallet.sign(bad_transaction.output) populated_blockchain.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match='invalid input amount'): Blockchain.is_valid_transaction_chain(populated_blockchain.chain)
def test_is_valid_transaction_chain_duplicate_transactions(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) transaction = Transaction(Wallet(), 'recipient', 10).to_json() blockchain_three_blocks.add_block([transaction, transaction, transaction]) with pytest.raises(Exception, match='is not unique'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_multiple_rewards(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) reward1 = Transaction.reward_transaction(Wallet()).to_json() reward2 = Transaction.reward_transaction(Wallet()).to_json() blockchain_three_blocks.add_block([reward1, reward2]) with pytest.raises(Exception, match='one minig reward per block'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_bad_historic_balance(blockchain_three_blocks): wallet = Wallet() bad_transaction = Transaction(Wallet(), 'recipient', 1) bad_transaction.output[wallet.address] = 9000 bad_transaction.input['amount'] = 9001 bad_transaction.input['signature'] = wallet.sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_bad_history_balance( blockchain_three_blocks): wallet = Wallet() bad_transaction = Transaction(wallet, 'deadly_recipient', 1) bad_transaction.output[wallet.address] = 9999 bad_transaction.input['amount'] = 10000 bad_transaction.input['signature'] = wallet.sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match='has invalid input amount'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_bad_historic_balance(blockchain_three_blocks): wallet = Wallet() bad_transaction = Transaction(wallet, 'recipient', 1) # don't understand the point of this line of code. the point of the test is to ensure bad data isn't entered into the input['amount'] field which would result in the sender wallet's balance getting inflated. altering the output[wallet.address] field only serves to change the signature result, as far as i can tell. the test even passes when commenting out this line of code. bad_transaction.output[wallet.address] = 9000 bad_transaction.input['amount'] = 9001 bad_transaction.input['signature'] = wallet.sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match='has invalid input amount'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_bad_history_balance( blockchain_three_blocks): wallet = Wallet() bad_transaction = Transaction(wallet, "recipient", 1) bad_transaction.output[wallet.address] = 9000 bad_transaction.input["amount"] = 9001 bad_transaction.input["signature"] = wallet.sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match="has an invalid input amount"): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_bad_historic_balance(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) wallet = Wallet() bad_transaction = Transaction(wallet, 'recipient', 5) bad_transaction.output[wallet.address] = 10000 bad_transaction.input['amount'] = 10005 bad_transaction.input['signature'] = wallet.sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match="has an invalid input amount"): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_invalid_transaction_chain_bad_historic_balance(blockchain_init): wallet = Wallet() bad_transaction = Transaction(wallet, "recipient", 1) bad_transaction.output[wallet.address] = 9999 bad_transaction.input["amount"] = 10000 bad_transaction.input["signature"] = wallet.sign(bad_transaction.output) blockchain_init.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match="invalid input amount."): Blockchain.is_valid_transaction_chain(blockchain_init.chain)
def test_invalid_transaction_chain_duplicate_transactions(blockchain_init): transaction = Transaction(Wallet(), "recipient", 1).to_json() blockchain_init.add_block([transaction, transaction]) with pytest.raises(Exception, match="is not unique."): Blockchain.is_valid_transaction_chain(blockchain_init.chain)
def test_valid_transaction_chain(blockchain_three_blocks): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_valid_transaction_chain(blockchain_init): Blockchain.is_valid_transaction_chain(blockchain_init.chain)
def test_valid_transaction_chain_duplicate_transactions(populated_blockchain): transaction = Transaction(Wallet(), 'recipient', 1).to_json() populated_blockchain.add_block([transaction, transaction]) with pytest.raises(Exception, match='is not unique!'): Blockchain.is_valid_transaction_chain(populated_blockchain.chain)
def test_valid_transaction_chain(populated_blockchain): Blockchain.is_valid_transaction_chain(populated_blockchain.chain)