input: Write a function to create a basic blockchain system in Python. The function should include a class for each block and a class for the blockchain, allowing the addition of blocks and retrieval of the entire blockchain in JSON format.
  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 test cases
  assert Blockchain().get_chain() == '[]'
  blockchain = Blockchain()
  blockchain.add_block({'timestamp': '2023-01-01T00:00:00', 'data': 'Block 1'})
  blockchain.add_block({'timestamp': '2023-01-02T00:00:00', 'data': 'Block 2'})
  blockchain.add_block({'timestamp': '2023-01-03T00:00:00', 'data': 'Block 3'})
  assert blockchain.get_chain() == json.dumps([
      {'index': 0, 'timestamp': '2023-01-01T00:00:00', 'data': 'Block 1', 'previous_hash': None, 
       'hash': sha256('02023-01-01T00:00:00Block 1None')},
      {'index': 1, 'timestamp': '2023-01-02T00:00:00', 'data': 'Block 2', 'previous_hash': sha256('02023-01-01T00:00:00Block 1None'), 
       'hash': sha256('12023-01-02T00:00:00Block 2' + sha256('02023-01-01T00:00:00Block 1None'))},
      {'index': 2, 'timestamp': '2023-01-03T00:00:00', 'data': 'Block 3', 'previous_hash': sha256('12023-01-02T00:00:00Block 2' + sha256('02023-01-01T00:00:00Block 1None')), 
       'hash': sha256('22023-01-03T00:00:00Block 3' + sha256('12023-01-02T00:00:00Block 2' + sha256('02023-01-01T00:00:00Block 1None')))}
  ], indent=2)
output: def sha256(data):
      hash_function = hashlib.sha256()
      hash_function.update(data.encode('utf-8'))
      return hash_function.hexdigest()
  
  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}')
  
  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)
  
      def get_chain(self):
          return json.dumps([b.__dict__ for b in self.chain], indent=2)