def test_mine_block():
    last_block=Block.genesis()
    data='test-data'
    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 test_mined_block_difficulty_limits_at_1():
    last_block= Block(
        time.time(),
        'test_last_hash',
        'test_hash',
        'test_data',
        1,
        0
    )
    time.sleep(MINE_RATE / SECONDS)
    mined_block = Block.mine_block(last_block, 'hola2')
    assert mined_block.difficulty==1
    def is_valid_chain(chain):
        """
        Validate de incoming chain.
        Enforce the following  rules  of the blokchain:
        -the chain must start with genesis block
        -block must be formatted correctly
        """
        if chain[0] != Block.genesis():
            raise Exception('the genesis block must be invalid')

        for i in range(1, len(chain)):
            block = chain[i]
            last_block = chain[i - 1]
            Block.is_valid_block(last_block, block)
def test_genesis():
    genesis=Block.genesis()
    assert isinstance(genesis, Block)
    assert genesis.timestamp==GENESIS_DATA['timestamp']
    assert genesis.last_hash == GENESIS_DATA['last_hash']
    assert genesis.hash == GENESIS_DATA['hash']
    assert genesis.data == GENESIS_DATA['data']

    for key,value in GENESIS_DATA.items():
        getattr(genesis,key) == value
def test_is_valid_block_bad_block_hash(last_block,block):

    block.hash='00000000000000000000abbbc'

    with pytest.raises(Exception, match='The block difficulty must be incorrect'):
        Block.is_valid_block(last_block, block)
def test_is_valid_block_jumped_difficulty(last_block,block):
    jumped_difficulty=10
    block.difficulty=jumped_difficulty
    block.hash=f'{"0"*jumped_difficulty}111abc'
    with pytest.raises(Exception, match='The block hash must only adjust by 1'):
        Block.is_valid_block(last_block, block)
def test_is_valid_bad_proof_of_work(last_block,block):
    block.hash='ffff'
    with pytest.raises(Exception, match='The proof of requeriment  was not meet'):
        Block.is_valid_block(last_block, block)
def test_is_valid_block_bad_last_hash(last_block,block):
    block.last_hash='bad-lash-hash'
    with pytest.raises(Exception,match='The block last_hash must be incorrect'):
        Block.is_valid_block(last_block,block)
def test_is_valid_block(last_block,block):
    Block.is_valid_block(last_block,block)
def block(last_block):
    return Block.mine_block(last_block,'test-data')
def last_block():
    return Block.genesis()
def test_slowly_mined_block():
    last_block=Block.mine_block(Block.genesis(),'hola')
    time.sleep(MINE_RATE/SECONDS)
    mined_block=Block.mine_block(last_block,'hola2')
    assert mined_block.difficulty==last_block.difficulty-1
def test_quickly_mined_block():
    last_block=Block.mine_block(Block.genesis(),'hola')
    mined_block=Block.mine_block(last_block,'hola2')
    assert mined_block.difficulty==last_block.difficulty+1
 def add_block(self, data):
     #last_block = self.chain[-1] #el ultimo bloque
     self.chain.append(Block.mine_block(self.chain[-1], data))
 def __init__(self):
     self.chain = [Block.genesis()]  #agrega el bloque genesis