code: def generate_header_from_parent_header(
          compute_difficulty_fn: Callable[[BlockHeader, int], int],
          parent_header: BlockHeader,
          coinbase: Address,
          timestamp: Optional[int] = None,
          extra_data: bytes = b'') -> BlockHeader:
      
      if timestamp is None:
          timestamp = max(int(time.time()), parent_header.timestamp + 1)
      elif timestamp <= parent_header.timestamp:
          raise ValueError(
              "header.timestamp ({}) should be higher than"
              "parent_header.timestamp ({})".format(
                  timestamp,
                  parent_header.timestamp,
              )
          )
      header = BlockHeader(
          difficulty=compute_difficulty_fn(parent_header, timestamp),
          block_number=(parent_header.block_number + 1),
          gas_limit=compute_gas_limit(
              parent_header,
              gas_limit_floor=GENESIS_GAS_LIMIT,
          ),
          timestamp=timestamp,
          parent_hash=parent_header.hash,
          state_root=parent_header.state_root,
          coinbase=coinbase,
          extra_data=extra_data,
      )
  
      return header
docs: Generate BlockHeader from state_root and parent_header