Exemplo n.º 1
0
def test_add_candidates():
    """Validate to include a new candidate"""

    block = Block.genesis_block(timestamp=datetime(2000, 1, 1), difficulty=4, mining=True)
    blockchain = BlockChain(block)

    assert blockchain.last_block == block
    assert blockchain.candidate_block is None
    assert blockchain.num_blocks == 1
    assert blockchain.is_valid

    # Add a new candidate
    assert blockchain.add_candidate(None, timestamp=datetime(2000, 1, 2))

    assert blockchain.last_block == block
    assert blockchain.candidate_block is not None
    assert blockchain.num_blocks == 1
    assert blockchain.is_valid

    # Fail in the mining process
    assert blockchain.mining_candidate(maximum_iter=0) is False

    # Mining the candidate block
    assert blockchain.mining_candidate()

    # The blockchain is now valid
    assert blockchain.last_block != block
    assert blockchain.candidate_block is None
    assert blockchain.num_blocks == 2
    assert blockchain.is_valid
Exemplo n.º 2
0
def test_basic_blockchain():
    """Test the basic blockchain"""

    # BlockChain without values
    blockchain = BlockChain()

    assert blockchain.last_block is not None
    assert blockchain.candidate_block is None
    assert blockchain.num_blocks == 1
    assert blockchain.is_valid

    # Manual definition of the genesis block
    block = Block.genesis_block(timestamp=datetime(2000, 1, 1), difficulty=4)
    blockchain = BlockChain(block)

    assert blockchain.last_block is None
    assert blockchain.candidate_block == block
    assert blockchain.num_blocks == 0
    assert blockchain.is_valid is False

    # it is not possible to add a new candidate
    assert blockchain.add_candidate(None) is False

    # Mining the candidate block
    assert blockchain.mining_candidate()

    # The blockchain is now valid
    assert blockchain.last_block == block
    assert blockchain.candidate_block is None
    assert blockchain.num_blocks == 1
    assert blockchain.is_valid
Exemplo n.º 3
0
def test_mining_candidate():
    """Test mining candidate """

    block = Block.genesis_block(timestamp=datetime(2000, 1, 1), difficulty=4, mining=True)
    blockchain = BlockChain(block)

    # Add a new candidate
    assert blockchain.add_candidate(None, timestamp=datetime(2000, 1, 2))
    assert blockchain.mining_candidate()

    # Add an empty candidate
    assert blockchain.add_candidate(None)
    assert blockchain.mining_candidate()

    # Add an invalid candidate (same date)
    assert blockchain.add_candidate(None, timestamp=datetime(2000, 1, 1)) is False
    assert blockchain.mining_candidate() is False
Exemplo n.º 4
0
def test_block_repr():
    """Test the report function"""

    block = Block.genesis_block(timestamp=datetime(2000, 1, 1), difficulty=4, mining=True)
    blockchain = BlockChain(block)

    assert repr(blockchain) == \
           "Block: 0 (2000-01-01 00:00:00) - Hash: 015921ac58652b4e01d109cbb3ad10b55836e700a93e761036343ce8a82023ae\n"

    for minute in range(1, 6):
        blockchain.add_candidate(None, timestamp=datetime(2000, 1, 1, 0, minute, 0))
        blockchain.mining_candidate()

    assert repr(blockchain) == \
           "Block: 5 (2000-01-01 00:05:00) - Hash: 0332726221951b73e5fb945914341aa1e92014151680375cdf8c632256dc9a54\n" + \
           "Block: 4 (2000-01-01 00:04:00) - Hash: 0bf9e27631d08c326b15f7b459b47f91d9202c07ede76ce8503d636e09070402\n" + \
           "Block: 3 (2000-01-01 00:03:00) - Hash: 07ded3c477dc38fe3d0bc434b2924430f81231a0d7878f906e2a655c1f17d444\n" + \
           "Block: 2 (2000-01-01 00:02:00) - Hash: 0f8ed5b1cc4dca95c0c04b5b64a1ac409d636dbfd294282092f579d3872b1c15\n" + \
           "Block: 1 (2000-01-01 00:01:00) - Hash: 037eeba6b1779e5edd02e4a2b4909260193adaab7ef8abaf04ddc8ab2fc39c95\n" + \
           "\nand 1 block hidden"
Exemplo n.º 5
0
def test_minimum_interval():
    """Test minimum interval period"""

    block = Block.genesis_block(timestamp=datetime(2000, 1, 1, 0, 0, 0), difficulty=4, mining=True)
    blockchain = BlockChain(block)

    # A block in a minute
    assert blockchain.add_candidate(None, timestamp=datetime(2000, 1, 1, 0, 1, 0))
    assert blockchain.mining_candidate()

    # A block in 30 seconds is not valid
    assert blockchain.add_candidate(None, timestamp=datetime(2000, 1, 1, 0, 1, 30)) is False
Exemplo n.º 6
0
def test_update_difficulty():
    """Test increase and decrease difficulty values"""

    block = Block.genesis_block(timestamp=datetime(2000, 1, 1, 0, 0, 0), difficulty=4, mining=True)
    blockchain = BlockChain(block)

    # Change the interval for tests
    blockchain.difficulty_interval = 2

    # Blocks generates in a minute: the difficulty must increase
    for minute in range(1, 7):
        blockchain.add_candidate(None, timestamp=datetime(2000, 1, 1, 0, minute, 0))
        blockchain.mining_candidate()

    assert blockchain.chain[3].difficulty == 4
    assert blockchain.chain[4].difficulty == 5
    assert blockchain.chain[5].difficulty == 5
    assert blockchain.chain[6].difficulty == 6

    # Blocks generates in any eleven minutes: the difficulty must decrease
    for minute in range(17, 60, 11):
        blockchain.add_candidate(None, timestamp=datetime(2000, 1, 1, 0, minute, 0))
        blockchain.mining_candidate()

    blockchain.add_candidate(None, timestamp=datetime(2000, 1, 1, 1, 1, 0))
    blockchain.mining_candidate()

    assert blockchain.chain[9].difficulty == 7
    assert blockchain.chain[10].difficulty == 6
Exemplo n.º 7
0
def test_change_block_contains():
    """Test different attacks to the blockchain"""

    data = ["Avocado", "Apple", "Cherry", "Orange", "Strawberry"]

    block = Block.genesis_block(data[0], timestamp=datetime(2000, 1, 1), difficulty=4, mining=True)
    blockchain = BlockChain(block)

    for minute in range(1, len(data)):
        assert blockchain.add_candidate(data[minute], timestamp=datetime(2000, 1, 1, 0, minute, 0))
        assert blockchain.mining_candidate()

    assert blockchain.is_valid

    # Alter the blockchain data
    blockchain.chain[2].data = 'Khaki'

    assert blockchain.is_valid is False