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)
def test_genesis_block(): genesis = Block.genesis_block() assert isinstance(genesis, Block) for key, value in GENESIS_DATA.items(): getattr(genesis, key) == value
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
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)
def __init__(self): self.chain = [Block.genesis_block()]
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
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