<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def from_parent(cls, parent: 'BlockHeader', gas_limit: int, difficulty: int, timestamp: int, coinbase: Address=ZERO_ADDRESS, nonce: bytes=None, extra_data: bytes=None, transaction_root: bytes=None, receipt_root: bytes=None) -> 'BlockHeader': """ Initialize a new block header with the `parent` header as the block's parent hash. """

        header_kwargs = {
            'parent_hash': parent.hash,
            'coinbase': coinbase,
            'state_root': parent.state_root,
            'gas_limit': gas_limit,
            'difficulty': difficulty,
            'block_number': parent.block_number + 1,
            'timestamp': timestamp,
        }
        if nonce is not None:
            header_kwargs['nonce'] = nonce
        if extra_data is not None:
            header_kwargs['extra_data'] = extra_data
        if transaction_root is not None:
            header_kwargs['transaction_root'] = transaction_root
        if receipt_root is not None:
            header_kwargs['receipt_root'] = receipt_root

        header = cls(**header_kwargs)
        return header