> ## 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.joinData

> Reconstruct data from multiple blobs

<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 />

## How It Works

Extracts data from each blob and concatenates:

```
Blob 1: [length_1][chunk_1][padding] → Extract chunk_1
Blob 2: [length_2][chunk_2][padding] → Extract chunk_2
Blob 3: [length_3][chunk_3][padding] → Extract chunk_3

Result: chunk_1 + chunk_2 + chunk_3
```

### Manual Join

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

const blobs = Blob.splitData(data);

// Manual join (equivalent to joinData)
const chunks = blobs.map(blob => Blob.toData(blob));
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);

const result = new Uint8Array(totalLength);
let offset = 0;
for (const chunk of chunks) {
  result.set(chunk, offset);
  offset += chunk.length;
}

// Verify equivalence
const auto = Blob.joinData(blobs);
console.log(Blob.equals(result, auto)); // true
```

## Round-Trip Verification

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

function verifyRoundTrip(data: Uint8Array) {
  // Split
  const blobs = Blob.splitData(data);

  // Join
  const reconstructed = Blob.joinData(blobs);

  // Verify
  if (reconstructed.length !== data.length) {
    throw new Error('Length mismatch');
  }

  if (!Blob.equals(reconstructed, data)) {
    throw new Error('Data mismatch');
  }

  console.log('Round-trip verified');
}

// Test with various sizes
verifyRoundTrip(new Uint8Array(1000));
verifyRoundTrip(new Uint8Array(100_000));
verifyRoundTrip(new Uint8Array(300_000));
```

## Error Handling

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

// Invalid blob size
try {
  const invalid = new Uint8Array(1000);
  Blob.joinData([invalid as any]);
} catch (e) {
  console.error(e); // "Invalid blob size: 1000"
}

// Corrupted length prefix
const blobs = Blob.splitData(data);
blobs[0][0] = 0xff; // Corrupt length prefix
try {
  Blob.joinData(blobs);
} catch (e) {
  console.error(e); // "Invalid length prefix"
}
```

## Empty Array

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

// Empty array returns empty data
const result = Blob.joinData([]);
console.log(result.length); // 0
console.log(result instanceof Uint8Array); // true
```

## See Also

* [splitData](./splitData) - Split data into blobs
* [toData](./toData) - Extract single blob data
* [fromData](./fromData) - Create single blob from data
