Beispiel #1
0
def test_clear_blockchain_transactions():
    transaction_pool = TransactionPool()
    transaction_1 = Transaction(Wallet(), 'first', 1)
    transaction_2 = Transaction(Wallet(), 'second', 2)
    transaction_3 = Transaction(Wallet(), 'three', 3)

    transaction_pool.set_transaction(transaction_1)
    transaction_pool.set_transaction(transaction_2)
    transaction_pool.set_transaction(transaction_3)

    blockchain = Blockchain()
    blockchain.add_block([
        transaction_1.to_json(),
        transaction_2.to_json(),
        transaction_3.to_json()
    ])

    assert transaction_1.id in transaction_pool.transaction_map
    assert transaction_2.id in transaction_pool.transaction_map
    assert transaction_3.id in transaction_pool.transaction_map

    transaction_pool.clear_blockchain_transactions(blockchain)

    assert not transaction_1.id in transaction_pool.transaction_map
    assert not transaction_2.id in transaction_pool.transaction_map
    assert not transaction_3.id in transaction_pool.transaction_map
def test_calculate_balance():
    blockchain = Blockchain()
    wallet = Wallet()

    assert wallet.calculate_balance(blockchain,
                                    wallet.address) == STARTING_BALANCE

    amount = 34
    transaction = Transaction(wallet, 'recipient', amount)
    blockchain.add_block([transaction.to_json()])

    assert wallet.calculate_balance(blockchain, wallet.address) ==\
         STARTING_BALANCE - amount

    received_amount_1 = 40
    received_transaction_1 = Transaction(Wallet(), wallet.address,
                                         received_amount_1)
    received_amount_2 = 110
    received_transaction_2 = Transaction(Wallet(), wallet.address,
                                         received_amount_2)

    blockchain.add_block(
        [received_transaction_1.to_json(),
         received_transaction_2.to_json()])

    assert wallet.calculate_balance(blockchain, wallet.address) ==\
         STARTING_BALANCE - amount + received_amount_1 +received_amount_2
def test_calculate_balance():
    blockchain = Blockchain()
    wallet = Wallet()

    assert Wallet.calculate_balance(blockchain,
                                    wallet.address) == STARTING_BALANCE

    amount = 20
    transacion = Transaction(wallet, 'recipient', amount)
    blockchain.add_block([transacion.to_json()])
    assert Wallet.calculate_balance(
        blockchain, wallet.address) == STARTING_BALANCE - amount

    recieved_amount1 = 10
    recieved_transaction1 = Transaction(Wallet(), wallet.address,
                                        recieved_amount1)
    recieved_amount2 = 40
    recieved_transaction2 = Transaction(Wallet(), wallet.address,
                                        recieved_amount2)
    blockchain.add_block(
        [recieved_transaction1.to_json(),
         recieved_transaction2.to_json()])
    assert Wallet.calculate_balance(
        blockchain, wallet.address
    ) == STARTING_BALANCE - amount + recieved_amount1 + recieved_amount2
def test_add_block():
    blockchain = Blockchain()
    data = "test-data"
    blockchain.add_block(data)

    # Check last block data is equal to test data
    assert blockchain.chain[-1].data == data
Beispiel #5
0
def test_replace_chain_negative_invalid_chain(blockchain):
    invalid_chain = Blockchain()
    invalid_chain.add_block('1')
    invalid_chain.add_block('1')
    invalid_chain.chain[0].hash = "0xabc"
    with pytest.raises(Exception, match="The incoming chain is not valid"):
        blockchain.replace_chain(invalid_chain.chain)
Beispiel #6
0
def blockchain_three_blocks():
    bc = Blockchain()

    for i in range(3):
        bc.add_block([Transaction(Wallet(), 'recipient', i).to_json()])

    return bc
def blockchain():
    blockchain = Blockchain()

    for i in range(5):
        blockchain.add_block(i)

    return blockchain
