(verifying_keys: Array, inputs: Array, proof: &Proof)
| 246 | /// @returns {boolean} True if the batch proof is valid, false otherwise |
| 247 | #[wasm_bindgen(js_name = "snarkVerifyBatch")] |
| 248 | pub fn snark_verify_batch(verifying_keys: Array, inputs: Array, proof: &Proof) -> Result<bool, String> { |
| 249 | if verifying_keys.length() != inputs.length() { |
| 250 | return Err(format!( |
| 251 | "Mismatch: {} verifying keys but {} input groups provided. # of input groups must match # of verifying keys.", |
| 252 | verifying_keys.length(), |
| 253 | inputs.length() |
| 254 | )); |
| 255 | } |
| 256 | |
| 257 | let mut vks_with_inputs = Vec::with_capacity(verifying_keys.length() as usize); |
| 258 | |
| 259 | for i in 0..verifying_keys.length() { |
| 260 | let vk_str = |
| 261 | verifying_keys.get(i).as_string().ok_or_else(|| format!("Expected verifying key string at index {i}"))?; |
| 262 | let vk_native = VerifyingKeyNative::from_str(&vk_str) |
| 263 | .map_err(|e| format!("Failed to parse verifying key at index {i}: {e}"))?; |
| 264 | |
| 265 | let instances_js = Array::try_from(inputs.get(i)) |
| 266 | .map_err(|_| format!("Expected array of instances for verifying key at index {i}"))?; |
| 267 | let mut instances = Vec::with_capacity(instances_js.length() as usize); |
| 268 | |
| 269 | for j in 0..instances_js.length() { |
| 270 | let instance_js = Array::try_from(instances_js.get(j)) |
| 271 | .map_err(|_| format!("Expected array of field element strings at indices ({i}, {j})"))?; |
| 272 | let fields = parse_field_inputs(&instance_js)?; |
| 273 | instances.push(fields); |
| 274 | } |
| 275 | |
| 276 | vks_with_inputs.push((vk_native, instances)); |
| 277 | } |
| 278 | |
| 279 | VerifyingKeyNative::verify_batch("snark_verify_batch", VarunaVersion::V2, vks_with_inputs, proof) |
| 280 | .map_or(Ok(false), |_| Ok(true)) |
| 281 | } |
| 282 | |
| 283 | /// Parse an Array of field element strings into a Vec of raw N::Field elements. |
| 284 | pub(crate) fn parse_field_inputs(inputs: &Array) -> Result<Vec<<CurrentNetwork as Environment>::Field>, String> { |
no test coverage detected