code: func (c *Clique) verifySeal(chain consensus.ChainReader, header *types.Header, parents []*types.Header) error {
  	// Verifying the genesis block is not supported
  	number := header.Number.Uint64()
  	if number == 0 {
  		return errUnknownBlock
  	}
  	// Retrieve the snapshot needed to verify this header and cache it
  	snap, err := c.snapshot(chain, number-1, header.ParentHash, parents)
  	if err != nil {
  		return err
  	}
  
  	// Resolve the authorization key and check against signers
  	signer, err := ecrecover(header, c.signatures)
  	if err != nil {
  		return err
  	}
  	if _, ok := snap.Signers[signer]; !ok {
  		return errUnauthorizedSigner
  	}
  	for seen, recent := range snap.Recents {
  		if recent == signer {
  			// Signer is among recents, only fail if the current block doesn't shift it out
  			if limit := uint64(len(snap.Signers)/2 + 1); seen > number-limit {
  				return errRecentlySigned
  			}
  		}
  	}
  	// Ensure that the difficulty corresponds to the turn-ness of the signer
  	if !c.fakeDiff {
  		inturn := snap.inturn(header.Number.Uint64(), signer)
  		if inturn && header.Difficulty.Cmp(diffInTurn) != 0 {
  			return errWrongDifficulty
  		}
  		if !inturn && header.Difficulty.Cmp(diffNoTurn) != 0 {
  			return errWrongDifficulty
  		}
  	}
  	return nil
  }
docs: // verifySeal checks whether the signature contained in the header satisfies the
  // consensus protocol requirements. The method accepts an optional list of parent
  // headers that aren't yet part of the local blockchain to generate the snapshots
  // from.