code: func sha256Func(state Interface, caller crypto.Address, input []byte, gas *uint64,
  	logger *logging.Logger) (output []byte, err error) {
  	// Deduct gas
  	gasRequired := uint64((len(input)+31)/32)*GasSha256Word + GasSha256Base
  	if *gas < gasRequired {
  		return nil, errors.ErrorCodeInsufficientGas
  	} else {
  		*gas -= gasRequired
  	}
  	// Hash
  	hasher := sha256.New()
  	// CONTRACT: this does not err
  	hasher.Write(input)
  	return hasher.Sum(nil), nil
  }
docs: /* Removed due to C dependency
  func ecrecoverFunc(state State, caller crypto.Address, input []byte, gas *int64) (output []byte, err error) {
  	// Deduct gas
  	gasRequired := GasEcRecover
  	if *gas < gasRequired {
  		return nil, ErrInsufficientGas
  	} else {
  		*gas -= gasRequired
  	}
  	// Recover
  	hash := input[:32]
  	v := byte(input[32] - 27) // ignore input[33:64], v is small.
  	sig := append(input[64:], v)
  
  	recovered, err := secp256k1.RecoverPubkey(hash, sig)
  	if err != nil {
  		return nil, err
  OH NO STOCASTIC CAT CODING!!!!
  	}
  	hashed := sha3.Sha3(recovered[1:])
  	return LeftPadBytes(hashed, 32), nil
  }
  */