> ## Documentation Index
> Fetch the complete documentation index at: https://voltaire.tevm.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Blob.verifyBatch

> Batch verify multiple blob proofs (more efficient)

<Card title="Try it Live" icon="play" href="https://playground.tevm.sh?example=primitives/blob.ts">
  Run Blob examples in the interactive playground
</Card>

<Tabs />

## Performance

Batch verification is significantly faster than individual verification:

```typescript theme={null}
import { Blob } from 'tevm';

const blobs = [blob1, blob2, blob3, blob4, blob5, blob6];
const commitments = blobs.map(b => b.toCommitment());
const proofs = blobs.map(b => b.toProof());

// Individual verification (slower)
console.time('individual');
const results = blobs.map((blob, i) =>
  Blob.verify(blob, commitments[i], proofs[i])
);
const allValid1 = results.every(r => r);
console.timeEnd('individual'); // ~60ms

// Batch verification (faster)
console.time('batch');
const allValid2 = Blob.verifyBatch(blobs, commitments, proofs);
console.timeEnd('batch'); // ~20ms

console.log(allValid1 === allValid2); // true
```

## Finding Invalid Blobs

If batch verification fails, find which blob is invalid:

```typescript theme={null}
import { Blob } from 'tevm';

const blobs = [blob1, blob2, blob3];
const commitments = [c1, c2, c3];
const proofs = [p1, p2, p3];

// Batch verify
const allValid = Blob.verifyBatch(blobs, commitments, proofs);

if (!allValid) {
  console.error('Batch verification failed');

  // Find invalid blob(s)
  const invalid: number[] = [];
  for (let i = 0; i < blobs.length; i++) {
    const valid = Blob.verify(blobs[i], commitments[i], proofs[i]);
    if (!valid) {
      invalid.push(i);
    }
  }

  console.error(`Invalid blobs: ${invalid.join(', ')}`);
}
```

## Array Length Validation

```typescript theme={null}
import { Blob } from 'tevm';

const blobs = [blob1, blob2];
const commitments = [c1, c2, c3]; // Wrong length
const proofs = [p1, p2];

try {
  Blob.verifyBatch(blobs, commitments, proofs);
} catch (e) {
  console.error(e); // "Array lengths must match"
}
```

## Empty Arrays

```typescript theme={null}
import { Blob } from 'tevm';

// Empty arrays (valid - vacuous truth)
const result = Blob.verifyBatch([], [], []);
console.log(result); // true
```

## Use in Validators

```typescript theme={null}
import { Blob } from 'tevm';

class BlobTransactionValidator {
  validate(tx: BlobTransaction): boolean {
    // Check array lengths
    if (
      tx.blobs.length !== tx.commitments.length ||
      tx.blobs.length !== tx.proofs.length ||
      tx.blobs.length !== tx.blobVersionedHashes.length
    ) {
      return false;
    }

    // Batch verify proofs
    if (!Blob.verifyBatch(tx.blobs, tx.commitments, tx.proofs)) {
      return false;
    }

    // Verify versioned hashes
    for (let i = 0; i < tx.blobs.length; i++) {
      const computed = Blob.Commitment.toVersionedHash(tx.commitments[i]);
      if (!Blob.equals(computed, tx.blobVersionedHashes[i])) {
        return false;
      }
    }

    return true;
  }
}
```

## See Also

* [verify](./verify) - Verify single blob
* [toCommitment](./toCommitment) - Generate commitment
* [toProof](./toProof) - Generate proof
* [KZG](/primitives/blob/kzg) - KZG verification details
