pub fn verify_gnark_proof(
        proof: &[u8],
        public_inputs: &[[u8; 32]],
        groth16_vk: &[u8],
    ) -> Result<(), Groth16Error> {
        let proof = load_groth16_proof_from_bytes(proof)?;
        let groth16_vk = load_groth16_verifying_key_from_bytes(groth16_vk)?;

        let public_inputs =
            public_inputs.iter().map(|input| Fr::from_slice(input).unwrap()).collect::<Vec<_>>();
        verify_groth16_algebraic(&groth16_vk, &proof, &public_inputs)
    }
Verifies a Gnark Groth16 proof using raw byte inputs.

WARNING: if you're verifying an SP1 proof, you should use [`verify`] instead.
This is a lower-level verification method that works directly with raw bytes rather than
the SP1 SDK's data structures.

# Arguments

* `proof` - The raw Groth16 proof bytes (without the 4-byte vkey hash prefix)
* `public_inputs` - The public inputs to the circuit
* `groth16_vk` - The Groth16 verifying key bytes

# Returns

A [`Result`] containing unit `()` if the proof is valid,
or a [`Groth16Error`] if verification fails.

# Note

This method expects the raw proof bytes without the 4-byte vkey hash prefix that
[`verify`] checks. If you have a complete proof with the prefix, use [`verify`] instead.
crates/verifier/src/groth16/mod.rs