Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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)
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
def test_valid_transaction_chain(blockchain_three_blocks):
    Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
Ejemplo n.º 18
0
def test_valid_transaction_chain(blockchain_init):
    Blockchain.is_valid_transaction_chain(blockchain_init.chain)
Ejemplo n.º 19
0
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)
Ejemplo n.º 20
0
def test_valid_transaction_chain(populated_blockchain):
    Blockchain.is_valid_transaction_chain(populated_blockchain.chain)