input: 
  from typing import List
  import hashlib
  import time
  
  class Block:
      """ Represents a block in a simple blockchain. 
      Each block has an index, timestamp, data, previous_hash, and its own hash.
      The block's hash is generated by hashing the concatenation of its index, timestamp, data, and previous_hash.
      >>> block = Block(0, '2023-10-03 12:00:00', 'Genesis Block', '0')
      >>> block.hash
      'cae56df20568f037b9e20146cfa4bd45c5c79c0089dd90eedb55d2f6a4b91bee'
      """
      def __init__(self, index, timestamp, data, previous_hash):
          self.index = index
          self.timestamp = timestamp
          self.data = data
          self.previous_hash = previous_hash
          self.hash = self.hash_block()
  
      def hash_block(self):
          sha = hashlib.sha256()
          sha.update((str(self.index) + 
                      str(self.timestamp) + 
                      str(self.data) + 
                      str(self.previous_hash)).encode('utf-8'))
          return sha.hexdigest()
  
  def create_genesis_block():
      """ Creates the first block in the blockchain. 
      The genesis block is typically the first block in the blockchain and has a hardcoded previous_hash of '0'.
      >>> genesis_block = create_genesis_block()
      >>> genesis_block.index
      0
      >>> genesis_block.data
      'Genesis Block'
      """
      return Block(0, time.time(), 'Genesis Block', '0')
  
  def next_block(previous_block, data):
      """ Creates the next block in the blockchain given the previous block and the data for the new block.
      The index is incremented by 1, the timestamp is the current time, and the hash is calculated.
      >>> genesis_block = create_genesis_block()
      >>> block2 = next_block(genesis_block, 'Transaction Data')
      >>> block2.index
      1
      >>> block2.data
      'Transaction Data'
      """
      return Block(previous_block.index + 1, time.time(), data, previous_block.hash)
  
  def create_blockchain():
      """ Creates a simple blockchain with the genesis block and additional blocks based on a list of transactions.
      The blockchain is a list of Block objects.
      >>> blockchain = create_blockchain()
      >>> len(blockchain)
      1
      >>> blockchain[0].index
      0
      >>> blockchain[0].data
      'Genesis Block'
      """
      blockchain = [create_genesis_block()]
      previous_block = blockchain[0]
  
      # Add blocks for each item in the list of transactions
      blockchain_transactions = ['Transaction 1', 'Transaction 2']
      for i in range(1, len(blockchain_transactions)):
          block_to_add = next_block(previous_block, blockchain_transactions[i])
          blockchain.append(block_to_add)
          previous_block = block_to_add
  
      return blockchain
  
  def print_blockchain(blockchain):
      """ Prints out each block in the blockchain with its index, timestamp, data, and hash.
      >>> blockchain = create_blockchain()
      >>> print_blockchain(blockchain)
      Block 0: Timestamp - 1633285200.0, Data - Genesis Block, Hash - cae56df20568f037b9e20146cfa4bd45c5c79c0089dd90eedb55d2f6a4b91bee
      Block 1: Timestamp - 1633285205.0, Data - Transaction 1, Hash - b11ee9d1ea32e0c37b8f5f0a9f7b0b81b1c5b8c0f1f2e5e0e1e9b1b0c0c1c1b0
      Block 2: Timestamp - 1633285210.0, Data - Transaction 2, Hash - c11ae9d1ea32e0c37b8f5f0a9f7b0b81b1c5b8c0f1f2e5e0e1e9b1b0c0c1c1b0
      """
      for block in blockchain:
          print(f"Block {block.index}: Timestamp - {block.timestamp}, Data - {block.data}, Hash - {block.hash}")
  
output:     
      for block in blockchain:
          print(f"Block {block.index}: Timestamp - {block.timestamp}, Data - {block.data}, Hash - {block.hash}")
  