def test_for_mining_block(): last_block = Block.genesis_block_generator() data = 'test-data' block = Block.mine_the_block(last_block, data) assert isinstance(block, Block) assert block.data == data assert block.last_hash == last_block.hash assert convert_hex_to_binary(block.hash)[0:block.difficulty] == '0' * block.difficulty
def chain_is_valid(chain): """ In this block, I validate the incoming chain. The whole point, it to ednforce the following rules of the blockchain: - the chain starts with the genesis block - blocks must be formatted correctly """ if chain[0] != Block.genesis_block_generator(): raise Exception('The Genesis Block Must Be Valid') for i in range(1, len(chain)): block = chain[i] last_block = chain[i-1] Block.block_is_valid(last_block, block) Blockchain.transaction_chain_is_valid(chain)
def last_block(): return Block.genesis_block_generator()
def test_for_slowly_mined_blocks(): last_block = Block.mine_the_block(Block.genesis_block_generator(), 'foo') time.sleep(MINE_RATE / SECS) mined_block = Block.mine_the_block(last_block, 'bar') assert mined_block.difficulty == last_block.difficulty - 1
def test_for_quickly_mined_blocks(): last_block = Block.mine_the_block(Block.genesis_block_generator(), 'foo') mined_block = Block.mine_the_block(last_block, 'bar') assert mined_block.difficulty == last_block.difficulty + 1
def test_for_genesis_generation(): genesis = Block.genesis_block_generator() assert isinstance(genesis, Block) for key, value in THE_GENESIS_BLOCK_DATA.items(): getattr(genesis, key) == value
def __init__(self): self.chain = [Block.genesis_block_generator()]