input: from typing import List
  
  def generate_blockchain(transactions: List[str]) -> List[str]:
      """
      Generates a list of blockchain blocks based on the given list of transaction data.
      Each block is represented as a string containing its index, timestamp, data, and hash.
      
      The blockchain starts with a genesis block at index 0, and each subsequent block 
      references the hash of the previous block.
      
      Example:
      >>> generate_blockchain(['tx1', 'tx2', 'tx3'])
      [
          "[0, '2023-01-01 00:00:00', 'Genesis Block', 'hash_string']",
          "[1, '2023-01-01 00:00:01', 'tx1', 'previous_hash']",
          "[2, '2023-01-01 00:00:02', 'tx2', 'previous_hash']",
          "[3, '2023-01-01 00:00:03', 'tx3', 'previous_hash']"
      ]
      """
output:     from datetime import datetime, timedelta
      import hashlib
  
      def calculate_hash(index, timestamp, data, previous_hash):
          block_string = f"{index}{timestamp}{data}{previous_hash}"
          return hashlib.sha256(block_string.encode()).hexdigest()
  
      blockchain = []
      genesis_block = "[0, '2023-01-01 00:00:00', 'Genesis Block', 'hash_string']"
      blockchain.append(genesis_block)
  
      previous_hash = calculate_hash(0, '2023-01-01 00:00:00', 'Genesis Block', 'hash_string')
      timestamp = datetime(2023, 1, 1, 0, 0, 1)
  
      for index, transaction in enumerate(transactions, start=1):
          block_data = f"[{index}, '{timestamp.strftime('%Y-%m-%d %H:%M:%S')}', '{transaction}', '{previous_hash}']"
          blockchain.append(block_data)
          previous_hash = calculate_hash(index, timestamp.strftime('%Y-%m-%d %H:%M:%S'), transaction, previous_hash)
          timestamp += timedelta(seconds=1)
  
      return blockchain