input: Write a function to compose a basic blockchain system in Python. The function should define a class for blocks and a class for the blockchain, allowing addition of blocks to the blockchain and returning the entire blockchain in JSON format. The blockchain should use SHA256 as its hashing function for block integrity.
  
  
  import hashlib
  import json
  
  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)
  
  assert Blockchain().get_chain() == '[]'
  blockchain = Blockchain()
  blockchain.add_block({'timestamp': '2023-10-01T00:00:00', 'data': 'Block 1'})
  assert len(json.loads(blockchain.get_chain())) == 1
  blockchain.add_block({'timestamp': '2023-10-01T01:00:00', 'data': 'Block 2'})
  assert len(json.loads(blockchain.get_chain())) == 2
  
output: 
  import hashlib
  import json
  
  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)
  