input: 
  def compose_basic_blockchain() -> Blockchain:
      """Compose a basic blockchain system in Python. The blockchain is composed of two classes: Block and Blockchain. 
      The Block class represents each block in the chain, containing an index, timestamp, data, and the hash of the previous block. 
      The Blockchain class manages the chain and provides a method to add new blocks.
      
      >>> block_data = {'timestamp': '2023-10-01 12:00:00', 'data': 'First block data'}
      >>> blockchain = compose_basic_blockchain()
      >>> blockchain.add_block(block_data)
      >>> print(blockchain.get_chain())
      '[{"index": 0, "timestamp": "2023-10-01 12:00:00", "data": "First block data", "previous_hash": null, "hash": "<SHA-256 hash>"}]'
      """
  
output:     
      class Block:
          def __init__(self, index: int, timestamp: str, data: dict, previous_hash: str):
              self.index = index
              self.timestamp = timestamp
              self.data = data
              self.previous_hash = previous_hash
              self.hash = self.calculate_hash()
          
          def calculate_hash(self) -> str:
              block_string = f"{self.index}{self.timestamp}{self.data}{self.previous_hash}"
              return hashlib.sha256(block_string.encode()).hexdigest()
  
      class Blockchain:
          def __init__(self):
              self.chain = [self.create_genesis_block()]
          
          def create_genesis_block(self) -> Block:
              return Block(0, "2023-10-01 12:00:00", "Genesis Block", "0")
          
          def get_latest_block(self) -> Block:
              return self.chain[-1]
          
          def add_block(self, data: dict):
              latest_block = self.get_latest_block()
              new_block = Block(latest_block.index + 1, data['timestamp'], data['data'], latest_block.hash)
              self.chain.append(new_block)
          
          def get_chain(self) -> str:
              return json.dumps([{'index': block.index, 'timestamp': block.timestamp, 'data': block.data, 'previous_hash': block.previous_hash, 'hash': block.hash} for block in self.chain])
  
      return Blockchain()
  