EigenDA Integration (Data Availability)
Data Availability is not data storage. It is a guarantee that data was published and is available for download at a specific moment in time. For rollup this is a fundamental property: fraud proofs or validity proofs are meaningless if someone cannot get transaction data to verify state.
Ethereum Danksharding (EIP-4844) solved this problem for Ethereum-based rollups through blobs. EigenDA is an alternative, built on EigenLayer restaking, that offers significantly higher throughput and lower cost at the expense of a different trust model.
How EigenDA Works: Technical Details
System Architecture
EigenDA consists of three components:
Operators are node operators who have restaked ETH via EigenLayer and provide storage and bandwidth. They accept data chunks, store them, and respond to availability queries.
Disperser is a service (currently centralized at EigenLabs, roadmap for decentralization) that accepts data from rollup, divides it into chunks via erasure coding, distributes it across operators, and collects signatures.
On-chain Verifier is a smart contract on Ethereum that verifies a quorum of operators signed an attestation about receiving data.
Erasure Coding and Data Availability Sampling
EigenDA uses Reed-Solomon erasure coding: data of size D is encoded into M chunks (M > D), where any D of M chunks are sufficient to recover the original. Typical parameters: if 50% of operators are unavailable—data is still recoverable.
Data Availability Sampling (DAS) is a technique where a light client can verify data availability by downloading only a small random subset of chunks. Mathematically: if you download 30 random chunks and all are available, with probability >99.9% all data is available (with 50% erasure coding).
Blob (rollup data)
↓ Reed-Solomon encoding
Chunks [c0, c1, c2, ..., cn]
↓ KZG polynomial commitments
Commitment (short proof of data)
↓ Dispersal to operators
Operators store chunks + respond to sampling queries
BlobHeader and Certificate
When publishing data to EigenDA the disperser returns BlobHeader and BlobCertificate:
type BlobHeader struct {
Commitment G1Point // KZG commitment to data
DataLength uint32 // size in symbols
BlobQuorumParams []BlobQuorumParam
}
type BlobQuorumParam struct {
QuorumNumber uint8
AdversaryThresholdPercentage uint8 // max malicious operators
ConfirmationThresholdPercentage uint8 // min confirmations
ChunkLength uint32
}
type BlobCertificate struct {
BlobHeader BlobHeader
BlobVerificationProof BlobVerificationProof
}
Certificate is stored by rollup in calldata or blob transaction on Ethereum—this allows the verifier to check that data was actually published in EigenDA.
Rollup Integration with EigenDA
Dispersal: Data Publication
Rollup sequencer (or batch poster) sends data via EigenDA Disperser API:
package main
import (
"context"
"github.com/Layr-Labs/eigenda/api/grpc/disperser"
"google.golang.org/grpc"
)
func disperseBlob(data []byte) (*disperser.BlobInfo, error) {
conn, err := grpc.Dial("disperser-holesky.eigenda.xyz:443", grpc.WithTransportCredentials(...))
if err != nil {
return nil, err
}
defer conn.Close()
client := disperser.NewDisperserClient(conn)
reply, err := client.DisperseBlob(context.Background(), &disperser.DisperseBlobRequest{
Data: data,
CustomQuorumNumbers: []uint32{}, // use default quorum
AccountId: accountId, // for rate limiting
})
if err != nil {
return nil, err
}
// Poll until finalization
for {
statusReply, _ := client.GetBlobStatus(context.Background(), &disperser.BlobStatusRequest{
RequestId: reply.RequestId,
})
if statusReply.Status == disperser.BlobStatus_CONFIRMED {
return statusReply.Info, nil
}
time.Sleep(2 * time.Second)
}
}
After confirmation—serialize BlobInfo (including BlobHeader and BlobVerificationProof) to Ethereum in calldata instead of or in addition to the data itself.
On-chain Verification
For rollups with fraud proofs you need to verify on-chain that data was actually available:
interface IEigenDAServiceManager {
function confirmBatch(
BatchHeader calldata batchHeader,
OperatorStakesAndSignature calldata operatorStakesAndSignature
) external;
function verifyBlob(
BlobHeader calldata blobHeader,
BlobVerificationProof calldata blobVerificationProof
) external view;
}
contract RollupWithEigenDA {
IEigenDAServiceManager public eigenDA;
function submitBatch(
bytes calldata batchData,
BlobHeader calldata eigenDABlobHeader,
BlobVerificationProof calldata eigenDAProof
) external {
// Verify that data was actually in EigenDA
eigenDA.verifyBlob(eigenDABlobHeader, eigenDAProof);
// Continue with usual rollup logic
bytes32 batchRoot = keccak256(batchData);
_submitBatchRoot(batchRoot);
}
}
OP Stack Integration via EigenDA Proxy
For OP Stack-based rollups there is a ready EigenDA Proxy sidecar service that implements the OP Stack alt-DA interface and translates requests to EigenDA:
# docker-compose.yml for EigenDA Proxy
eigenda-proxy:
image: ghcr.io/layr-labs/eigenda-proxy:latest
environment:
- EIGENDA_PROXY_ADDR=0.0.0.0
- EIGENDA_PROXY_PORT=4242
- EIGENDA_PROXY_EIGENDA_DISPERSER_RPC=disperser-holesky.eigenda.xyz:443
- EIGENDA_PROXY_G1_PATH=/data/g1.point
- EIGENDA_PROXY_G2_POWER_OF_TAU_PATH=/data/g2.point.powerOf2
volumes:
- ./data:/data
OP Stack batch poster is configured with --altda.da-service=true and points to the proxy. Everything else is transparent—the proxy handles dispersal, polling, certificate saving itself.
Similar pattern for Arbitrum Orbit via AnyTrust: EigenDA can act as a Data Availability Committee (DAC) alternative.
Comparison with Alternatives
| Parameter | Ethereum blobs (EIP-4844) | EigenDA | Celestia | Avail |
|---|---|---|---|---|
| Throughput | ~0.75 MB/block (6 blobs) | 10+ MB/s (scales) | ~1-2 MB/block | ~2 MB/block |
| Cost | Depends on blob market | Significantly cheaper | Cheaper than ETH blobs | Cheaper than ETH blobs |
| Trust model | Ethereum validator set | EigenLayer restakers | Celestia validators | Avail validators |
| Latency | ~12 sec (1 block) | ~10-12 sec | ~15 sec | ~20 sec |
| Maturity | Production | Mainnet (2024) | Production | Beta |
| EVM integration | Native | Via proxy/adapter | Via adapters | Via adapters |
EigenDA wins on throughput and cost for high-load rollups. Tradeoff is an additional dependency on EigenLayer and partial centralization of the disperser so far.
Operational Considerations
Latency Characteristics
Dispersal in EigenDA takes 10–15 seconds to confirmation (depends on quorum and network conditions). This needs to be accounted for in sequencer architecture: batch posting can be asynchronous.
Retry and Fallback Logic
Disperser can become unavailable. Fallback strategy is needed:
func postBatchWithFallback(batchData []byte) error {
// Try EigenDA
blobInfo, err := disperseToEigenDA(batchData)
if err == nil {
return postToEthereumWithEigenDARef(blobInfo)
}
log.Warn("EigenDA dispersal failed, falling back to calldata", "err", err)
// Fallback: post data directly to Ethereum calldata
// More expensive, but guarantees liveness
return postToEthereumCalldata(batchData)
}
This is the pattern from OP Stack AltDA spec: if the DA layer is unavailable—rollup can fall back to Ethereum calldata, preserving liveness at the cost of higher gas.
Monitoring
- Dispersal latency: alert if >30 seconds
- Quorum thresholds: monitor percentage of responding operators
- Certificate validity: all certificates in Ethereum should pass on-chain verification
Integration Timeline
OP Stack rollup integration with EigenDA via proxy: 2–3 weeks (infrastructure setup, testing on Holesky, monitoring).
Custom rollup with native EigenDA integration: 4–8 weeks (dispersal logic implementation, on-chain verifier, fallback mechanism, contract audit).
Development of custom DA layer based on EigenDA: 3–4 months (custom quorum parameters, custom ServiceManager contract, integration into EigenLayer).
EigenDA integration assumes working with testnet (Holesky) for at least 2–3 weeks before mainnet deployment—too many moving parts for immediate production.







