pub(crate) fn load_groth16_proof_from_bytes(buffer: &[u8]) -> Result<Groth16Proof, Groth16Error> {
    if buffer.len() < GROTH16_PROOF_LENGTH {
        return Err(Groth16Error::GeneralError(Error::InvalidData));
    }

    let ar = uncompressed_bytes_to_g1_point(&buffer[..64])?;
    let bs = uncompressed_bytes_to_g2_point(&buffer[64..192])?;
    let krs = uncompressed_bytes_to_g1_point(&buffer[192..256])?;

    Ok(Groth16Proof { ar, bs, krs })
}
Load the Groth16 proof from the given byte slice.

The byte slice is represented as 2 uncompressed g1 points, and one uncompressed g2 point,
as outputted from Gnark.
crates/verifier/src/groth16/converter.rs