code: func Sender(signer Signer, tx *Transaction) (common.Address, error) {
  	if sc := tx.from.Load(); sc != nil {
  		sigCache := sc.(sigCache)
  		// If the signer used to derive from in a previous
  		// call is not the same as used current, invalidate
  		// the cache.
  		if sigCache.signer.Equal(signer) {
  			return sigCache.from, nil
  		}
  	}
  
  	addr, err := signer.Sender(tx)
  	if err != nil {
  		return common.Address{}, err
  	}
  	tx.from.Store(sigCache{signer: signer, from: addr})
  	return addr, nil
  }
docs: // Sender returns the address derived from the signature (V, R, S) using secp256k1
  // elliptic curve and an error if it failed deriving or upon an incorrect
  // signature.
  //
  // Sender may cache the address, allowing it to be used regardless of
  // signing method. The cache is invalidated if the cached signer does
  // not match the signer used in the current call.