input: 
  import hashlib
  import json
  
  # We will use SHA256 as our hashing function
  def sha256(data):
      hash_function = hashlib.sha256()
      hash_function.update(data.encode('utf-8'))
      return hash_function.hexdigest()
  
  # Create a class for each block
  class Block:
      def __init__(self, index, timestamp, data, previous_hash):
          self.index = index
          self.timestamp = timestamp
          self.data = data
          self.previous_hash = previous_hash
          self.hash = sha256(f'{self.index}{self.timestamp}{self.data}{self.previous_hash}')
  
  # Create a class for the blockchain
  class Blockchain:
      def __init__(self):
          self.chain = []
  
      def add_block(self, data):
          previous_hash = self.chain[-1].hash if len(self.chain) > 0 else None
          block = Block(len(self.chain), data['timestamp'], data['data'], previous_hash)
          self.chain.append(block)
  
      # This method will return the entire blockchain in JSON format
      def get_chain(self):
          return json.dumps([b.__dict__ for b in self.chain], indent=2)
  
  # Example usage:
  blockchain = Blockchain()
  blockchain.add_block({"timestamp": "2023-10-05T12:00:00", "data": "First block data"})
  blockchain.add_block({"timestamp": "2023-10-05T13:00:00", "data": "Second block data"})
  print(blockchain.get_chain())
  # Output:
  # [
  #   {
  #     "index": 0,
  #     "timestamp": "2023-10-05T12:00:00",
  #     "data": "First block data",
  #     "previous_hash": null,
  #     "hash": "9b5f49e71a0d8c41a0e5eaf41ba5fadb5ce64dd327f6244cec3bd3c1b1a4b66d"
  #   },
  #   {
  #     "index": 1,
  #     "timestamp": "2023-10-05T13:00:00",
  #     "data": "Second block data",
  #     "previous_hash": "9b5f49e71a0d8c41a0e5eaf41ba5fadb5ce64dd327f6244cec3bd3c1b1a4b66d",
  #     "hash": "b6f61c7b7b5e4d5d9f2d6d9d6f2f7b7b9d2d6d9f6f2f7b7b9d2d6d9f6f2f7b7b"
  #   }
  # ]
  
  
output:     
      def is_valid(self):
          for i in range(1, len(self.chain)):
              current_block = self.chain[i]
              previous_block = self.chain[i - 1]
              if current_block.hash != sha256(f'{current_block.index}{current_block.timestamp}{current_block.data}{current_block.previous_hash}'):
                  return False
              if current_block.previous_hash != previous_block.hash:
                  return False
          return True
  