def add_block(self, proof):
        prev_block = self._blocks[-1]

        block = Block()  # New block
        block.prev_hash = prev_block.get_hash()
        block.blockNo = prev_block.blockNo + 1
        block.proof = proof
        if self._valid_proof(prev_block.get_proof(), prev_block.get_hash(),
                             proof):

            block._transactions = copy.deepcopy(self._transactions)
            self._blocks.append(block)
            return block
        return None
    def chain_from_json(self, chain_data):
        builded_chain = []
        for bd in chain_data:
            try:
                block_dict = json.loads(str(bd))
            except:
                block_dict = bd
            block = Block()
            block.timestamp = block_dict['timestamp']
            block.blockNo = block_dict['blockNo']
            block.prev_hash = block_dict['prev_hash']
            block.proof = block_dict['proof']

            ts = block_dict['_transactions']
            _t = [
                Transaction(t['origin'], t['key'], t['value'], t['timestamp'])
                for t in ts
            ]
            block._transactions = _t
            builded_chain.append(block)

        return builded_chain
    def block_from_json(self, block_data):
        for l in block_data:
            block_data = json.loads(l)
        block = Block()  # New block
        block.prev_hash = block_data['prev_hash']
        block.blockNo = block_data['blockNo']
        block.proof = block_data['proof']
        block.timestamp = block_data['timestamp']

        conf_transactions = []
        for t in block_data['_transactions']:
            t1 = Transaction(t['origin'], t['key'], t['value'], t['timestamp'])

            if t1 in self._transactions:
                conf_transactions.append(t1)
            else:
                print("[ERROR] Possible not syncro with other transactions")
                return None

        block._transactions = conf_transactions
        if self.valid_block(block):
            return block
        return None