Protocol Documentation

Table of Contents

Top

node/node.proto

AttestBatchReply

FieldTypeLabelDescription
signaturebytes

AttestBatchRequest

FieldTypeLabelDescription
batch_headerBatchHeaderheader of the batch
blob_header_hashesbytesrepeatedthe header hashes of all blobs in the batch

BatchHeader

BatchHeader (see core/data.go#BatchHeader)

FieldTypeLabelDescription
batch_rootbytesThe root of the merkle tree with hashes of blob headers as leaves.
reference_block_numberuint32The Ethereum block number at which the batch is dispersed.

Blob

In EigenDA, the original blob to disperse is encoded as a polynomial via taking taking different point evaluations (i.e. erasure coding). These points are split into disjoint subsets which are assigned to different operator nodes in the EigenDA network. The data in this message is a subset of these points that are assigned to a single operator node.

FieldTypeLabelDescription
headerBlobHeaderWhich (original) blob this is for.
bundlesBundlerepeatedEach bundle contains all chunks for a single quorum of the blob. The number of bundles must be equal to the total number of quorums associated with the blob, and the ordering must be the same as BlobHeader.quorum_headers. Note: an operator may be in some but not all of the quorums; in that case the bundle corresponding to that quorum will be empty.

BlobHeader

FieldTypeLabelDescription
commitmentcommon.G1CommitmentThe KZG commitment to the polynomial representing the blob.
length_commitmentG2CommitmentThe KZG commitment to the polynomial representing the blob on G2, it is used for proving the degree of the polynomial
length_proofG2CommitmentThe low degree proof. It's the KZG commitment to the polynomial shifted to the largest SRS degree.
lengthuint32The length of the original blob in number of symbols (in the field where the polynomial is defined).
quorum_headersBlobQuorumInforepeatedThe params of the quorums that this blob participates in.
account_idstringThe ID of the user who is dispersing this blob to EigenDA.
reference_block_numberuint32The reference block number whose state is used to encode the blob

BlobQuorumInfo

See BlobQuorumParam as defined in api/proto/disperser/disperser.proto

FieldTypeLabelDescription
quorum_iduint32
adversary_thresholduint32
confirmation_thresholduint32
chunk_lengthuint32
ratelimituint32

Bundle

A Bundle is the collection of chunks associated with a single blob, for a single operator and a single quorum.

FieldTypeLabelDescription
chunksbytesrepeatedEach chunk corresponds to a collection of points on the polynomial. Each chunk has same number of points.
bundlebytesAll chunks of the bundle encoded in a byte array.

G2Commitment

FieldTypeLabelDescription
x_a0bytesThe A0 element of the X coordinate of G2 point.
x_a1bytesThe A1 element of the X coordinate of G2 point.
y_a0bytesThe A0 element of the Y coordinate of G2 point.
y_a1bytesThe A1 element of the Y coordinate of G2 point.

GetBlobHeaderReply

FieldTypeLabelDescription
blob_headerBlobHeaderThe header of the blob requested per GetBlobHeaderRequest.
proofMerkleProofMerkle proof that returned blob header belongs to the batch and is the batch's MerkleProof.index-th blob. This can be checked against the batch root on chain.

GetBlobHeaderRequest

See RetrieveChunksRequest for documentation of each parameter of GetBlobHeaderRequest.

FieldTypeLabelDescription
batch_header_hashbytes
blob_indexuint32
quorum_iduint32

MerkleProof

FieldTypeLabelDescription
hashesbytesrepeatedThe proof itself.
indexuint32Which index (the leaf of the Merkle tree) this proof is for.

NodeInfoReply

Node info reply

FieldTypeLabelDescription
semverstring
archstring
osstring
num_cpuuint32
mem_bytesuint64

NodeInfoRequest

Node info request

RetrieveChunksReply

FieldTypeLabelDescription
chunksbytesrepeatedAll chunks the Node is storing for the requested blob per RetrieveChunksRequest.
chunk_encoding_formatChunkEncodingFormatHow the above chunks are encoded.

RetrieveChunksRequest

FieldTypeLabelDescription
batch_header_hashbytesThe hash of the ReducedBatchHeader defined onchain, see: https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/interfaces/IEigenDAServiceManager.sol#L43 This identifies which batch to retrieve for.
blob_indexuint32Which blob in the batch to retrieve for (note: a batch is logically an ordered list of blobs).
quorum_iduint32Which quorum of the blob to retrieve for (note: a blob can have multiple quorums and the chunks for different quorums at a Node can be different). The ID must be in range [0, 254].

StoreBlobsReply

FieldTypeLabelDescription
signaturesgoogle.protobuf.BytesValuerepeatedThe operator's BLS sgnature signed on the blob header hashes. The ordering of the signatures must match the ordering of the blobs sent in the request, with empty signatures in the places for discarded blobs.

StoreBlobsRequest

FieldTypeLabelDescription
blobsBlobrepeatedBlobs to store
reference_block_numberuint32The reference block number whose state is used to encode the blobs

StoreChunksReply

FieldTypeLabelDescription
signaturebytesThe operator's BLS signature signed on the batch header hash.

StoreChunksRequest

FieldTypeLabelDescription
batch_headerBatchHeaderWhich batch this request is for.
blobsBlobrepeatedThe chunks for each blob in the batch to be stored in an EigenDA Node.

ChunkEncodingFormat

This describes how the chunks returned in RetrieveChunksReply are encoded. Used to facilitate the decoding of chunks.

NameNumberDescription
UNKNOWN0
GNARK1
GOB2

Dispersal

Method NameRequest TypeResponse TypeDescription
StoreChunksStoreChunksRequestStoreChunksReplyStoreChunks validates that the chunks match what the Node is supposed to receive ( different Nodes are responsible for different chunks, as EigenDA is horizontally sharded) and is correctly coded (e.g. each chunk must be a valid KZG multiproof) according to the EigenDA protocol. It also stores the chunks along with metadata for the protocol-defined length of custody. It will return a signature at the end to attest to the data in this request it has processed.
StoreBlobsStoreBlobsRequestStoreBlobsReplyStoreBlobs is similar to StoreChunks, but it stores the blobs using a different storage schema so that the stored blobs can later be aggregated by AttestBatch method to a bigger batch. StoreBlobs + AttestBatch will eventually replace and deprecate StoreChunks method. DEPRECATED: StoreBlobs method is not used
AttestBatchAttestBatchRequestAttestBatchReplyAttestBatch is used to aggregate the batches stored by StoreBlobs method to a bigger batch. It will return a signature at the end to attest to the aggregated batch. DEPRECATED: AttestBatch method is not used
NodeInfoNodeInfoRequestNodeInfoReplyRetrieve node info metadata

Retrieval

Method NameRequest TypeResponse TypeDescription
RetrieveChunksRetrieveChunksRequestRetrieveChunksReplyRetrieveChunks retrieves the chunks for a blob custodied at the Node.
GetBlobHeaderGetBlobHeaderRequestGetBlobHeaderReplyGetBlobHeader is similar to RetrieveChunks, this just returns the header of the blob.
NodeInfoNodeInfoRequestNodeInfoReplyRetrieve node info metadata

Scalar Value Types

.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)