# Offchain Verification Endpoint
V1. Accept requests of the form:
```jsonld=
{
"vk": { ... },
"proof": { ... },
"inputs": [ "1", "2", ... ]
}
```
where `vk` and `proof` are in the **upa** format. In this way, groth16 with commits is supported and we have conversion functionality from snarkjs and gnark formats.
## Existing code for endpoint (`circuits` create in upa repo):
### `Service<_>`, `HTTPServer<>`
In `prover_daemon` crate. Already has a multi-threaded server impl.
### Verifier
`upa_circuits::batch_verifier::types::UniversalBatchVerifierInput`
```rust=
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct UniversalBatchVerifierInput<F = Fr>
where
F: EccPrimeField,
{
pub vk: VerificationKey,
pub proof: Proof,
pub inputs: PublicInputs<F>,
}
```
A json request to the verifier service can be `UniversalBatchVerifierInput` or `Vec<UniversalBatchVerifierInput>`.
`upacircuits::batch_verifier::universal::native`
```rust=
pub fn verify_universal_groth16_batch<B, I>(
batch: B,
max_num_public_inputs: usize,
) -> bool
where
B: IntoIterator<Item = I>,
I: Borrow<UniversalBatchVerifierInput>,
```
This handles a sequence of `UniversalBatchVerifierInput`s. If we make the endpoint accept a list of `UniversalBatchVerifierInput`s, we can use this function as-is and get batched verification for multi-proof requests.
# Client
- Initially:
```
upa remote-verify --endpoint <URL> --format <snarkjs,gnark> --vk <file> --proof <file>
```
- Later: could create a standalone typescript package which uses upa as a dependency and implements a dedicated CLI:
```
nebra-verify --endpoint <URL> --format <snarkjs,gnark> --vk <file> --proof <file>
```