def test_calculate_balance():
    blockchain = Blockchain()
    wallet = Wallet()

    # NEW: new Wallet() `wallet` should have initial balance
    assert Wallet.calculate_balance(blockchain,
                                    wallet.address) == INITIAL_BALANCE

    sent_amt = 50
    outgoing_transaction = Transaction(
        wallet, "a13b2bf4", sent_amt)  # send to `wallet` from "a13b2bf4"
    blockchain.add_block([outgoing_transaction.serialize_to_json()])
    # SEND: `wallet` should have initial balance sans amt
    assert Wallet.calculate_balance(
        blockchain, wallet.address) == INITIAL_BALANCE - sent_amt

    received_amt_1 = 25
    incoming_transaction_1 = Transaction(
        Wallet(), wallet.address,
        received_amt_1)  # receive by `wallet` from new Wallet()
    received_amt_2 = 77
    incoming_transaction_2 = Transaction(Wallet(), wallet.address,
                                         received_amt_2)
    blockchain.add_block([
        incoming_transaction_1.serialize_to_json(),
        incoming_transaction_2.serialize_to_json()
    ])
    # RECEIVE: `wallet` should have initial balance plus incoming amt(s)
    assert Wallet.calculate_balance(
        blockchain, wallet.address
    ) == INITIAL_BALANCE - sent_amt + received_amt_1 + received_amt_2
Beispiel #9
0
def test_add_block():
    blockchain = Blockchain()
    data = "test-data"

    blockchain.add_block(data=data)

    assert blockchain.chain[-1].data == data
Beispiel #10
0
def test_add_block():
    blockchain = Blockchain()
    data = '123'
    blockchain.add_block(data)

    assert isinstance(blockchain, Blockchain)
    assert blockchain.chain[-1].data == data
def test_wallet_balance_amount():
	wallet = Wallet()
	blockchain = Blockchain()
	amount = 34
	tr1 = Transactions(wallet, 'recp1', amount)
	blockchain.add_block([tr1.to_json()])
	assert Wallet.calculate_balance(blockchain, wallet.address) == STARTING_BALANCE - amount
Beispiel #12
0
def test_blockchain_valid_transaction_duplicate_rewardss():
    blockchain = Blockchain()
    transaction = Transactions(Wallet(), 'recipient', 100).to_json()
    reward_transaction = Transactions.transaction_reward(Wallet()).to_json()
    blockchain.add_block([transaction, reward_transaction, reward_transaction])
    with pytest.raises(Exception, match="has multiple rewards"):
        Blockchain.is_chain_transaction_valid(blockchain.chain)
Beispiel #13
0
def blockchain_three_blocks():
    blockchain = Blockchain()

    for i in range(3):
        blockchain.add_block([Transaction(Wallet(), "recipient", i).to_json()])

    return blockchain
Beispiel #14
0
def test_is_valid_chain():
    blockchain = Blockchain()

    for i in range(3):
        blockchain.add_block(i)

    Blockchain.is_valid_chain(blockchain.chain)
Beispiel #15
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)
def test_add_block():
    blockchain = Blockchain()
    data = 'foo'
    blockchain.add_block(data)
    block = blockchain.chain[-1]

    assert block.data == data
    assert block.last_hash == GENESIS_DATA['hash']
Beispiel #17
0
def blockchain():
    blockchain = Blockchain()
    for i in range(3):
        miner_wallet = Wallet()
        transaction = Transactions(Wallet(), 'recipient', i)
        reward_transaction = Transactions.transaction_reward(miner_wallet)
        blockchain.add_block([transaction.to_json()])
        return blockchain
Beispiel #18
0
def test_replace_chain():
    blockchain = Blockchain()
    blockchain_three_blocks = Blockchain()
    for i in range(3):
        blockchain_three_blocks.add_block(i)

    blockchain.replace_chain(blockchain_three_blocks.chain)

    assert blockchain_three_blocks.chain == blockchain.chain
Beispiel #19
0
def test_replace_chain_not_longer():
    blockchain_three_blocks = Blockchain()
    for i in range(3):
        blockchain_three_blocks.add_block(i)

    blockchain = Blockchain()
    
    with pytest.raises(Exception, match="Cannot replace. The incomming chain must be longer"):
        blockchain_three_blocks.replace_chain(blockchain.chain)
Beispiel #20
0
def test_add_block():
    '''
        Purpose:
            Assert that the blockchain added the block and that the data
            matches.
    '''
    blockchain = Blockchain()
    data = 'test-data'
    blockchain.add_block(data)
    assert(blockchain.chain[-1].data == data)
