code: func (s *PrivateAccountAPI) Sign(ctx context.Context, data hexutil.Bytes, addr common.Address, passwd string) (hexutil.Bytes, error) {
  	// Look up the wallet containing the requested signer
  	account := accounts.Account{Address: addr}
  
  	wallet, err := s.b.AccountManager().Find(account)
  	if err != nil {
  		return nil, err
  	}
  	// Assemble sign the data with the wallet
  	signature, err := wallet.SignTextWithPassphrase(account, passwd, data)
  	if err != nil {
  		log.Warn("Failed data sign attempt", "address", addr, "err", err)
  		return nil, err
  	}
  	signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper
  	return signature, nil
  }
docs: // Sign calculates an Ethereum ECDSA signature for:
  // keccack256("\x19Ethereum Signed Message:\n" + len(message) + message))
  //
  // Note, the produced signature conforms to the secp256k1 curve R, S and V values,
  // where the V value will be 27 or 28 for legacy reasons.
  //
  // The key used to calculate the signature is decrypted with the given password.
  //
  // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign