code: func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) {
  	if len(hash) != 32 {
  		return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash))
  	}
  	if prv.Curve != btcec.S256() {
  		return nil, fmt.Errorf("private key curve is not secp256k1")
  	}
  	sig, err := btcec.SignCompact(btcec.S256(), (*btcec.PrivateKey)(prv), hash, false)
  	if err != nil {
  		return nil, err
  	}
  	// Convert to Ethereum signature format with 'recovery id' v at the end.
  	v := sig[0] - 27
  	copy(sig, sig[1:])
  	sig[64] = v
  	return sig, nil
  }
docs: // Sign calculates an ECDSA signature.
  //
  // This function is susceptible to chosen plaintext attacks that can leak
  // information about the private key that is used for signing. Callers must
  // be aware that the given hash cannot be chosen by an adversery. Common
  // solution is to hash any input before calculating the signature.
  //
  // The produced signature is in the [R || S || V] format where V is 0 or 1.