Beispiel #21
0
def test_replace_chain_bad_chain():
    blockchain = Blockchain()
    blockchain_three_blocks = Blockchain()
    for i in range(3):
        blockchain_three_blocks.add_block(i)

    blockchain_three_blocks.chain[1].hash = 'bad-hash'
      
    with pytest.raises(Exception, match="Cannot replace. The incomming chain is invalid"):
        blockchain.replace_chain(blockchain_three_blocks.chain)
Beispiel #22
0
def test_is_valid_chain_bad_genesis():
    blockchain = Blockchain()

    for i in range(3):
        blockchain.add_block(i)

    blockchain.chain[0].hash = 'bad-hash'
    
    with pytest.raises(Exception, match='The genesis block must be valid'):
        Blockchain.is_valid_chain(blockchain.chain)
Beispiel #23
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)
Beispiel #24
0
def test_is_valid_transaction_chain_bad_transaction():
    blockchain_three_blocks = Blockchain()
    for i in range(3):
        blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()])

    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)
Beispiel #25
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)
def test_clear_blockchain_transactions():
    transactionpool=TransactionPool()
    transaction_1=Transaction(Wallet(),'recipient',40)
    transaction_2=Transaction(Wallet(),'recipient',41)
    transactionpool.set_transaction(transaction_1)
    transactionpool.set_transaction(transaction_2)
    blockchain=Blockchain()
    blockchain.add_block([transaction_1.to_json(),transaction_2.to_json()])
    assert transaction_1.id in transactionpool.transaction_map
    assert transaction_2.id in transactionpool.transaction_map
    transactionpool.clear_blockchain_transactions(blockchain)
    assert not transaction_1.id in transactionpool.transaction_map
    assert not transaction_2.id in transactionpool.transaction_map
Beispiel #27
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)
Beispiel #28
0
def test_purge():
    tx_pool = TransactionPool()
    tx_1 = Transaction(Wallet(), "adc193bd", 1)
    tx_2 = Transaction(Wallet(), "adc193bd", 2)
    tx_pool.set_transaction(tx_1)
    tx_pool.set_transaction(tx_2)
    blockchain = Blockchain()
    blockchain.add_block([tx_1.serialize_to_json(), tx_2.serialize_to_json()])

    assert tx_1.id in tx_pool.transaction_map
    assert tx_2.id in tx_pool.transaction_map
    # purge from Pool instance any Txs written to blockchain
    tx_pool.purge(blockchain)
    assert not tx_1.id in tx_pool.transaction_map
    assert not tx_2.id in tx_pool.transaction_map
def test_transaction_clear_transaction():
    transaction_pool = TransactionPool()
    transaction1 = Transactions(Wallet(), 'recp1', 10)
    transaction_pool.set_transaction(transaction1)
    blockchain = Blockchain()
    blockchain.add_block([transaction1.to_json()])
    # assert len(blockchain.chain) > 1
    print(transaction_pool.transaction_map)
    transaction_pool.clear_transaction(blockchain)
    assert transaction1.id not in transaction_pool.transaction_map.keys()
    # for index, block in enumerate(blockchain.chain):
    # 	if index == 0:
    # 		continue
    # 	for tdata in block.data:
    # 		# tdata = ast.literal_eval(tdata)
    # 		assert tdata['id'] == 'str'
Beispiel #30
0
def test_clear_blockchain_transactions():
    transaction_pool = TransactionPool()
    transaction1 = Transaction(Wallet(), 'recipeint', 1)
    transaction2 = Transaction(Wallet(), 'recipeint', 2)

    transaction_pool.set_transaction(transaction1)
    transaction_pool.set_transaction(transaction2)

    blockchain = Blockchain()
    blockchain.add_block([transaction1.to_json(), transaction2.to_json()])

    assert transaction1.id in transaction_pool.transaction_map
    assert transaction2.id in transaction_pool.transaction_map

    transaction_pool.clear_blockchain_transactions(blockchain)
    assert transaction1.id not in transaction_pool.transaction_map
    assert transaction2.id not in transaction_pool.transaction_map