Ejemplo n.º 1
0
def test_is_block_valid():
    last_block = Block.genesis_block()
    block = Block.mine_block(last_block, "dummy data")
    Block.is_block_valid(last_block, block)

    # bad last hash check
    block = Block.mine_block(last_block, "dummy data")
    block.last_hash = "evil_last_hash"
    with pytest.raises(
            Exception,
            match=
            "The last block hash and the last hash of the new block should match"
    ):
        Block.is_block_valid(last_block, block)

    # bad proof of work
    block = Block.mine_block(last_block, "dummy data")
    block.hash = "aaaaa"
    with pytest.raises(Exception, match="Proof of work requirement not met"):
        Block.is_block_valid(last_block, block)

    # difficulty tampered
    difficulty = 10
    block = Block.mine_block(last_block, "dummy data")
    block.difficulty = difficulty
    block.hash = f"{'0' * difficulty}1111a"

    with pytest.raises(Exception,
                       match="The block difficulty must only adjust by 1"):
        Block.is_block_valid(last_block, block)
Ejemplo n.º 2
0
def test_genesis_block():
    genesis = Block.genesis_block()

    assert isinstance(genesis, Block)

    for key, value in GENESIS_DATA.items():
        getattr(genesis, key) == value
Ejemplo n.º 3
0
def test_mine_block():
    last_block = Block.genesis_block()
    data = "test=block"
    block = Block.mine_block(last_block, data)

    assert isinstance(block, Block)
    assert block.data == data
    assert block.last_hash == last_block.hash
    assert hex_to_binary(
        block.hash)[0:block.difficulty] == '0' * block.difficulty
Ejemplo n.º 4
0
    def is_chain_valid(chain):
        """
        Validate the chain
        """

        if chain[0] != Block.genesis_block():
            raise Exception("The genesis block is not valid")

        for i in range(1, len(chain)):
            block = chain[i]
            last_block = chain[i - 1]
            Block.is_block_valid(last_block, block)
        BlockChain.is_transaction_chain_valid(chain)
Ejemplo n.º 5
0
 def __init__(self):
     self.chain = [Block.genesis_block()]
Ejemplo n.º 6
0
def test_slowly_mined_block():
    last_block = Block.mine_block(Block.genesis_block(), 'abcd')
    time.sleep(MINE_RATE / SECONDS)
    mined_block = Block.mine_block(last_block, '1234')
    assert mined_block.difficulty == last_block.difficulty - 1
Ejemplo n.º 7
0
def test_quickly_mined_block():
    last_block = Block.mine_block(Block.genesis_block(), 'abcd')
    mined_block = Block.mine_block(last_block, '1234')

    assert mined_block.difficulty == last_block.difficulty + 1