From f76949b96853275fe291d290747401f6b01b3949 Mon Sep 17 00:00:00 2001 From: 0g-peterzhb <158457852+0g-peterzhb@users.noreply.github.com> Date: Sun, 24 Mar 2024 20:58:27 +0800 Subject: [PATCH] @peter/doc (#14) * add documentation --- .bookignore | 2 + .gitbook/assets/zg-da-architecture.png | Bin 0 -> 163234 bytes .gitbook/assets/zg-da-batcher.png | Bin 0 -> 229456 bytes .../assets/zg-da-encoding-groups.png | Bin .github/pull_request_template.md | 12 - README.md | 63 +++- SUMMARY.md | 21 ++ api/docs/README.md | 4 - api/docs/disperser.md | 321 ------------------ api/docs/retriever.md | 106 ------ contributing.md | 12 + docs/README.md | 22 ++ docs/api/README.md | 6 + docs/api/disperser.md | 125 +++++++ docs/api/retriever.md | 57 ++++ docs/architecture/README.md | 33 ++ docs/architecture/batcher.md | 32 ++ docs/architecture/disperser.md | 36 ++ docs/architecture/retriever.md | 20 ++ docs/contributing.md | 27 -- docs/data-model.md | 150 ++++++++ docs/design/assignment.md | 127 ------- docs/design/encoding.md | 63 ---- docs/glossary.md | 15 + docs/introduction.md | 104 ++++++ docs/pkg/README.md | 6 + docs/pkg/encoding.md | 5 + docs/pkg/kzg.md | 54 +++ docs/readme.md | 22 ++ docs/security/README.md | 22 ++ .../storage => security}/encoding.md | 27 +- docs/security/kzg.md | 63 ++++ docs/spec/architecture.md | 0 docs/spec/components/indexer.md | 275 --------------- docs/spec/components/node-encoding.md | 16 - docs/spec/components/node.md | 46 --- docs/spec/data-model.md | 130 ------- docs/spec/definitions.md | 22 -- docs/spec/flows/dispersal.md | 8 - docs/spec/integrations/disperser.md | 48 --- docs/spec/integrations/rollups.md | 63 ---- docs/spec/integrations/types.md | 23 -- docs/spec/introduction.md | 30 -- docs/spec/overview.md | 18 - .../attestation/attestation.md | 56 --- docs/spec/protocol-modules/overview.md | 23 -- docs/spec/protocol-modules/payment/payment.md | 16 - .../protocol-modules/retrieval/retrieval.md | 6 - .../protocol-modules/storage/assignment.md | 100 ------ .../spec/protocol-modules/storage/overview.md | 39 --- docs/spec/throughput.md | 45 --- docs/spec/upgrading.md | 2 - go.mod | 1 - go.sum | 2 - inabox/AnvilStateGen_README.md | 10 +- pkg/encoding/README.md | 8 - pkg/kzg/README.md | 57 ---- 57 files changed, 880 insertions(+), 1721 deletions(-) create mode 100644 .bookignore create mode 100644 .gitbook/assets/zg-da-architecture.png create mode 100644 .gitbook/assets/zg-da-batcher.png rename docs/assets/encoding-groups.png => .gitbook/assets/zg-da-encoding-groups.png (100%) delete mode 100644 .github/pull_request_template.md create mode 100644 SUMMARY.md delete mode 100644 api/docs/README.md delete mode 100644 api/docs/disperser.md delete mode 100644 api/docs/retriever.md create mode 100644 contributing.md create mode 100644 docs/README.md create mode 100644 docs/api/README.md create mode 100644 docs/api/disperser.md create mode 100644 docs/api/retriever.md create mode 100644 docs/architecture/README.md create mode 100644 docs/architecture/batcher.md create mode 100644 docs/architecture/disperser.md create mode 100644 docs/architecture/retriever.md delete mode 100644 docs/contributing.md create mode 100644 docs/data-model.md delete mode 100644 docs/design/assignment.md delete mode 100644 docs/design/encoding.md create mode 100644 docs/glossary.md create mode 100644 docs/introduction.md create mode 100644 docs/pkg/README.md create mode 100644 docs/pkg/encoding.md create mode 100644 docs/pkg/kzg.md create mode 100644 docs/readme.md create mode 100644 docs/security/README.md rename docs/{spec/protocol-modules/storage => security}/encoding.md (70%) create mode 100644 docs/security/kzg.md delete mode 100644 docs/spec/architecture.md delete mode 100644 docs/spec/components/indexer.md delete mode 100644 docs/spec/components/node-encoding.md delete mode 100644 docs/spec/components/node.md delete mode 100644 docs/spec/data-model.md delete mode 100644 docs/spec/definitions.md delete mode 100644 docs/spec/flows/dispersal.md delete mode 100644 docs/spec/integrations/disperser.md delete mode 100644 docs/spec/integrations/rollups.md delete mode 100644 docs/spec/integrations/types.md delete mode 100644 docs/spec/introduction.md delete mode 100644 docs/spec/overview.md delete mode 100644 docs/spec/protocol-modules/attestation/attestation.md delete mode 100644 docs/spec/protocol-modules/overview.md delete mode 100644 docs/spec/protocol-modules/payment/payment.md delete mode 100644 docs/spec/protocol-modules/retrieval/retrieval.md delete mode 100644 docs/spec/protocol-modules/storage/assignment.md delete mode 100644 docs/spec/protocol-modules/storage/overview.md delete mode 100644 docs/spec/throughput.md delete mode 100644 docs/spec/upgrading.md delete mode 100644 pkg/encoding/README.md delete mode 100644 pkg/kzg/README.md diff --git a/.bookignore b/.bookignore new file mode 100644 index 0000000..864ba1d --- /dev/null +++ b/.bookignore @@ -0,0 +1,2 @@ +inabox/* + diff --git a/.gitbook/assets/zg-da-architecture.png b/.gitbook/assets/zg-da-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..888b8ad4c10e05551c66d901b8d8e032fd813255 GIT binary patch literal 163234 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 T%ez|V6#PNTC`%Vg8higg7bGzV literal 0 HcmV?d00001 diff --git a/.gitbook/assets/zg-da-batcher.png b/.gitbook/assets/zg-da-batcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa5336c83b8439db20ce15aab5984e1a2e52746 GIT binary patch literal 229456 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𝔮l&8Lu{`Fi}^Ezd9sl6a|~7;pzBDNp{%g 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 literal 0 HcmV?d00001 diff --git a/docs/assets/encoding-groups.png b/.gitbook/assets/zg-da-encoding-groups.png similarity index 100% rename from docs/assets/encoding-groups.png rename to .gitbook/assets/zg-da-encoding-groups.png diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 53a5c8b..0000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,12 +0,0 @@ -## Why are these changes needed? - - - -## Checks - -- [ ] I've made sure the lint is passing in this PR. -- [ ] I've made sure the tests are passing. Note that there might be a few flaky tests, in that case, please comment that they are not relevant. -- Testing Strategy - - [ ] Unit tests - - [ ] Integration tests - - [ ] This PR is not tested :( diff --git a/README.md b/README.md index 92f8481..a546d9c 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,74 @@ -# Deployment +# 0GDA -## Prerequisites +## Overview -- For local test environment, [aws-cli](https://aws.amazon.com/cn/cli/) is required. +0GDA is a decentralized data availability (DA) service with deep consideration in security, scalability and decentralization. It is also the first DA solution with a built-in data storage layer. Users interact with ZeroGDA to submit and store their data into [0G Storage](https://github.com/0glabs/0g-storage-client) for later retrieval. + +To dive deep into the technical details, continue reading [0GDA protocol spec](docs/). + +## Integration + +Check out [this example](https://github.com/0glabs/0g-da-example-rust) for how to integrate the 0GDA into your own applications. + +For detailed public APIs, visit [gRPC API](docs/api/) section. + +## Deployment + +* For local test environment, [aws-cli](https://aws.amazon.com/cli/) is required. +* [Local Stack setup](./#localstack) +* [Disperser](./#disperser) +* [Retriever](./#retriever) + +### LocalStack -## LocalStack Create LocalStack(local aws simulation) docker image and start a docker instance: + ```bash cd inabox make deploy-localstack ``` -## Disperser -Build binaries: +### Disperser + +1. Build binaries: + ``` cd disperser - make build ``` -Run encoder: + +2. Run encoder: + ``` make run_encoder ``` -Set the cli arguments of run_batcher in Makefile to proper values, then run batcher and server: + +3. Set the cli arguments of run\_batcher in Makefile to proper values. Full list of available configuration parameters are showing below. + +4. Then run batcher and the main disperser server: + ``` make run_batcher make run_server -``` \ No newline at end of file +``` + +### Retriever + +1. Build binaries: + +``` +cd retriever +make build +``` + +2. Run the main retriever server: + +``` +make run +``` + +## Contributing + +To make contributions to the project, please follow the guidelines [here](contributing.md). diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000..38db3ee --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,21 @@ +# Table of contents + +* [0GDA](README.md) +* [0G DA Spec](docs/README.md) + * [Introduction]() + * [Architecture]() + * [Disperser]() + * [Batcher]() + * [Retriever]() + * [Security Guarantee]() + * [Encoding]() + * [KZG Encoder Backend]() + * [Data Model]() + * [gRPC API]() + * [Disperser API]() + * [Retriever API]() + * [Dependent Package]() + * [Encoding]() + * [KZG and FFT utils]() + * [Glossary]() +* [Contributing](contributing.md) diff --git a/api/docs/README.md b/api/docs/README.md deleted file mode 100644 index 023c062..0000000 --- a/api/docs/README.md +++ /dev/null @@ -1,4 +0,0 @@ -This folder contains the API documentation for the gRPC services included in the ZGDA platform. Each markdown file contains the protobuf definitions for each respective service including: -- Disperser: the hosted service and primary point of interaction for Rollup users. -- Retriever: a service that users can run on their own infrastructure, which exposes a gRPC endpoint for retrieval of blobs from ZGDA nodes. - diff --git a/api/docs/disperser.md b/api/docs/disperser.md deleted file mode 100644 index dc8a547..0000000 --- a/api/docs/disperser.md +++ /dev/null @@ -1,321 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [disperser.proto](#disperser-proto) - - [BatchHeader](#disperser-BatchHeader) - - [BatchMetadata](#disperser-BatchMetadata) - - [BlobHeader](#disperser-BlobHeader) - - [BlobInfo](#disperser-BlobInfo) - - [BlobQuorumParam](#disperser-BlobQuorumParam) - - [BlobStatusReply](#disperser-BlobStatusReply) - - [BlobStatusRequest](#disperser-BlobStatusRequest) - - [BlobVerificationProof](#disperser-BlobVerificationProof) - - [DisperseBlobReply](#disperser-DisperseBlobReply) - - [DisperseBlobRequest](#disperser-DisperseBlobRequest) - - [RetrieveBlobReply](#disperser-RetrieveBlobReply) - - [RetrieveBlobRequest](#disperser-RetrieveBlobRequest) - - [SecurityParams](#disperser-SecurityParams) - - - [BlobStatus](#disperser-BlobStatus) - - - [Disperser](#disperser-Disperser) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## disperser.proto - - - - - -### BatchHeader - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| batch_root | [bytes](#bytes) | | The root of the merkle tree with the hashes of blob headers as leaves. | -| quorum_numbers | [bytes](#bytes) | | All quorums associated with blobs in this batch. | -| quorum_signed_percentages | [bytes](#bytes) | | The percentage of stake that has signed for this batch. The quorum_signed_percentages[i] is percentage for the quorum_numbers[i]. | -| reference_block_number | [uint32](#uint32) | | The Ethereum block number at which the batch was created. The Disperser will encode and disperse the blobs based on the onchain info (e.g. operator stakes) at this block number. | - - - - - - - - -### BatchMetadata - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| batch_header | [BatchHeader](#disperser-BatchHeader) | | | -| signatory_record_hash | [bytes](#bytes) | | The hash of all public keys of the operators that did not sign the batch. | -| fee | [bytes](#bytes) | | The gas fee of confirming this batch. It's the bytes representation of a big.Int value. | -| confirmation_block_number | [uint32](#uint32) | | The Ethereum block number at which the batch is confirmed onchain. | -| batch_header_hash | [bytes](#bytes) | | This is the hash of the ReducedBatchHeader defined onchain, see: https://github.com/0glabs/0g-data-avail/blob/master/contracts/src/interfaces/IZGDAServiceManager.sol#L43 The is the message that the operators will sign their signatures on. | - - - - - - - - -### BlobHeader - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| commitment | [bytes](#bytes) | | KZG commitment to the blob. | -| data_length | [uint32](#uint32) | | The length of the blob in symbols (each symbol is 31 bytes). | -| blob_quorum_params | [BlobQuorumParam](#disperser-BlobQuorumParam) | repeated | The params of the quorums that this blob participates in. | - - - - - - - - -### BlobInfo -BlobInfo contains information needed to confirm the blob against the ZGDA contracts - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| blob_header | [BlobHeader](#disperser-BlobHeader) | | | -| blob_verification_proof | [BlobVerificationProof](#disperser-BlobVerificationProof) | | | - - - - - - - - -### BlobQuorumParam - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| quorum_number | [uint32](#uint32) | | The ID of the quorum. | -| adversary_threshold_percentage | [uint32](#uint32) | | Same as SecurityParams.adversary_threshold. | -| quorum_threshold_percentage | [uint32](#uint32) | | Same as SecurityParams.quorum_threshold. | -| quantization_param | [uint32](#uint32) | | This determines the nominal number of chunks for the blob, which is nominal_num_chunks = quantization_param * num_operators. A chunk is the smallest unit that's distributed to DA Nodes, corresponding to a set of evaluations of the polynomial (representing the blob) and a KZG multiproof. See more details in data model of ZGDA: https://github.com/0glabs/0g-data-avail/blob/master/docs/spec/data-model.md | -| encoded_length | [uint64](#uint64) | | The length of the blob after encoding (in number of symbols). | - - - - - - - - -### BlobStatusReply - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| status | [BlobStatus](#disperser-BlobStatus) | | The status of the blob. | -| info | [BlobInfo](#disperser-BlobInfo) | | The blob info needed for clients to confirm the blob against the ZGDA contracts. | - - - - - - - - -### BlobStatusRequest -BlobStatusRequest is used to query the status of a blob. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| request_id | [bytes](#bytes) | | | - - - - - - - - -### BlobVerificationProof - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| batch_id | [uint32](#uint32) | | batch_id is an incremental ID assigned to a batch by ZGDAServiceManager | -| blob_index | [uint32](#uint32) | | The index of the blob in the batch (which is logically an ordered list of blobs). | -| batch_metadata | [BatchMetadata](#disperser-BatchMetadata) | | | -| inclusion_proof | [bytes](#bytes) | | inclusion_proof is a merkle proof for a blob header's inclusion in a batch | -| quorum_indexes | [bytes](#bytes) | | indexes of quorums in BatchHeader.quorum_numbers that match the quorums in BlobHeader.blob_quorum_params Ex. BlobHeader.blob_quorum_params = [ { quorum_number = 0, ... }, { quorum_number = 3, ... }, { quorum_number = 5, ... }, ] BatchHeader.quorum_numbers = [0, 5, 3] => 0x000503 Then, quorum_indexes = [0, 2, 1] => 0x000201 | - - - - - - - - -### DisperseBlobReply - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| result | [BlobStatus](#disperser-BlobStatus) | | The status of the blob associated with the request_id. | -| request_id | [bytes](#bytes) | | The request ID generated by the disperser. Once a request is accepted (although not processed), a unique request ID will be generated. Two different DisperseBlobRequests (determined by the hash of the DisperseBlobRequest) will have different IDs, and the same DisperseBlobRequest sent repeatedly at different times will also have different IDs. The client should use this ID to query the processing status of the request (via the GetBlobStatus API). | - - - - - - - - -### DisperseBlobRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| data | [bytes](#bytes) | | The data to be dispersed. The size of data must be <= 512KiB. | -| security_params | [SecurityParams](#disperser-SecurityParams) | repeated | Security parameters allowing clients to customize the safety (via adversary threshold) and liveness (via quorum threshold). Clients can define one SecurityParams per quorum, and specify multiple quorums. The disperser will ensure that the encoded blobs for each quorum are all processed within the same batch. | - - - - - - - - -### RetrieveBlobReply -RetrieveBlobReply contains the retrieved blob data - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| data | [bytes](#bytes) | | | - - - - - - - - -### RetrieveBlobRequest -RetrieveBlobRequest contains parameters to retrieve the blob. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| batch_header_hash | [bytes](#bytes) | | | -| blob_index | [uint32](#uint32) | | | - - - - - - - - -### SecurityParams -SecurityParams contains the security parameters for a given quorum. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| quorum_id | [uint32](#uint32) | | The ID of the quorum. The quorum must be already registered on EigenLayer. The ID must be in range [0, 255]. | -| adversary_threshold | [uint32](#uint32) | | The max percentage of stake within the quorum that can be held by or delegated to adversarial operators. - -Clients use this to customize the trust assumption (safety). - -Requires: 1 <= adversary_threshold < 100 | -| quorum_threshold | [uint32](#uint32) | | The min percentage of stake that must attest in order to consider the dispersal is successful. - -Clients use this to customize liveness requirement. The higher this number, the more operators may need to be up for attesting the blob, so the chance the dispersal request to fail may be higher (liveness for dispersal). - -Requires: 1 <= quorum_threshld <= 100 quorum_threshld > adversary_threshold. - -Note: The adversary_threshold and quorum_threshold will directly influence the cost of encoding for the blob to be dispersed, roughly by a factor of 100 / (quorum_threshold - adversary_threshold). See the spec for more details: https://github.com/0glabs/0g-data-avail/blob/master/docs/spec/protocol-modules/storage/overview.md | - - - - - - - - - - -### BlobStatus - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| UNKNOWN | 0 | | -| PROCESSING | 1 | PROCESSING means that the blob is currently being processed by the disperser | -| CONFIRMED | 2 | CONFIRMED means that the blob has been dispersed to DA Nodes and the dispersed batch containing the blob has been confirmed onchain | -| FAILED | 3 | FAILED means that the blob has failed permanently (for reasons other than insufficient signatures, which is a separate state) | -| FINALIZED | 4 | FINALIZED means that the block containing the blob's confirmation transaction has been finalized on Ethereum | -| INSUFFICIENT_SIGNATURES | 5 | INSUFFICIENT_SIGNATURES means that the quorum threshold for the blob was not met for at least one quorum. | - - - - - - - - - -### Disperser -Disperser defines the public APIs for dispersing blobs. - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| DisperseBlob | [DisperseBlobRequest](#disperser-DisperseBlobRequest) | [DisperseBlobReply](#disperser-DisperseBlobReply) | This API accepts blob to disperse from clients. This executes the dispersal async, i.e. it returns once the request is accepted. The client could use GetBlobStatus() API to poll the the processing status of the blob. | -| GetBlobStatus | [BlobStatusRequest](#disperser-BlobStatusRequest) | [BlobStatusReply](#disperser-BlobStatusReply) | This API is meant to be polled for the blob status. | -| RetrieveBlob | [RetrieveBlobRequest](#disperser-RetrieveBlobRequest) | [RetrieveBlobReply](#disperser-RetrieveBlobReply) | This retrieves the requested blob from the Disperser's backend. This is a more efficient way to retrieve blobs than directly retrieving from the DA Nodes (see detail about this approach in api/proto/retriever/retriever.proto). The blob should have been initially dispersed via this Disperser service for this API to work. | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/api/docs/retriever.md b/api/docs/retriever.md deleted file mode 100644 index 676117b..0000000 --- a/api/docs/retriever.md +++ /dev/null @@ -1,106 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [retriever.proto](#retriever-proto) - - [BlobReply](#retriever-BlobReply) - - [BlobRequest](#retriever-BlobRequest) - - - [Retriever](#retriever-Retriever) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## retriever.proto - - - - - -### BlobReply - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| data | [bytes](#bytes) | | The blob retrieved and reconstructed from the ZGDA Nodes per BlobRequest. | - - - - - - - - -### BlobRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| batch_header_hash | [bytes](#bytes) | | The hash of the ReducedBatchHeader defined onchain, see: https://github.com/0glabs/0g-data-avail/blob/master/contracts/src/interfaces/IZGDAServiceManager.sol#L43 This identifies the batch that this blob belongs to. | -| blob_index | [uint32](#uint32) | | Which blob in the batch this is requesting for (note: a batch is logically an ordered list of blobs). | -| reference_block_number | [uint32](#uint32) | | The Ethereum block number at which the batch for this blob was constructed. | -| quorum_id | [uint32](#uint32) | | Which quorum of the blob this is requesting for (note a blob can participate in multiple quorums). | - - - - - - - - - - - - - - -### Retriever -The Retriever is a service for retrieving chunks corresponding to a blob from -the ZGDA operator nodes and reconstructing the original blob from the chunks. -This is a client-side library that the users are supposed to operationalize. - -Note: Users generally have two ways to retrieve a blob from ZGDA: - 1) Retrieve from the Disperser that the user initially used for dispersal: the API - is Disperser.RetrieveBlob() as defined in api/proto/disperser/disperser.proto - 2) Retrieve directly from the ZGDA Nodes, which is supported by this Retriever. - -The Disperser.RetrieveBlob() (the 1st approach) is generally faster and cheaper as the -Disperser manages the blobs that it has processed, whereas the Retriever.RetrieveBlob() -(the 2nd approach here) removes the need to trust the Disperser, with the downside of -worse cost and performance. - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| RetrieveBlob | [BlobRequest](#retriever-BlobRequest) | [BlobReply](#retriever-BlobReply) | This fans out request to ZGDA Nodes to retrieve the chunks and returns the reconstructed original blob in response. | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/contributing.md b/contributing.md new file mode 100644 index 0000000..9265b0d --- /dev/null +++ b/contributing.md @@ -0,0 +1,12 @@ +# Contributing + +### Why are these changes needed? + +### Checks + +* [ ] I've made sure the lint is passing in this PR. +* [ ] I've made sure the tests are passing. Note that there might be a few flaky tests, in that case, please comment that they are not relevant. +* [ ] Testing Strategy + * [ ] Unit tests + * [ ] Integration tests + * [ ] This PR is not tested :( diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..b507c62 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,22 @@ +# 0G DA + +## Organization + +The 0G DA repo is organized as a monorepo, with each project adhering to the "Ben Johnson" project structure style. Within the core project directories (e.g., `core`, `disperser`, `retriever`), the main interfaces and data types are defined at the root of the project, while implementations are organized by dependency. + +In general, the `core` project contains implementation of all the important business logic responsible for the security guarantees of the 0G DA protocol, while the other projects add the networking layers needed to run the distributed system. + +## Directory structure + +``` +┌── : api: Protobuf definitions +├── : common: contract bindings and other basic components +┌── : core: Core logic of the 0G DA protocol +├── : disperser: Disperser service +├── : docs: Documentation and specification +├── : pkg: Dependent pkg +| ├── : encoding: Core encoding/decoding functionality and multiproof generation +| └── : kzg: kzg libraries +├── : retriever: Retriever service +├── : tests: Tools for running integration tests +``` diff --git a/docs/api/README.md b/docs/api/README.md new file mode 100644 index 0000000..dd2d529 --- /dev/null +++ b/docs/api/README.md @@ -0,0 +1,6 @@ +# gRPC API + +This part contains the API documentation for the gRPC services included in the 0G DA platform. Each markdown file contains the protobuf definitions for each respective service including: + +- [Disperser](disperser.md): the hosted service for users to interact with 0G DA. +- [Retriever](retriever.md): a service that users can run on their own infrastructure, which exposes a gRPC endpoint for retrieval and verification of blobs from 0G Storage nodes. diff --git a/docs/api/disperser.md b/docs/api/disperser.md new file mode 100644 index 0000000..140faa5 --- /dev/null +++ b/docs/api/disperser.md @@ -0,0 +1,125 @@ +# Disperser API + +## Table of Contents + +- [Service](disperser.md#service) + - [Disperser](disperser.md#disperser) +- [Data Structure](disperser.md#data-structure) + - [BatchHeader](disperser.md#batchheader) + - [BatchMetadata](disperser.md#batchmetadata) + - [BlobHeader](disperser.md#blobheader) + - [BlobInfo](disperser.md#blobinfo) + - [BlobQuorumParam](disperser.md#blobquorumparam) + - [BlobStatusReply](disperser.md#blobstatusreply) + - [BlobStatusRequest](disperser.md#blobstatusrequest) + - [BlobVerificationProof](disperser.md#blobverificationproof) + - [DisperseBlobReply](disperser.md#disperseblobreply) + - [DisperseBlobRequest](disperser.md#disperseblobrequest) + - [RetrieveBlobRequest](disperser.md#retrieveblobrequest) + - [RetrieveBlobReply](disperser.md#retrieveblobreply) + - [SecurityParams](disperser.md#securityparams) + - [BlobStatus](disperser.md#blobstatus) +- [Scalar Value Types](disperser.md#scalar-value-types) + +[Top](disperser.md#top) + +## Service + +### Disperser + +Disperser defines the public APIs for dispersing blobs. + +
Method NameRequest TypeResponse TypeDescription
DisperseBlobDisperseBlobRequestDisperseBlobReplyThis API accepts blob to disperse from clients. This executes the dispersal async, i.e. it returns once the request is accepted. The client could use GetBlobStatus() API to poll the the processing status of the blob.
GetBlobStatusBlobStatusRequestBlobStatusReplyThis API is meant to be polled for the blob status.
RetrieveBlobRetrieveBlobRequestRetrieveBlobReplyThis retrieves the requested blob from the Disperser's backend. This is a more efficient way to retrieve blobs than directly retrieving from the DA Nodes (see detail about this approach in api/proto/retriever/retriever.proto). The blob should have been initially dispersed via this Disperser service for this API to work.
+ +## Data Structure + +### BatchHeader + +
FieldTypeLabelDescription
batch_rootbytesThe root of the merkle tree with the hashes of blob headers as leaves.
quorum_numbersbytesAll quorums associated with blobs in this batch.
quorum_signed_percentagesbytesThe percentage of stake that has signed for this batch. The quorum_signed_percentages[i] is percentage for the quorum_numbers[i].
reference_block_numberuint32The Ethereum block number at which the batch was created. The Disperser will encode and disperse the blobs based on the onchain info (e.g. operator stakes) at this block number.
+ +### BatchMetadata + +
FieldTypeLabelDescription
batch_headerBatchHeader
signatory_record_hashbytesThe hash of all public keys of the operators that did not sign the batch.
feebytesThe gas fee of confirming this batch. It's the bytes representation of a big.Int value.
confirmation_block_numberuint32The Ethereum block number at which the batch is confirmed onchain.
batch_header_hashbytesThis is the hash of the ReducedBatchHeader defined onchain, see: https://github.com/0glabs/0g-data-avail/blob/master/contracts/src/interfaces/IZGDAServiceManager.sol#L43 The is the message that the operators will sign their signatures on.
+ +### BlobHeader + +
FieldTypeLabelDescription
commitmentbytesKZG commitment to the blob.
data_lengthuint32The length of the blob in symbols (each symbol is 31 bytes).
blob_quorum_paramsBlobQuorumParamrepeatedThe params of the quorums that this blob participates in.
+ +### BlobInfo + +BlobInfo contains information needed to confirm the blob against the 0G DA contracts + +
FieldTypeLabelDescription
blob_headerBlobHeader
blob_verification_proofBlobVerificationProof
+ +### BlobQuorumParam + +
FieldTypeLabelDescription
quorum_numberuint32The ID of the quorum.
adversary_threshold_percentageuint32Same as SecurityParams.adversary_threshold.
quorum_threshold_percentageuint32Same as SecurityParams.quorum_threshold.
quantization_paramuint32This determines the nominal number of chunks for the blob, which is nominal_num_chunks = quantization_param * num_operators. A chunk is the smallest unit that's distributed to DA Nodes, corresponding to a set of evaluations of the polynomial (representing the blob) and a KZG multiproof.
encoded_lengthuint64The length of the blob after encoding (in number of symbols).
+ +### BlobStatusReply + +
FieldTypeLabelDescription
statusBlobStatusThe status of the blob.
infoBlobInfoThe blob info needed for clients to confirm the blob against the 0G DA contracts.
+ +### BlobStatusRequest + +BlobStatusRequest is used to query the status of a blob. + +
FieldTypeLabelDescription
request_idbytes
+ +### BlobVerificationProof + +
FieldTypeLabelDescription
batch_iduint32batch_id is an incremental ID assigned to a batch by ZGDAServiceManager
blob_indexuint32The index of the blob in the batch (which is logically an ordered list of blobs).
batch_metadataBatchMetadata
inclusion_proofbytesinclusion_proof is a merkle proof for a blob header's inclusion in a batch
quorum_indexesbytesindexes of quorums in BatchHeader.quorum_numbers that match the quorums in BlobHeader.blob_quorum_params Ex. BlobHeader.blob_quorum_params = [ { quorum_number = 0, ... }, { quorum_number = 3, ... }, { quorum_number = 5, ... }, ] BatchHeader.quorum_numbers = [0, 5, 3] => 0x000503 Then, quorum_indexes = [0, 2, 1] => 0x000201
+ +### DisperseBlobReply + +
FieldTypeLabelDescription
resultBlobStatusThe status of the blob associated with the request_id.
request_idbytesThe request ID generated by the disperser. Once a request is accepted (although not processed), a unique request ID will be generated. Two different DisperseBlobRequests (determined by the hash of the DisperseBlobRequest) will have different IDs, and the same DisperseBlobRequest sent repeatedly at different times will also have different IDs. The client should use this ID to query the processing status of the request (via the GetBlobStatus API).
+ +### DisperseBlobRequest + +
FieldTypeLabelDescription
databytesThe data to be dispersed. The size of data must be <= 512KiB.
security_paramsSecurityParamsrepeatedSecurity parameters allowing clients to customize the safety (via adversary threshold) and liveness (via quorum threshold). Clients can define one SecurityParams per quorum, and specify multiple quorums. The disperser will ensure that the encoded blobs for each quorum are all processed within the same batch.
+ +### RetrieveBlobRequest + +RetrieveBlobRequest contains parameters to retrieve the blob. + +| Field | Type | Label | Description | +| ----------------- | ------ | ----- | ----------- | +| batch_header_hash | bytes | | | +| blob_index | uint32 | | | + +### RetrieveBlobReply + +RetrieveBlobReply contains the retrieved blob data + +| Field | Type | Label | Description | +| ----- | ----- | ----- | ----------- | +| data | bytes | | | + +### SecurityParams + +SecurityParams contains the security parameters for a given quorum. + +
FieldTypeLabelDescription
quorum_iduint32The ID of the quorum. The quorum must be already registered on EigenLayer. The ID must be in range [0, 255].
adversary_thresholduint32The max percentage of stake within the quorum that can be held by or delegated to adversarial operators.
+ +### BlobStatus + +
NameNumberDescription
UNKNOWN0
PROCESSING1PROCESSING means that the blob is currently being processed by the disperser
CONFIRMED2CONFIRMED means that the blob has been dispersed to DA Nodes and the dispersed batch containing the blob has been confirmed onchain
FAILED3FAILED means that the blob has failed permanently (for reasons other than insufficient signatures, which is a separate state)
FINALIZED4FINALIZED means that the block containing the blob's confirmation transaction has been finalized on Ethereum
INSUFFICIENT_SIGNATURES5INSUFFICIENT_SIGNATURES means that the quorum threshold for the blob was not met for at least one quorum.
+ +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ---------- | ----------- | ------- | ---------- | -------------- | ------------------------------ | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | \[]byte | ByteString | string | String (ASCII-8BIT) | diff --git a/docs/api/retriever.md b/docs/api/retriever.md new file mode 100644 index 0000000..c05f56d --- /dev/null +++ b/docs/api/retriever.md @@ -0,0 +1,57 @@ +# Retriever API + +## Table of Contents + +- [Service](retriever.md#service) + - [Retriever](retriever.md#retriever) +- [Data Structure](retriever.md#data-structure) + - [BlobReply](retriever.md#blobreply) + - [BlobRequest](retriever.md#blobrequest) +- [Scaler Value Types](retriever.md#scalar-value-types) + +[Top](retriever.md#top) + +## Service + +### Retriever + +| Method Name | Request Type | Response Type | Description | +| ------------ | --------------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| RetrieveBlob | [BlobRequest](retriever.md#blobrequest) | [BlobReply](retriever.md#blobreply) | This fans out request to 0G DA Nodes to retrieve the chunks and returns the reconstructed original blob in response. | + +## Data Structure + +### BlobRequest + +| Field | Type | Label | Description | +| ---------------------- | ------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| batch_header_hash | bytes | | The hash of the ReducedBatchHeader defined onchain, see: https://github.com/0g-gravity-labs/0g-data-avail/blob/master/contracts/src/interfaces/IZGDAServiceManager.sol#L43 This identifies the batch that this blob belongs to. | +| blob_index | uint32 | | Which blob in the batch this is requesting for (note: a batch is logically an ordered list of blobs). | +| reference_block_number | uint32 | | The Ethereum block number at which the batch for this blob was constructed. | +| quorum_id | uint32 | | Which quorum of the blob this is requesting for (note a blob can participate in multiple quorums). | + +### BlobReply + +| Field | Type | Label | Description | +| ----- | ----- | ----- | -------------------------------------------------------------------------- | +| data | bytes | | The blob retrieved and reconstructed from the 0G DA Nodes per BlobRequest. | + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ---------- | ----------- | ------- | ---------- | -------------- | ------------------------------ | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | \[]byte | ByteString | string | String (ASCII-8BIT) | diff --git a/docs/architecture/README.md b/docs/architecture/README.md new file mode 100644 index 0000000..dd11312 --- /dev/null +++ b/docs/architecture/README.md @@ -0,0 +1,33 @@ +# Architecture + +0G system consists of a data availability layer (0G DA) on top of a decentralized storage system (0G Storage). There is a separate consensus network that is part of both the 0G DA and the 0G Storage. + +* For 0G Storage, the consensus is responsible for determining the ordering of the uploaded data blocks, realizing the storage mining verification and the corresponding incentive mechanism through smart contract. +* For 0G DA, the consensus is in charge of guaranteeing the data availability property of each data block via data availability sampling. In other words, each validator does data availability sampling independently, and once the majority of the validators reach the consensus of the successful sampling results, the data will be treated as available. The data availability sampling is mainly to verify that the specific data block is not maliciously withheld by the client and is indeed ingested into the 0G Storage where it is stored in a reliable and persistent way. + +As is shown in Figure 1, data is made available on 0G DA through the following flow: + +#### Blob Dispersal + +1. A user submits a data blob to a Disperser service. +2. The Disperser encodes the data in accordance with the encoding requirements, constructs the appropriate metadata, and directly stores the blob as well as the metadata to the s3 bucket. +3. A Batcher listens to the metadata updates on s3 and encodes the blob into an encoded blob and stores it in memory. +4. The Batcher then packs multiple blobs into one batch, together with the KZG commitments of each blob. It also constructs a merkle tree of the batch which is used to verify a certain blob is in a batch for data integrity. +5. The Batcher sends the merkle root to the on-chain 0G Storage contract. It also sends the full batch to a 0G Storage node. +6. The 0G Storage node will listen to the on-chain event, fetch the merkle root and verify the batch data is aligned with the merkle root. If yes, it stores the batch together with its metadata into 0G Storage kv. + +#### Blob Retrieval + +There are two approaches for data retrieval. + +* If a user trusts an existing disperser service. + 1. A user can directly request a disperser to download the blob data from s3, provided that the user trusts the disperser. This can bring high efficiency in retrieval phase since it relies on p2p trust to skip the expensive data verification process. As a result, it unlocks the super high throughput of 0G DA system. +* If a user doesn't trust any disperser. + 1. A user can start its own retriever service. + 2. The retriever service will verify the metadata and merkle proof of the blob before fetching the full data chunks. + 3. After successful verification, the retriever will start to download and verify the KZG commitments of each data chunk. + 4. After all successful downloading and verification, the retriever returns the whole data blob to the user. + +In this way, 0G DA provides not only [security guarantee](../security/) to the data but also efficiency for the user to quickly retrieve the data from the disperser. + +

Figure 1. Architecture Overview

diff --git a/docs/architecture/batcher.md b/docs/architecture/batcher.md new file mode 100644 index 0000000..b76c8ff --- /dev/null +++ b/docs/architecture/batcher.md @@ -0,0 +1,32 @@ +# Batcher + +The batcher is an off-chain service which acts as a bridge between the Disperser and 0G Storage. It is in effect during the Dispersal phase. Figure 1 shows the detailed batcher workflow. + +### Batch Process + +1. When a user submits a dispersal request, the disperser service will store the blob and its metadata on to s3 and dynamodb correspondingly. +2. The batcher has a encoder streaming process to listen to the update of the metadata on the dynamodb and triggers the [encoding process](../security/encoding.md) of the blob data. The batcher stores the encoded blob data into its memory. +3. The batcher has a separate batching processor to query the memory and batch multiple encoded blobs into one batch. During this process, it also generates merkle proof for each blob based on its blob header. +4. The batcher then calls a dispatch service to dispatch the batch data and its metadata to 0G Storage for verification and data store. + +### Dispatch Process + +1. A dispatcher receives + - Hash of the batch header + - [Batch Header](../data-model.md#batch-header) + - [Encoded Blobs](../data-model.md#encoded-blob) + - [Merkle Proofs](../data-model.md#merkle-tree-proof) +2. Upon receiving the above data, the dispatcher will dump the batch data to 0G Storage node. +3. The dispatcher will also call an on-chain contract to upload batch headers. + +Note that it is up to the 0G Storage Node to verify the correctness of the batch data with its header. + +### Finalization + +The batcher has two more components, confirmer and finalizer. + +The confirmer is used to query the tx receipt from the on-chain contract to check if the transaction is confirmed on chain. + +The finalizer is used to check the difference between the confirmed block number and current block number to determine if such transaction is finalized (no reorg) on chain. + +

Figure 1. Batcher Workflow

diff --git a/docs/architecture/disperser.md b/docs/architecture/disperser.md new file mode 100644 index 0000000..d3757b3 --- /dev/null +++ b/docs/architecture/disperser.md @@ -0,0 +1,36 @@ +# Disperser + +### Dispersal + +Requesters that want to store data on 0G Storage make requests to the disperser with the form of [`DisperseBlobRequest`](../data-model.md#request). + +They specify the data they want to store on 0G Storage. The disperser takes each `DisperseBlobRequest` and stores it into the s3 bucket. The data that the disperser stores into the s3 bucket contains two parts: blob metadata and full blob data. + +#### Blob Data + +The [key](../data-model.md#blob-key) of the blob data is calculated by a certain hash function. This key is used for users to retrieve the blob directly from a disperser. The disperser uploads the blob data with the object key of the blob hash to a certain s3 bucket (defined by the disperser service). + +In pseudocode: + +```go +blobHash := getBlobHash(blob) +metadataHash := getMetadataHash(requestedAt, blob.RequestHeader.SecurityParams) +metadataKey.BlobHash = blobHash +metadataKey.MetadataHash = metadataHash + +err = s.s3Client.UploadObject(ctx, s.bucketName, blobObjectKey(blobHash), blob.Data) +``` + +#### Metadata + +The [metadata](../data-model.md#blob-metadata) of a blob is constructed and stored into a table (defined by the disperser service) in aws dynamodb which is a nosql database. The update of the metadata in the dynamodb is monitored by the Batcher service to do further process. + +### Retrieval + +Requesters can directly download the data blob from the disperser service with the form of [`RetrieveBlobRequest`](../data-model.md#request). + +The user defines the index of the blob in a batch and the hash of the batch header to retrieve the metadata of the blob in dynamodb first. The disperser then downloads the full blob data using the blob key in the metadata. + + + +Note that the disperser is not responsible for encoding/decoding of the blob. The disperser service is trustless, whether to trust the disperser depends on the user judgement. diff --git a/docs/architecture/retriever.md b/docs/architecture/retriever.md new file mode 100644 index 0000000..098c6be --- /dev/null +++ b/docs/architecture/retriever.md @@ -0,0 +1,20 @@ +# Retriever + +The Retriever is a service for retrieving chunks corresponding to a blob from the 0G DA operator nodes and reconstructing the original blob from the chunks. This is a client-side library that the users are supposed to operationalize. + +When an end user posts a blob of data to 0G DA, the disperser determines which place to store the data and does two things: + +1. Directly store the data into the pre-configured s3 bucket. +2. Send the blob request into a queue for the batcher to batch multiple blobs together and send out to 0G Storage Node for DA. The batcher will also append the KZG commitment to the batch for later verification use. + +Note: Users generally have two ways to retrieve a blob from 0G DA: + +1. Retrieve from the Disperser that the user initially used for dispersal: the API is `Disperser.RetrieveBlob()` as defined in `api/proto/disperser/disperser.proto` +2. Retrieve directly from the 0G DA Nodes, which is supported by this Retriever. + +The `Disperser.RetrieveBlob()` is generally faster and cheaper as the Disperser manages the blobs that it has processed, whereas the Retriever.RetrieveBlob() removes the need to trust the Disperser, with the downside of more cost and performance. + +1. The user submit the retrieval request to the retriever service with the form of [`BlobRequest`](../data-model.md#blob-request). +2. The retriever client will first fetch the metadata of the blob and verify its merkle proof to guarantee correctness. +3. Then the client will verify the KZG commitments of each chunk in the blob and download the chunk if the check passes. +4. The retriever will finally decode the chunks into the original blob data and send back to the user. diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index 542fa6f..0000000 --- a/docs/contributing.md +++ /dev/null @@ -1,27 +0,0 @@ - - -# Organization - -The ZGDA repo is organized as a monorepo, with each project adhering to the "Ben Johnson" project structure style. Within the core project directories (e.g., `core`, `disperser`, `node`, `retriever`, `indexer`), the main interfaces and data types are defined at the root of the project, while implementations are organized by dependency. For instance, the folder `indexer/inmem` contains implementations of the interfaces in `indexer` which use in-memory storage, while `indexer/leveldb` may contain implementations of the same interfaces that use `leveldb`. Mocks of all interfaces in the `indexer` project go in `indexer/mock`. - -The same pattern is used for intra-project and inter-project dependencies. For instance, the folder `indexer/indexer` contains implementations of the interfaces in `core` which depend on the `indexer` project. - -In general, the `core` project contains implementation of all the important business logic responsible for the security guarantees of the ZGDA protocol, while the other projects add the networking layers needed to run the distributed system. - - -# Directory structure -
-┌── api Protobuf definitions and contract bindings
-├── contracts
-|   ├── eigenlayer-contracts: Contracts for the EigenLayer restaking platform
-┌── core: Core logic of the ZGDA protocol
-├── disperser: Disperser service
-├── docs: Documentation and specification
-── indexer: A simple indexer for efficiently tracking chain state and maintaining accumulators
-├── node: DA node service
-├── pkg
-|   ├── encoding: Core encoding/decoding functionality and multiproof generation
-|   └── kzg: kzg libraries
-├── retriever: Retriever service
-├── test: Tools for running integration tests
-
diff --git a/docs/data-model.md b/docs/data-model.md new file mode 100644 index 0000000..cd9f8b2 --- /dev/null +++ b/docs/data-model.md @@ -0,0 +1,150 @@ +# Data Model + +## Disperser + +### Request + +```go +type DisperseBlobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The data to be dispersed. + // The size of data must be <= 512KiB. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + SecurityParams []*SecurityParams `protobuf:"bytes,2,rep,name=security_params,json=securityParams,proto3" json:"security_params,omitempty"` + // The number of chunks that encoded blob split into. + // The number will be aligned to the next power of 2 and be bounded by blob size. + uint32 targetChunkNum = 3; +} + +type RetrieveBlobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BatchHeaderHash []byte `protobuf:"bytes,1,opt,name=batch_header_hash,json=batchHeaderHash,proto3" json:"batch_header_hash,omitempty"` + BlobIndex uint32 `protobuf:"varint,2,opt,name=blob_index,json=blobIndex,proto3" json:"blob_index,omitempty"` +} +``` + +### Blob Key + +```go +type BlobKey struct { + BlobHash BlobHash + MetadataHash MetadataHash +} +``` + +### Blob Metadata + +```go +type BlobMetadata struct { + BlobHash BlobHash `json:"blob_hash"` + MetadataHash MetadataHash `json:"metadata_hash"` + BlobStatus BlobStatus `json:"blob_status"` + // Expiry is unix epoch time in seconds at which the blob will expire + Expiry uint64 `json:"expiry"` + // NumRetries is the number of times the blob has been retried + // After few failed attempts, the blob will be marked as failed + NumRetries uint `json:"num_retries"` + // RequestMetadata is the request metadata of the blob when it was requested + // This field is omitted when marshalling to DynamoDB attributevalue as this field will be flattened + RequestMetadata *RequestMetadata `json:"request_metadata" dynamodbav:"-"` + // ConfirmationInfo is the confirmation metadata of the blob when it was confirmed + // This field is nil if the blob has not been confirmed + // This field is omitted when marshalling to DynamoDB attributevalue as this field will be flattened + ConfirmationInfo *ConfirmationInfo `json:"blob_confirmation_info" dynamodbav:"-"` +} +``` + +### Blob Header + +```go +type BlobHeader struct { + // KZG commitments of the blob + BlobCommitments + // DEPRECATED + QuorumInfos []*BlobQuorumInfo + // DEPRECATED + AccountID AccountID `json:"account_id"` +} + +// BlomCommitments contains the blob's commitment, degree proof, and the actual degree. +type BlobCommitments struct { + Commitment *Commitment + LengthProof *Commitment + Length uint +} +``` + +## Batcher + +### Batch Header + +```go +type BatchHeader struct { + // ReferenceBlockNumber is the block number at which all operator information (stakes, indexes, etc.) is taken from + ReferenceBlockNumber uint + // BatchRoot is the root of a Merkle tree whose leaves are the hashes of the blobs in the batch + BatchRoot [32]byte + // DataRoot is the root of a Merkle tree whos leaves are the merkle root encoded data blobs divided in zgs segment size + DataRoot eth_common.Hash +} +``` + +### Encoded Blob + +```go +type EncodedBlob = BlobMessage + +type BlobMessage struct { + BlobHeader *BlobHeader + Bundles Bundles +} + +type Bundles = []*Chunk + +type Chunk struct { + // The Coeffs field contains the coefficients of the polynomial which interolates these evaluations. This is the same as the + // interpolating polynomial, I(X), used in the KZG multi-reveal (https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html#multiproofs) + Coeffs []Symbol + Proof Proof +} +``` + +### Merkle Tree Proof + +```go +// Proof is a proof of a Merkle tree. +type Proof struct { + Hashes [][]byte + Index uint64 +} +``` + +## Retriever + +### Blob Request + +```go +type BlobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The hash of the ReducedBatchHeader defined onchain, see: + // https://github.com/0glab/0g-data-avail/blob/master/contracts/src/interfaces/IZGDAServiceManager.sol#L43 + // This identifies the batch that this blob belongs to. + BatchHeaderHash []byte `protobuf:"bytes,1,opt,name=batch_header_hash,json=batchHeaderHash,proto3" json:"batch_header_hash,omitempty"` + // Which blob in the batch this is requesting for (note: a batch is logically an + // ordered list of blobs). + BlobIndex uint32 `protobuf:"varint,2,opt,name=blob_index,json=blobIndex,proto3" json:"blob_index,omitempty"` + // DEPRECATED + ReferenceBlockNumber uint32 `protobuf:"varint,3,opt,name=reference_block_number,json=referenceBlockNumber,proto3" json:"reference_block_number,omitempty"` + // DEPRECATED + QuorumId uint32 `protobuf:"varint,4,opt,name=quorum_id,json=quorumId,proto3" json:"quorum_id,omitempty"` +} +``` diff --git a/docs/design/assignment.md b/docs/design/assignment.md deleted file mode 100644 index 29be4d1..0000000 --- a/docs/design/assignment.md +++ /dev/null @@ -1,127 +0,0 @@ - -# Chunk Assignment Design - -## Definitions and assumptions - -Let $O$ be the set of operators. We will assume that the set of operators has a fixed size $|O| = n$. For example, we can take $n=500$ due to current restrictions on signature verification. - -For each operator $i \in O$, let $S_i$ signify the amount of stake held by that operator. - - -## Primary Requirements - -The system must observe the following primary design requirements - -### 1. Upholds security guarantee - -The system specifies a security parameter $\alpha$ corresponding to the maximum amount of adversarial stake. For a given data store with a percentage of a stake signed $\beta > \alpha$, this means that we assume that a percentage $\gamma = \beta-\alpha$ of the total stake is both 1) honest and 2) in possession of their chunk. - -For the system to be secure, we need to be sure that the chunks associated with this stake suffice to reconstruct the original blob. That is, for any set of operators $U \subseteq O$ such that the following condition holds - -$$ \sum_{i \in U} S_i \ge \gamma \sum_{i \in O}S_i$$ - -we must be able to reconstruct the original blob from the chunks held by the operators in $U$. - - -#### Alternative Statement -An alternative security requirement: For all possible groups of dishonest operators, we need to be able to reconstruct from the complement. That is for any $U_q \subseteq O$ such that - -$$ \sum_{i \in U_q} S_i \ge \beta \sum_{i \in O}S_i$$ - -and any $U_a \subseteq U_q$ such - -$$ \sum_{i \in U_a} S_i \le \alpha \sum_{i \in O}S_i$$ - - -we need to be able to reconstruct from $U_q \setminus U_a$. But we can see that the total stake held by this group will satisfy - -$$ -\sum_{i \in U_q \setminus U_a} S_i = \sum_{i \in U_q}S_i - \sum_{i \in U_a}S_i \ge (\beta-\alpha)\sum_{i \in O}S_i = \gamma \sum_{i \in O}S_i. -$$ - -This tells us that the family $\{U_q \setminus U_a \}$ which satisfies the above conditions is contained in the family $\{U\}$ satisfying the previous condition. Since the second family is strictly larger, the alternative statement can actually result in a **larger** m. - -### 2. Observes operator bandwidth usage limits - -Let $B$ be the total size of a blob sent to ZGDA, e.g. in MB, and let $B_i$ denote the portion of the blob stored by operator $i$ having stake $S_i$. - -Note that if blob data were distributed exactly in accordance with stake, an operator's storage requirement would be given by - -$$\gamma \tilde{B}_i = B\frac{S_i}{\sum_j S_j}.$$ - -We require that portion of the blob stored by an operator $i$ will exceed its proportional allocation by no more than $B/n\gamma$. That is - -$$\max_{\{S_j:j\in O\}} \gamma\frac{B_i - \tilde{B}_i}{B} \le 1/n.$$ - -### 3. Minimizes encoding complexity - -The system should minimize coding and verification computational complexity for both the disperser and operators. The computational complexity roughly scales with the number of chunks (or more specifically, inversely with the chunk size) [clarification required]. Thus, the system should minimize the number of chunks, subject to requirements 1 and 2. - -## Proposed solution - -We outline the essential structure of the proposed solution, leaving optimizations for later. - -We introduce a quantization parameter $\rho$. Given $\rho$, we allocate to each operator $i$ a number of chunks equal to - -$$m_i = \text{ceil}\left(\frac{\rho nS_i}{\sum_j S_j}\right).$$ - -We can think of $\rho n$ as the nominal number of chunks. - -For a given $\rho$, we will be able to find a set of encoding parameters that satisfy requirement 1. Then, the strategy will be to find the smallest $\rho$ (in keeping with 3) which satisfies requirement 2. Let us first consider the problem of determining the correct coding parameters for a given $\rho$. - -### Upholding security (Req. 1) for fixed quantization parameter - - - -We know that we need to be able to reconstruct the blob from the chunks held by all sets $\mathcal{U}$ of operators $U$ satisfying the condition - -$$ \sum_{i \in U} S_i \ge \gamma \sum_{i \in O}S_i.$$ - -For such a set of operators $U$, the number of chunks held is given by $m_U = \sum_{i \in U}m_i$. - -Let $m$ be the smallest such $m_U$, i.e., - -$$m = \min_{U \in \mathcal{U}} m_U .$$ - -Clearly, if the encoding is such that we can reconstruct from any $m$ chunks, then we can also reconstruct from $m_U$ chunks for any $U \in \mathcal{U}$. Thus, $m$ determines the required reconstruction property of the system. - - - - -### Finding the optimal quantization parameter - -Let's find a lower bound for $m$. Using the fact that $m_i \ge \rho nS_i\sum_jS_j$ and substituting, we have - -$$m = \sum_{i \in U^\star} m_i \ge n\rho\frac{\sum_{i \in U^\star} S_i}{\sum_jS_j} \ge n\rho\gamma$$ - -where $U^\star \in \mathcal{U}$ is the set solving the optimization in the previous section and the final inequality uses the first inequality of the previous section, which holds for all $U \in \mathcal{U}$. - -Let $C$ be the size of an individual chunk and recall that $B$ is the blob size. Since - -$$C = B/m$$ - -we have that - -$$C \le \frac{B}{n\rho\gamma}.$$ - -Moreover, the total amount of data allocated to a given operator $i$ is bounded by - -$$B_i = m_i C \le \left(\frac{n\rho S_i}{\sum_j S_j}+1\right)C \le B\left(\frac{S_i}{\gamma \sum_jS_j} + \frac{1}{n\rho\gamma}\right) = \tilde{B}_i + \frac{B}{n\rho\gamma}$$ - -and further - -$$\gamma\frac{B_i - \tilde{B}_i}{B} \le \frac{1}{n\rho}.$$ - -We can therefore satisfy requirement 2 by letting $\rho=1$. - -### Assessment of coding complexity - -It turns out that to meet the desired requirements, we do not need to increase the encoding complexity (i.e. decrease chunk size) compared to the default case. An increase in the total number of chunks due to the `ceil()` function can be handled by increasing the number of parity symbols. - -Moreover, the optimization routine described for finding $m$ will serve only to improve beyond the baseline (lower bound), which already achieves desired performance. - -## FAQs - -Q1. Can increasing the number of parity symbols increase the total degree of the polynomial, resulting in greater coding complexity. - -A1. This seems like a possibility. In general, interactions with constraints of the proving system are not covered here. However, if this is a concern it should be possible to adjust block size constraints accordingly to avoid pushing over some limit. diff --git a/docs/design/encoding.md b/docs/design/encoding.md deleted file mode 100644 index 2bd7da4..0000000 --- a/docs/design/encoding.md +++ /dev/null @@ -1,63 +0,0 @@ -# KZG FFT Encoder Backend - -It is important that the encoding and commitment tasks are able to be performed in seconds and that the dominating complexity of the computation is nearly linear in the degree of the polynomial. This is done using algorithms based on the Fast Fourier Transform (FFT). - - -This document describes how the KZG-FFT encoder backend implements the `Encode(data [][]byte, params EncodingParams) (BlobCommitments, []*Chunk, error)` interface, which 1) transforms the blob into a list of `params.NumChunks` `Chunks`, where each chunk is of length `params.ChunkLength` 2) produces the associated polynomial commitments and proofs. - -We will also highlight the additional constraints on the Encoding interface which arise from the KZG-FFT encoder backend. - -## Deriving the polynomial coefficients and commitment - -As described in the [Encoding Module Specification](../spec/protocol-modules/storage/encoding.md), given a blob of data, we convert the blob to a polynomial $p(X) = \sum_{i=0}^{m-1} c_iX^i$ by simply slicing the data into a string of symbols, and interpreting this list of symbols as the tuple $(c_i)_{i=0}^{m-1}$. - -In the case of the KZG-FFT encoder, the polynomial lives on the field associated with the BN-254 elliptic curve, which as order [TODO: fill in order]. - -Given this polynomial representation, the KZG commitment can be calculated as in [KZG polynomial commitments](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html). - - -## Polynomial Evaluation with the FFT - -In order to use a Discrete Fourier Transform (DFT) to evaluate a polynomial, the indices of the polynomial evaluations which will make up the Chunks must be members of a cyclic group, which we will call $S$. A cyclic group is the group generated by taking all of the integer powers of some generator $v$, i.e., $\{v^k | k \in \mathbb{Z} \}$ (For this reason, the elements of a cyclic group $S$ of order $|S|=m$ will sometimes be referred to as the $|m|$’th roots of unity). Notice that since our polynomial lives on the BN254 field, the group $S$ must be a subgroup of that field (i.e. all if its elements must lie within that field). - -Given a cyclic group $S$ of order $m$, we can evaluate a polynomial $p(X)$ of order $n$ at the indices contained in $S$ via the DFT, - -$$ -p_k = \sum_{i=1}^{n}c_i (v^k)^i -$$ - -where $p_k$ gives the evaluation of the polynomial at $v^k \in S$. Letting $c$ denote the vector of polynomial coefficients and $p$ the vector of polynomial evaluations, we can use the shorthand $p = DFT[c]$. The inverse relation also holds, i.e., $c = DFT^{-1}[p]$. - -To evaluate the DFT programmatically, we want $m = n$. Notice that we can achieve this when $m > n$ by simply padding $c$ with zeros to be of length $m$. - -The use of the FFT can levy an additional requirement on the size of the group $S$. In our implementation, we require the size of $S$ to be a power of 2. For this, we can make use of the fact that the prime field associated with BN-254 contains a subgroup of order $2^{28}$, which in turn contains subgroups of orders spanning every power of 2 less than $2^{28}$. - - -As the encoding interface calls for the construction of `NumChunks` Chunks of length `ChunkLength`, our application requires that $S$ be of size `NumChunks*ChunkLength`, which in turn must be a power of 2. - -## Amortized Multireveal Proof Generation with the FFT - -The construction of the multireveal proofs can also be performed using a DFT (as in [“Fast Amortized Kate Proofs”](./https://eprint.iacr.org/2023/033.pdf)). Leaving the full details of this process to the referenced document, we describe here only 1) the index-assignment the scheme used by the amortized multiproof generation approach and 2) the constraints that this creates for the overall encoder interface. - -Given the group $S$ corresponding to the indices of the polynomial evaluations and a cyclic group $C$ which is a subgroup of $S$, the cosets of $C$ in $S$ are given by - -$$ -s+C = \{g+c : c \in C\} \text{ for } s \in S. -$$ - -Each coset $s+C$ has size $|C|$, and there are $|S|/|C|$ unique and disjoint cosets. - -Given a polynomial $p(X)$ and the groups $S$ and $C$, the Amortized Kate Proofs approach generates $|S|/|C|$ different KZG multi-reveal proofs, where each proof is associated with the evaluation of $p(X)$ at the indices contained in a single coset $sC$ for $s \in S$. Because the Amortized Kate Proofs approach uses the FFT under the hood, $C$ itself must have an order which is a power of 2. - -For the purposes of the KZG-FFT encoder, this means that we must choose $S$ to be of size `NumChunks*ChunkLength` and $C$ to be of size `ChunkLength`, each of which must be powers of 2. - - -## Worked Example - -As a simple illustrative example, suppose that `AssignmentCoordinator` provides the following parameters in order to meet the security requirements of given blob: -- `ChunkLength` = 3 -- `NumChunks` = 4 - -Supplied with these parameters, `Encoder.GetEncodingParams` will upgrade `ChunkLength` to the next highest power of 2, i.e., `ChunkLength` = 4, and leave `NumChunks` unchanged. The following figure illustrates how the indices will be assigned across the chunks in this scenario. - -![Worked example of chunk indices for ChunkLength=4, NumChunks=4](../assets/encoding-groups.png) diff --git a/docs/glossary.md b/docs/glossary.md new file mode 100644 index 0000000..a36e1b0 --- /dev/null +++ b/docs/glossary.md @@ -0,0 +1,15 @@ +# Glossary + +## Data Packaging + +**Blob:** Blobs are the fundamental unit of data posted to 0G DA by users. + +**Batch:** Batch is an aggregated data of multiple blobs together with the KZG commitments to each blob. + +## System Components + +**Disperser**. The Disperser is an off-chain service which is responsible for uploading the data into s3 buckets and sending the blob to the Batcher for further process. The disperser is an untrusted system component. + +**Batcher**. The Batcher is an off-chain component which accepts the blob requests from the Disperser and batches multiple blobs together with their KZG commitments into one data packet and send out to the 0G Storage nodes for data storage. + +**Retriever**. The Retriever is an off-chain service which implements a protocol for receiving data blobs from 0G Storage nodes. It is also responsible for verifying the authentication and correctness of the data. diff --git a/docs/introduction.md b/docs/introduction.md new file mode 100644 index 0000000..48fb154 --- /dev/null +++ b/docs/introduction.md @@ -0,0 +1,104 @@ +# Introduction + +## Overview + +0G DA is a decentralized data availability (DA) service with deep consideration in security, scalability and decentralization. It is also the first DA solution with a built-in data storage layer. Users interact with 0G DA to submit and store their data into[ 0G Storage](https://github.com/0glabs/0g-storage-node) for later retrieval. + +## Integration + +Check out [this example](https://github.com/0glabs/0g-da-example-rust) for how to integrate the 0G DA into your own applications. + +For detailed public APIs, visit [gRPC API](../0G%20DA/broken-reference/) section. + +## Deployment + +* For local test environment, [aws-cli](https://aws.amazon.com/cli/) is required. +* [Local Stack setup](./#localstack) +* [Disperser](./#disperser) +* [Retriever](./#retriever) + +### LocalStack + +Create LocalStack(local aws simulation) docker image and start a docker instance: + +```bash +cd inabox + +make deploy-localstack +``` + +### Disperser + +1. Build binaries: + +``` +cd disperser +make build +``` + +2. Run encoder: + +``` +make run_encoder +``` + +3. Set the cli arguments of run\_batcher in Makefile to proper values. Full list of available configuration parameters are showing below. + +``` +# default +--batcher.pull-interval 5s +--chain.receipt-wait-rounds 180 +--chain.receipt-wait-interval 1s +--chain.gas-limit 2000000 +--batcher.finalizer-interval 300s +--batcher.confirmer-num 3 +--encoder-socket 0.0.0.0:34000 +--batcher.batch-size-limit 50 +--batcher.srs-order 300000 +--encoding-timeout 10s +--chain-read-timeout 12s +--chain-write-timeout 13s +--batcher.storage.node-url http://0.0.0.0:5678 +--batcher.storage.node-url http://0.0.0.0:6789 +--batcher.storage.kv-url http://0.0.0.0:7890 +--batcher.storage.kv-stream-id 000000000000000000000000000000000000000000000000000000000000f2bd +--batcher.aws.region us-east-2 + +# custom +# aws +--batcher.aws.access-key-id localstack +--batcher.aws.secret-access-key localstack +--batcher.s3-bucket-name test-zgda-blobstore +--batcher.dynamodb-table-name test-BlobMetadata +# chain +--chain.rpc ETH_RPC_ENDPOINT +--chain.private-key YOUR_PRIVATE_KEY +--batcher.storage.flow-contract FLOW_CONTRACT_ADDR +``` + +4. Then run batcher and the main disperser server: + +``` +make run_batcher + +make run_server +``` + +### Retriever + +1. Build binaries: + +``` +cd retriever +make build +``` + +2. Run the main retriever server: + +``` +make run +``` + +## Contributing + +To make contributions to the project, please follow the guidelines [here](../../contributing.md). diff --git a/docs/pkg/README.md b/docs/pkg/README.md new file mode 100644 index 0000000..d2cc53e --- /dev/null +++ b/docs/pkg/README.md @@ -0,0 +1,6 @@ +# Dependent Package + +This part contains the dependent packages for the 0G DA protocol. + +* [Encoding](encoding.md): encode the blob sent to the disperser +* [KZG](kzg.md): KZG commitment algorithm to prove a particular blob is in a certain batch diff --git a/docs/pkg/encoding.md b/docs/pkg/encoding.md new file mode 100644 index 0000000..845a50d --- /dev/null +++ b/docs/pkg/encoding.md @@ -0,0 +1,5 @@ +# Encoding + +* Performs Reed Solomon Encoding using elliptic curve points. The library enables KZG multi-proof and reveal in $$O(n log n)$$ time using FFT, based on FK20 algorithm. +* Built upon crypto primitive from [https://pkg.go.dev/github.com/protolambda/go-kzg](https://pkg.go.dev/github.com/protolambda/go-kzg) +* Accepts arbitrary number of systematic nodes, parity nodes and data size, free of restriction on power of 2 diff --git a/docs/pkg/kzg.md b/docs/pkg/kzg.md new file mode 100644 index 0000000..b13e887 --- /dev/null +++ b/docs/pkg/kzg.md @@ -0,0 +1,54 @@ +# KZG and FFT utils + +This repo is _super experimental_. + +This is an implementation in Go, initially aimed at chunkification and extension of data, and building/verifying KZG proofs for the output data. The KZG proofs, or Kate proofs, are built on top of BLS12-381. + +Part of a low-latency data-availability sampling network prototype for Eth2 Phase 1. See https://github.com/protolambda/eth2-das + +Code is based on: + +* [KZG Data availability code by Dankrad](https://github.com/ethereum/research/tree/master/kzg\_data\_availability) +* [Verkle and FFT code by Dankrad and Vitalik](https://github.com/ethereum/research/tree/master/verkle) +* [Reed solomon erasure code recovery with FFTs by Vitalik](https://ethresear.ch/t/reed-solomon-erasure-code-recovery-in-n-log-2-n-time-with-ffts/3039) +* [FFT explainer by Vitalik](https://vitalik.eth.limo/general/2019/05/12/fft.html) +* [Kate explainer by Dankrad](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) +* [Kate amortized paper by Dankrad and Dmitry](https://github.com/khovratovich/Kate/blob/master/Kate\_amortized.pdf) + +Features: + +* (I)FFT on `F_r` +* (I)FFT on `G1` +* Specialized FFT for extension of `F_r` data +* KZG + * commitments + * generate/verify proof for single point + * generate/verify proofs for multiple points + * generate/verify proofs for all points, using FK20 + * generate/verify proofs for ranges (cosets) of points, using FK20 +* Data recovery: given an arbitrary subset of data (at least half), recover the rest +* Optimized for Data-availability usage +* Change Bignum / BLS with build tags. + +## BLS + +Currently supported BLS implementations: Herumi BLS and Kilic BLS (default). + +## Field elements (Fr) + +The BLS curve order is used for the modulo math, different libraries could be used to provide this functionality. Note: some of these libraries do not have full BLS functionality, only Bignum / uint256. The KZG code will be excluded when compiling with a non-BLS build tag. + +Build tag options: + +* (no build tags, default): Use Kilic BLS library. Previously used by `bignum_kilic` build tag. [`kilic/bls12-381`](https://github.com/kilic/bls12-381) +* `-tags bignum_hbls`: use Herumi BLS library. [`herumi/bls-eth-go-binary`](https://github.com/herumi/bls-eth-go-binary/) +* `-tags bignum_hol256`: Use the uint256 code that Geth uses, [`holiman/uint256`](https://github.com/holiman/uint256) +* `-tags bignum_pure`: Use the native Go Bignum implementation. + +## Benchmarks + +See `BENCH.md` for benchmarks of FFT, FFT in G1, FFT-extension, zero polynomials, and sample recovery. + +## License + +MIT, see `LICENSE` file. diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 0000000..d2c4c98 --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,22 @@ +# 0G DA Spec + +## Organization + +The 0G DA repo is organized as a monorepo, with each project adhering to the "Ben Johnson" project structure style. Within the core project directories (e.g., `core`, `disperser`, `retriever`), the main interfaces and data types are defined at the root of the project, while implementations are organized by dependency. + +In general, the `core` project contains implementation of all the important business logic responsible for the security guarantees of the 0G DA protocol, while the other projects add the networking layers needed to run the distributed system. + +## Directory structure + +``` +┌── : api: Protobuf definitions +├── : common: contract bindings and other basic components +┌── : core: Core logic of the 0G DA protocol +├── : disperser: Disperser service +├── : docs: Documentation and specification +├── : pkg: Dependent pkg +| ├── : encoding: Core encoding/decoding functionality and multiproof generation +| └── : kzg: kzg libraries +├── : retriever: Retriever service +├── : tests: Tools for running integration tests +``` diff --git a/docs/security/README.md b/docs/security/README.md new file mode 100644 index 0000000..009992d --- /dev/null +++ b/docs/security/README.md @@ -0,0 +1,22 @@ +# Security Guarantee + +The overall security guarantee provided by 0G DA is actually a composite of two guarantees, one at blob dispersal phase and another one at blob retrieval phase. + +## Dispersal + +The main guarantee at the dispersal phase is implemented in the 0G Storage module. In particular, the storage module is responsible for upholding the following guarantee: + +* 0G Storage Contract: receive merkle root from the batcher and emit on-chain events +* 0G Storage Node: receive full batch data and verify the data with the submitted on-chain merkle root (by listening on corresponding events). + +The merkle root is constructed from the multiple blobs in the batch by the batcher. Its purpose is to verify that certain blob is in the batch. The storage node is responsible for verifying the correctness of the full batch data using the root. + +## Retrieval + +The 0G DA retrievers expect for blobs to correspond to evaluations of a polynomial of a certain degree. The blob payload delivered to the receiver contains a KZG polynomial commitment identifying the polynomial, as well as a separate commitment allowing the retriever to verify its degree. + +The receiver will perform the following checks for each retrieval request to ensure that the [`BlobRequest`](../data-model.md#request) is valid: + +1. Verify the merkle proof in the requested blob metadata by calling `VerifyProofUsing`. +2. Verify the KZG commitment by using `lowDegreeProof` to verify that `BlobCommitments` in the [`BlobHeader`](../data-model.md#blob-header) commits to a polynomial of degree equal to the commitments length. +3. Verify the KZG commitment for each blob chunk which was previously encoded into the blob during the dispersal phase. diff --git a/docs/spec/protocol-modules/storage/encoding.md b/docs/security/encoding.md similarity index 70% rename from docs/spec/protocol-modules/storage/encoding.md rename to docs/security/encoding.md index 5f829b3..f3804fd 100644 --- a/docs/spec/protocol-modules/storage/encoding.md +++ b/docs/security/encoding.md @@ -1,9 +1,9 @@ - # Encoding ## Overall Requirements -Within ZGDA, blobs are encoded so that they can be scalably distributed among the DA nodes. The ZGDA encoding module is designed to meet the following security requirements: +Within 0G DA, blobs are encoded so that they can be scalably distributed among the DA nodes. The 0G DA encoding module is designed to meet the following security requirements: + 1. Adversarial tolerance for DA nodes: We need to have tolerance to arbitrary adversarial behavior by DA nodes up to some threshold, which is discussed in other sections. Note that simple sharding approaches such as duplicating slices of the blob data have good tolerance to random node dropout, but poor tolerance to worst-case adversarial behavior. 2. Adversarial tolerance for disperser: We do not want to put trust assumptions on the encoder or rely on fraud proofs to detect if an encoding is done incorrectly. @@ -43,12 +43,11 @@ type Encoder interface { } ``` -Notice that these interfaces only support a global chunk size across all the encoded chunks for a given encoded blob. This constraint derives mostly from the design of the [KZG FFT Encoder Backend](#the-kzg-fft-encoder-backend) which generates multireveal proofs in an amortized fashion. - +Notice that these interfaces only support a global chunk size across all the encoded chunks for a given encoded blob. This constraint derives mostly from the design of the [KZG FFT Encoder Backend](encoding.md#the-kzg-fft-encoder-backend) which generates multireveal proofs in an amortized fashion. ## Trustless Encoding via KZG and Reed-Solomon -ZGDA uses a combination of Reed-Solomon (RS) erasure coding and KZG polynomial commitments to perform trustless encoding. In this section, we provide a high level overview of how the ZGDA encoding module works and how it achieves these properties. +0G DA uses a combination of Reed-Solomon (RS) erasure coding and KZG polynomial commitments to perform trustless encoding. In this section, we provide a high level overview of how the 0G DA encoding module works and how it achieves these properties. ### Basic Reed Solomon Encoding @@ -56,37 +55,37 @@ Basic RS encoding is used to achieve the first requirement of tolerance to adver 1. The blob data is represented as a string of symbols, where each symbol is elements in a certain finite field. The number of symbols is called the `BlobLength` 2. These symbols are interpreted as the coefficients of a `BlobLength`-1 degree polynomial. -3. This polynomial is evaluated at `NumChunks`*`ChunkLength` distinct indices. +3. This polynomial is evaluated at `NumChunks`\*`ChunkLength` distinct indices. 4. Chunks are constructed, where each chunk consists of the polynomial evaluations at `ChunkLength` distinct indices. -Notice that given any number of chunks $M$ such that $M$*`ChunkLength` > `BlobLength`, via [polynomial interpolation](https://en.wikipedia.org/wiki/Polynomial_interpolation) it is possible to reconstruct the original polynomial, and therefore its coefficients which represent the original blob. Thus, this basic RS encoding scheme satisfies the requirement of the `Encoder.Encode` interface. +Notice that given any number of chunks $$M$$ such that $$M^*$$`ChunkLength` > `BlobLength`, via [polynomial interpolation](https://en.wikipedia.org/wiki/Polynomial_interpolation) it is possible to reconstruct the original polynomial, and therefore its coefficients which represent the original blob. Thus, this basic RS encoding scheme satisfies the requirement of the `Encoder.Encode` interface. ### Validation via KZG Without modification, RS encoding has the following important problem: Suppose that a user asks an untrusted disperser to encode data and send it to the nodes. Even if the user is satisfied that each node has received some chunk of data, there is no way to know how the disperser went about constructing those chunks. [KZG polynomial commitments](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) provide a solution to this problem. #### Encoded Chunk Verification -KZG commitments provide three important primitives, for a polynomial $p(X) = \sum_{i}c_iX^i$: + +KZG commitments provide three important primitives, for a polynomial $$p(X) = \sum_{i}c_iX^i$$: + - `commit(p(X))` returns a `Commitment` which is used to identify the polynomial. - `prove(p(X),indices)` returns a `Proof` which can be used to verify that a set of evaluations lies on the polynomial. - `verify(Commitment,Proof,evals,indices)` returns a `bool` indicating whether the committed polynomial evaluates to `evals` and the provided `indices`. #### Blob Size Verification + KZG commitments also can be used to verify the degree of the original polynomial, which in turn corresponds to the size of the encoded blob. -The KZG commitment relies on a structured random string (SRS) containing a generator point $G$ multiplied by all of the powers of some secret field element $\tau$, up to some maximum power $n$. This means that it is not possible to use this SRS to commit to a polynomial of degree greater than $n$. A consequence of this is that if $p(x)$ is a polynomial of degree greater than $m$, it will not be possible to commit to the polynomial $x^{n-m}p(x)$. +The KZG commitment relies on a structured random string (SRS) containing a generator point $$G$$ multiplied by all of the powers of some secret field element $$\tau$$, up to some maximum power $$n$$. This means that it is not possible to use this SRS to commit to a polynomial of degree greater than $$n$$. A consequence of this is that if $$p(x)$$ is a polynomial of degree greater than $$m$$, it will not be possible to commit to the polynomial $$x^{n-m}p(x)$$. -The scheme thus works as follows: If the disperser wishes to claim that the polynomial $p(x)$ is of degree less than or equal to $m$, they must provide along with the commitment $C_1$ to $p$, a commitment $C_2$ to $q(x) = x^{n-m}p(x)$. A verifier can request the disperser to open both polynomials at a random point $y$, verify the values of $p(y)$ and $q(y)$, and then check that $q(y) = y^{n-m}p(y)$. If these checks pass, the verifier knows that 1) $deg(q) = deg(p) + n - m$, 2) the disperser was able to make a commitment to $q$, and so $deg(q) \le n$, and therefore 3), $deg(p) \le m$. In practice, this protocol can be made non-interactive using the Fiat-Shamir heuristic. +The scheme thus works as follows: If the disperser wishes to claim that the polynomial $$p(x)$$ is of degree less than or equal to $$m$$, they must provide along with the commitment $$C_1$$ to $$p$$, a commitment $$C_2$$ to $$q(x) = x^{n-m}p(x)$$. A verifier can request the disperser to open both polynomials at a random point $$y$$, verify the values of $$p(y)$$ and $$q(y)$$, and then check that $$q(y) = y^{n-m}p(y)$$. If these checks pass, the verifier knows that 1) $$deg(q) = deg(p) + n - m$$, 2) the disperser was able to make a commitment to $$q$$, and so $$deg(q) \le n$$, and therefore 3), $$deg(p) \le m$$. In practice, this protocol can be made non-interactive using the Fiat-Shamir heuristic. Note: The blob length verification here allows for the blob length to be upper-bounded; it cannot be used to prove the exact blob length. -## The KZG-FFT Encoder Backend - -A design for an efficient encoding backend that makes use of amortized kzg multi-reveal generation is described [here](../../../design/encoding.md). - ## Validation Actions When a DA node receives a `StoreChunks` request, it performs the following validation actions relative to each blob header: + - It uses `GetOperatorAssignment` of the `AssignmentCoordinator` interface to calculate the chunk indices for which it is responsible and the total number of chunks, `TotalChunks`. - It instantiates an encoder using the `ChunkLength` from the `BlobHeader` and the `TotalChunks`, and uses `VerifyChunks` to verify that the data contained within the chunks lies on the committed polynomial at the correct indices. - The `VerifyChunks` method also verifies that the `Length` contained in the `BlobCommitments` struct is valid based on the `LengthProof`. diff --git a/docs/security/kzg.md b/docs/security/kzg.md new file mode 100644 index 0000000..2f55578 --- /dev/null +++ b/docs/security/kzg.md @@ -0,0 +1,63 @@ +# KZG Encoder Backend + +It is important that the encoding and commitment tasks are able to be performed in seconds and that the dominating complexity of the computation is nearly linear in the degree of the polynomial. This is achieved using algorithms based on the Fast Fourier Transform (FFT) and amortized kzg multi-reveal generation. + +This document describes how the KZG-FFT encoder backend implements the `Encode(data [][]byte, params EncodingParams) (BlobCommitments, []*Chunk, error)` interface, which + +1. transforms the blob into a list of `params.NumChunks` `Chunks`, where each chunk is of length `params.ChunkLength`. +2. produces the associated polynomial commitments and proofs. + +We will also highlight the additional constraints on the Encoding interface which arise from the KZG-FFT encoder backend. + +## Deriving the polynomial coefficients and commitment + +As described in the [Encoding Module Specification](encoding.md), given a blob of data, we convert the blob to a polynomial $$p(X) = \sum_{i=0}^{m-1} c_iX^i$$ by simply slicing the data into a string of symbols, and interpreting this list of symbols as the tuple $$(c_i)_{i=0}^{m-1}$$. + +In the case of the KZG-FFT encoder, the polynomial lives on the field associated with the BN-254 elliptic curve, which as order \[TODO: fill in order]. + +Given this polynomial representation, the KZG commitment can be calculated as in [KZG polynomial commitments](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html). + +## Polynomial Evaluation with the FFT + +In order to use a Discrete Fourier Transform (DFT) to evaluate a polynomial, the indices of the polynomial evaluations which will make up the Chunks must be members of a cyclic group, which we will call $$S$$. A cyclic group is the group generated by taking all of the integer powers of some generator $$v$$, i.e., $${v^k | k \in \mathbb{Z} }$$ (For this reason, the elements of a cyclic group $$S$$ of order $$|S|=m$$ will sometimes be referred to as the $$|m|$$’th roots of unity). Notice that since our polynomial lives on the BN254 field, the group $$S$$ must be a subgroup of that field (i.e. all if its elements must lie within that field). + +Given a cyclic group $$S$$ of order $$m$$, we can evaluate a polynomial $$p(X)$$ of order $$n$$ at the indices contained in $$S$$ via the DFT, + +$$ +p_k = \sum_{i=1}^{n}c_i (v^k)^i +$$ + +where $$p_k$$ gives the evaluation of the polynomial at $$v^k \in S$$. Letting $$c$$ denote the vector of polynomial coefficients and $$p$$ the vector of polynomial evaluations, we can use the shorthand $$p = DFT[c]$$. The inverse relation also holds, i.e., $$c = DFT^{-1}[p]$$. + +To evaluate the DFT programmatically, we want $$m = n$$. Notice that we can achieve this when $$m > n$$ by simply padding $$c$$ with zeros to be of length $$m$$. + +The use of the FFT can levy an additional requirement on the size of the group $$S$$. In our implementation, we require the size of $$S$$ to be a power of $$\mathsf{2}$$. For this, we can make use of the fact that the prime field associated with BN-254 contains a subgroup of order $$2^{28}$$, which in turn contains subgroups of orders spanning every power of 2 less than $$2^{28}$$. + +As the encoding interface calls for the construction of $$\mathsf{NumChunks}$$ Chunks of length $$\mathsf{ChunkLength}$$, our application requires that $$S$$ be of size $$\mathsf{NumChunks}\times \mathsf{ChunkLength}$$, which in turn must be a power of $$\mathsf{2}$$. + +## Amortized Multireveal Proof Generation with the FFT + +The construction of the multireveal proofs can also be performed using a DFT (as in ["Fast Amortized Kate Proofs"](https://eprint.iacr.org/2023/033.pdf)). Leaving the full details of this process to the referenced document, we describe here only 1) the index-assignment the scheme used by the amortized multiproof generation approach and 2) the constraints that this creates for the overall encoder interface. + +Given the group $$S$$ corresponding to the indices of the polynomial evaluations and a cyclic group $$C$$ which is a subgroup of $$S$$, the cosets of $$C$$ in $$S$$ are given by + +$$ +s+C = {g+c : c \in C} \text{ for } s \in S. +$$ + +Each coset $$s+C$$ has size $$|C|$$, and there are $$|S|/|C|$$ unique and disjoint cosets. + +Given a polynomial $$p(X)$$ and the groups $$S$$ and $$C$$, the Amortized Kate Proofs approach generates $$|S|/|C|$$ different KZG multi-reveal proofs, where each proof is associated with the evaluation of $$p(X)$$ at the indices contained in a single coset $$sC$$ for $$s \in S$$. Because the Amortized Kate Proofs approach uses the FFT under the hood, $$C$$ itself must have an order which is a power of $$\mathsf{2}$$. + +For the purposes of the KZG-FFT encoder, this means that we must choose $$S$$ to be of size $$\mathsf{NumChunks}\times \mathsf{ChunkLength}$$ and $$C$$ to be of size $$\mathsf{ChunkLength}$$, each of which must be powers of $$\mathsf{2}$$. + +## Worked Example + +As a simple illustrative example, suppose that `AssignmentCoordinator` provides the following parameters in order to meet the security requirements of given blob: + +* $$\mathsf{ChunkLength = 3}$$ +* $$\mathsf{NumChunks = 4}$$ + +Supplied with these parameters, `Encoder.GetEncodingParams` will upgrade $$\mathsf{ChunkLength}$$ to the next highest power of $$\mathsf{2}$$, i.e., $$\mathsf{ChunkLength = 4}$$, and leave $$\mathsf{NumChunks}$$ unchanged. The following figure illustrates how the indices will be assigned across the chunks in this scenario. + +

Worked example of chunk indices for ChunkLength=4, NumChunks=4

diff --git a/docs/spec/architecture.md b/docs/spec/architecture.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/spec/components/indexer.md b/docs/spec/components/indexer.md deleted file mode 100644 index 9b19d99..0000000 --- a/docs/spec/components/indexer.md +++ /dev/null @@ -1,275 +0,0 @@ - -# Indexer - -## Base Indexer - -### Description - -The indexer has the function of maintaining accumulators based on events. - -An accumulator consists of an object, an event filter, and a mutator. Whenever an event matching the filter is received, the event is fed to the mutator, which updates the object (possibly making calls to the current smart contract state). We can configure how much history of the accumulator to store. - -An accumulator can optionally define a custom method for initializing the accumulator from state from an intermediate checkpoint. This includes methods such as pulling state from a smart contract or getting calldata associated with a particular transaction. - -The indexer is one of the only stateful components of the operator. To avoid reindexing on restarts, the state of the indexer is stored in a database. We will use a schemaless db to avoid migrations. - -The indexer must also support reorg resistance. We can achieve simple reorg resilience in the following way: -- For every accumulator, we make sure to store history long enough that we always have access to a finalized state. -- In the event reorg is detected, we can revert to the most recent finalized state, and then reindex to head. - -The indexer needs to accommodate upgrades to the smart contract interfaces. Contract upgrades can have the following effects on interfaces: -- Addition, removal, modification of events -- Addition, removal, modification of state variables - -The indexer has native support for "forking" to support upgrades to contract interfaces. A fork consists of the following: -- A forking condition -- A new set of accumulator implementations; each accumulator implements a fork method which may implement some update - -For each accumulator, the indexer exposes an interface, which can be queried by block number (or perhaps other fields). The returned response includes the accumulator object as well as the fork value. - -### Spec - - -```go - -type Indexer struct{ - Accumulators []*Accumulator - HeaderService *HeaderService - HeaderStore *HeaderStore - UpgradeForkWatcher *UpgradeForkWatcher -} - - -const maxUint := ^uint(0) -const maxSyncBlocks = 10 - -func (i Indexer) Index(){ - - // Find the latest block that we can fast forward to. - - clientLatestHeader := i.HeaderService.PullLatestHeader(true) - - syncFromBlock := maxUint - - for _, acc := range i.Accumulators{ - bn := acc.GetSyncPoint(clientLatestHeader) - if syncFromBlock > bn{ - syncFromBlock = bn - } - } - - bn := i.UpgradeForkWatcher.GetLatestUpgrade(clientLatestHeader) - if syncFromBlock > bn{ - syncFromBlock = bn - } - - myLatestHeader := i.HeaderService.GetLatestHeader(true) - - // TODO: Also if there are no headers synced - // Fast forward if it's too many blocks to catch up - if syncFromBlock - myLatestHeader.Number > maxSyncBlocks { - - // This probably just wipes the HeaderStore clean - i.HeaderStore.FastForward() - - for _, acc := range i.Accumulators{ - acc.SetSyncPoint(clientLatestHeader) - } - } - - - go func(){ - for { - headers, _ := i.HeaderService.PullNewHeaders() - - headers := i.UpgradeForkWatcher.DetectUpgrade(headers) - - newHeaders, _ := i.HeaderStore.AddHeaders(headers) - - for _, acc := range i.Accumulators{ - i.HandleAccumulator(acc,newHeaders) - } - } - } -} - -func (i Indexer) HandleAccumulator(acc Accumulator, headers []Headers){ - - // Handle fast mode - header, object, headers, err := acc.HandleFastMode(headers) - if object != nil{ - i.HeaderStore.AttachObject(header, object) - } - - // Get the starting accumulator object - object := i.HeaderStore.GetLatestObject(acc) - - // Process headers - object, headers := acc.ProcessHeaders(object, headers) - - // Register these accumulator objects - for ind = range objects{ - i.HeaderStore.AttachObject(headers[i], acc, objects[i]) - } - -} - -type UpgradeFork struct { - name string -} - -type Header struct { - BlockHash [32]byte - PrevBlockHash [32]byte - Number uint64 - Finalized bool - CurrentFork *UpgradeFork - IsUpgrade bool -} - - -// UpgradeForkWatcher is a component that is used to scan a list of headers for an upgrade. Future upgrades may be based on a condition; past upgrades should have a block number configuration provided. -type UpgradeForkWatcher() interface{ - - // DetectUpgrade takes in a list of headers and sets the CurrentFork and IsUpgrade fields - DetectUpgrade(headers []Header) []Header - -} - -// HeaderStore is a stateful component that maintains a chain of headers and their finalization status. -type HeaderStore interface{ - - // Addheaders finds the header It then crawls along this list of headers until it finds the point of divergence with its existing chain. All new headers from this point of divergence onward are returned. - AddHeaders(headers []Headers) ([]Header, error) - - // GetLatestHeader returns the most recent header that the HeaderService has previously pulled - GetLatestHeader(finalized bool) - - // AttachObject takes an accumulator object and attaches it to a header so that it can be retrieved using GetObject - AttachObject(header Header, acc Accumulator, object AccumulatorObject) error - - // GetObject takes in a header and retrieves the accumulator object attached to the latest header prior to the supplied header having the requested object type. - GetObject(header Header, acc Accumulator) (AccumulatorObject, Header, error) - - // GetObject retrieves the accumulator object attached to the latest header having the requested object type. - GetLatestObject(acc Accumulator) (AccumulatorObject, Header, error) - -} - -// HeaderService -type HeaderService interface{ - - // GetHeaders returns a list of new headers since the indicated header. PullNewHeaders automatically handles batching and waiting for a specified period if it is already at head. - PullNewHeaders(lastHeader Header) ([]Header, error) - - // PullLatestHeader gets the latest header from the chain client - PullLatestHeader(finalized bool) - -} - -type AccumulatorObject interface{ - -} - -type Accumulator interface{ - - // IndexHeaders accepts a list of incoming headers. Will throw an error is the accumulator does not have an existing header which can form a chain with the incoming headers. The Accumulator will discard any orphaned headers. - ProcessHeaders(headers []Headers) error - - // GetAccumulator accepts a header and returns the value of the accumulator at that header. Either the Number or BlockHash fields of the header can be used. - GetAccumulator(header Header) (interface{},UpgradeFork,error) - - // GetAccumulators extends GetAccumulator to multiple blocks - GetAccumulators(header Header) (interface{},UpgradeFork,error) - - // GetSyncPoint determines the blockNumber at which it needs to start syncing from based on both 1) its ability to full its entire state from the chain and 2) its indexing duration requirements. - GetSyncPoint(latestHeader Header) (uint64,error) - - // SetSyncPoint sets the Accumulator to operate in fast mode. - SetSyncPoint(latestHeader Header) (error) - - // HandleFastMode handles the fast mode operation of the accumulator. In this mode, it will ignore all headers until it reaching the blockNumber associated with GetSyncPoint. Upon reaching this blockNumber, it will pull its entire state from the chain and then proceed with normal syncing. - HandleFastMode(latestHeader Header) (header, *AccumulatorObject, []header, error) - -} - -``` - -Reference accumulator implementation: - -```go - -type StateAccumulator struct{ - - HistoryLength uint64 - IsFastMode bool - EndFastModeBlockNumber uint64 -} - -type StateObject interface{ - -} - -type StateObjectV1 struct{ - -} - -func (a *StateAccumulator) GetSyncPoint(latestHeader Header) uint64{ - return latestHeader.Number - a.HistoryLength -} - -func (a *StateAccumulator) SetSyncPoint(latestHeader Header) error{ - a.EndFastModeBlockNumber = a.GetSyncPoint(latestHeader) - a.IsFastMode = true -} - -func (a *StateAccumulator) HandleFastMode(latestHeader Header) ([]header, *AccumulatorObject, error){ - - // Do fastMode processing - if a.IsFastMode{ - - for ind, header := range headers{ - - if header.Number >= a.EndFastModeBlockNumber{ - object, err := a.InitializeStateObject(header) - - a.IsFastMode = false - - break - } - } - headers = headers[ind+1:] - } - return headers, nil - -} - - -func (a *StateAccumulator) InitializeStateObject(header Header) (StateObject,error) { -} - -func (a *StateAccumulator) UpdateStateObject() (StateObject,error) { -} - -func (a *StateAccumulator) ProcessHeaders(headers []Headers){ -} - - -func (a *StateAccumulator) GetAccumulator(header Header) (interface{},UpgradeFork,error){ -} - -func GetAccumulators(header Header) (interface{},UpgradeFork,error){ - -} - - - - -``` - - -## DA Indexer - -The indexer keeps track of the [state variables](./contracts.md#bls-registry) from the `BLSRegistry` contract. - - diff --git a/docs/spec/components/node-encoding.md b/docs/spec/components/node-encoding.md deleted file mode 100644 index d6e2e02..0000000 --- a/docs/spec/components/node-encoding.md +++ /dev/null @@ -1,16 +0,0 @@ - -# Blob Encoding Constraints - -The DA nodes expect for blobs to correspond to evaluations of a polynomial of a certain degree. The blob payload delivered to the node contains a KZG polynomial commitment identifying the polynomial, as well as a separate commitment allowing the node to verify its degree. The payload also contains KZG reveal proofs allowing the node to verify that its received data corresponds to evaluations of the polynomial at a specific evaluation index. This document describes in detail how the node performs all verifications, including calculating the evaluation indices. - -Based on the `referenceBlockNumber` contained in the [`DataStoreHeader`](./types/node-types.md#datastoreheader) structure, the DA node construct a [`StateView`](./types/node-types.md#stateview) object using the [Indexer](./node.md#indexer) service. - -The operator node will then perform the following checks for each quorum they are a part of to ensure that the `StoreChunksRequest` is valid: -1. Confirm Header Consistency: - - Generate the encoding params `numPar` and `numSys` (from `AdversaryThresholdBPs`, `QuorumThresholdBPs` and `stateView`) - - Check that `degree` properly derives from `origDataSize` and `numSys` -2. Confirm Degree of KZG Commitment: Use the `lowDegreeProof` to verify that `kzgCommitment` commits to a polynomial of degree less than or equal to `numSysE`*`degreeE`. -3. Verify frame for the quorum against KZG Commitment: Use the `headerHash` to determine the proper indices for the chunks held by the operator, and then use the multireveal proofs contained in the chunks to verify each chunk against `kzgCommitment` commit. - -Indices are determined using the following formula: - diff --git a/docs/spec/components/node.md b/docs/spec/components/node.md deleted file mode 100644 index ccd1ed2..0000000 --- a/docs/spec/components/node.md +++ /dev/null @@ -1,46 +0,0 @@ - -# DA Node - -The DA node has responsibilities in both the storage protocol and the retrieval protocol. - -``` -type Service interface{ - StoreChunks(ctx context.Context, in *StoreChunksRequest) (*StoreChunksReply, error) -} -``` - -## RPC Interface - -The `StoreChunks` method is used for sending encoded chunks to the node. - -- method: `StoreChunks` -- params: - - paymentsRoot: bytes - - payments: repeated bytes - - headerRoot: bytes - - header: [`DataStoreHeader`](./types/node-types.md#datastoreheader) - - chunks: repeated bytes -- returns: - - signature: bytes - - -When the `StoreChunks` method is called, the node performs the following checks: -1. Check that all payments are correct (See [Payment Constraints](./node-payments.md)). -2. Check that its own chunks are correct (See [Blob Encoding Constraints](./node-encoding.md)) - -Provided that both checks are successful, the node will sign the concatenation of the paymentRoot and blobRoot using the BLS key registered with the `BLSRegistry` and then return the signature. - - - -## Adapters - -### Indexer Adapter - -The DA Node utilizes an adapter on top of the [Indexer](./indexer.md) interface which provides a view of the registration status and delegated stake for each operator at a given block number. The relevant structs are [Registrant](./types/node-types.md#registrant), [TotalStake](./types/node-types.md#totalstake), [TotalOperator](./types/node-types.md#totaloperator), [RegistrantView](./types/node-types.md#registrantview), and [StateView](./types/node-types.md#stateview). - -```go - -type IndexerAdapter interface{ - GetStateView(ctx context.Context, blockNumber uint32) (*StateView, error) -} -``` diff --git a/docs/spec/data-model.md b/docs/spec/data-model.md deleted file mode 100644 index 620eba5..0000000 --- a/docs/spec/data-model.md +++ /dev/null @@ -1,130 +0,0 @@ -# Data Model - -### Quorum Information - -```go -// QuorumID is a unique identifier for a quorum; initially ZGDA will support up to 256 quorums -type QuorumID = uint8 - -// SecurityParam contains the quorum ID and the adversary threshold for the quorum; -type SecurityParam struct { - QuorumID QuorumID - // AdversaryThreshold is the maximum amount of stake that can be controlled by an adversary in the quorum as a percentage of the total stake in the quorum - AdversaryThreshold uint8 - // QuorumThreshold is the amount of stake that must sign a message for it to be considered valid as a percentage of the total stake in the quorum - QuorumThreshold uint8 `json:"quorum_threshold"` -} - -// QuorumResult contains the quorum ID and the amount signed for the quorum -type QuorumResult struct { - QuorumID QuorumID - // PercentSigned is percentage of the total stake for the quorum that signed for a particular batch. - PercentSigned uint8 -} -``` - -### Blob Requests - -```go -// BlobHeader contains the original data size of a blob and the security required -type BlobRequestHeader struct { - // BlobSize is the size of the original data in bytes - BlobSize uint32 - // For a blob to be accepted by ZGDA, it satisfies the AdversaryThreshold of each quorum contained in SecurityParams - SecurityParams []SecurityParam -} -``` - -### Data Headers - -```go -type BlobHeader struct { - BlobCommitments - // QuorumInfos contains the quorum specific parameters for the blob - QuorumInfos []*BlobQuorumInfo -} - -// BlobQuorumInfo contains the quorum IDs and parameters for a blob specific to a given quorum -type BlobQuorumInfo struct { - SecurityParam - // ChunkLength is the number of symbols in a chunk - ChunkLength uint -} - -// BlomCommitments contains the blob's commitment, degree proof, and the actual degree. -type BlobCommitments struct { - Commitment *Commitment - LengthProof *Commitment - Length uint -} - -// BatchHeader contains the metadata associated with a Batch for which DA nodes must attest; DA nodes sign on the hash of the batch header -type BatchHeader struct { - // BlobHeaders contains the headers of the blobs in the batch - BlobHeaders []*BlobHeader - // QuorumResults contains the quorum parameters for each quorum that must sign the batch; all quorum parameters must be satisfied - // for the batch to be considered valid - QuorumResults []QuorumResult - // ReferenceBlockNumber is the block number at which all operator information (stakes, indexes, etc.) is taken from - ReferenceBlockNumber uint - // BatchRoot is the root of a Merkle tree whose leaves are the hashes of the blobs in the batch - BatchRoot [32]byte -} -``` - -### Encoded Data Products - -```go -// EncodedBatch is a container for a batch of blobs. DA nodes receive and attest to the blobs in a batch together to amortize signature verification costs -type EncodedBatch struct { - ChunkBatches map[OperatorID]ChunkBatch -} - -// Chunks - -// Chunk is the smallest unit that is distributed to DA nodes, including both data and the associated polynomial opening proofs. -// A chunk corresponds to a set of evaluations of the global polynomial whose coefficients are used to construct the blob Commitment. -type Chunk struct { - // The Coeffs field contains the coefficients of the polynomial which interpolates these evaluations. This is the same as the - // interpolating polynomial, I(X), used in the KZG multi-reveal (https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html#multiproofs) - Coeffs []Symbol - Proof Proof -} - -func (c *Chunk) Length() int { - return len(c.Coeffs) -} - -// ChunkBatch is the collection of chunks associated with a single operator and a single batch. -type ChunkBatch struct { - // Bundles contains the chunks associated with each blob in the batch; each bundle contains the chunks associated with a single blob - // The number of bundles should be equal to the total number of blobs in the batch. The number of chunks per bundle will vary - Bundles [][]*Chunk -} -``` - -### DA Node State - -```go -type StakeAmount *big.Int - -// OperatorInfo contains information about an operator which is stored on the blockchain state, -// corresponding to a particular quorum -type OperatorInfo struct { - // Stake is the amount of stake held by the operator in the quorum - Stake StakeAmount - // Index is the index of the operator within the quorum - Index OperatorIndex -} - -// OperatorState contains information about the current state of operators which is stored in the blockchain state -type OperatorState struct { - // Operators is a map from quorum ID to a map from the operators in that quorum to their StoredOperatorInfo. Membership - // in the map implies membership in the quorum. - Operators map[QuorumID]map[OperatorID]*OperatorInfo - // Totals is a map from quorum ID to the total stake (Stake) and total count (Index) of all operators in that quorum - Totals map[QuorumID]*OperatorInfo - // BlockNumber is the block number at which this state was retrieved - BlockNumber uint -} -``` diff --git a/docs/spec/definitions.md b/docs/spec/definitions.md deleted file mode 100644 index 9305cf3..0000000 --- a/docs/spec/definitions.md +++ /dev/null @@ -1,22 +0,0 @@ -# Definitions - - -## Data Packaging - -**Blob**. Blobs are the fundamental unit of data posted to ZGDA by users. - -**Batch**. - -## System Components - -**DA Node**. The DA Node is an off-chain component which is run by an EigenLayer operator. ZGDA operators are responsible for accepting data from the disperser, certifying its availability, and following a protocol for distributing the data to registered retrievers. It is assumed that honest DA nodes are delegated a threshold proportion of the stake from EigenLayer restakers, where this threshold may be defined per DA end-user. - -**Disperser**. The Disperser is an off-chain component which is responsible for packaging data blobs in a specific way, distributing their data among the DA nodes, aggregating certifications from the nodes, and then pushing the aggregated certificate to the chain. The disperser is an untrusted system component. - -**Retriever**. The Retriever is an off-chain component which implements a protocol for receiving data blobs from the set of DA nodes. - -**Smart contracts**. The smart contracts track the amount of EigenLayer stake held by each operator, and allow for DA certifications to be verified on-chain and consumed by downstream applications such as rollup smart contracts. - -## Staking Concepts - -**Quorum** diff --git a/docs/spec/flows/dispersal.md b/docs/spec/flows/dispersal.md deleted file mode 100644 index 159eead..0000000 --- a/docs/spec/flows/dispersal.md +++ /dev/null @@ -1,8 +0,0 @@ - -# Dispersal - -Data is made available on ZGDA through the following flow: -1. The [Disperser](./disperer.md) encodes the data in accordance with the [storage module](./protocol-modules/storage/overview.md) requirements, constructs the appropriate header, and sends the chunks to the DA nodes. -2. Upon receiving signatures from the DA nodes, the disperser aggregates these signatures. -3. Next, the disperser sends the aggregated signatures and header to the `confirmBatch` method of the `ServiceManager` -4. Once retrievers see the confirmed Batch on chain, they can request to download the associated chunks from a set of DA nodes, in accordance with the [retrieval module](./protocol-modules/retrieval/retrieval.md) of the protocol. diff --git a/docs/spec/integrations/disperser.md b/docs/spec/integrations/disperser.md deleted file mode 100644 index 0768e97..0000000 --- a/docs/spec/integrations/disperser.md +++ /dev/null @@ -1,48 +0,0 @@ -# Disperser - -## Requests to Store Data - -Requesters that want to store data on ZGDA (mostly rollups) make requests to the disperser with the form of [`BlobStoreRequest`](./types.md#blobstorerequest). - -They specify the data they want to store on ZGDA and the different assumptions they are making on the quorums that they want to store their data. Requesters also attach a unique `BlobID` used to identify their blob later in the protocol. This is randomly generated and the disperser will fail the request if it has seen the given `BlobID` before. The disperser takes each `BlobStoreRequest` and adds it to a queue. - -## Dispersal - -### Dequeueing Requests - -Every 30 seconds (configurable), the disperser takes all of the `BlobStoreRequest`s out of its queue, converts each `BlobStoreRequest`'s data into a polynomial [TODO: links @gpsanant @mooselumph], and "concatenates" the polynomials with each other using degree shifts. - -In pseudocode: -```go -func DataToPoly(data []byte) ([]fr.Element) { - poly := make([]fr.Element, 0) - for i := 0; i <= len(data)/31; i++ { - poly = append(poly, new(fr.Element).FromBytes(data[31*i:min(31*(i+1), len(data))])) - } - return poly -} - -func BlobStoreRequestsToPoly(blobStoreRequests []BlobStoreRequest) ([]fr.Element, [][32]byte, []uint32) { - blobIDs := make([][32]byte, 0) - blobDataStartDegrees := make([]uint32, 0) - overallPoly := make([]fr.Element, 0) - for i := 0; i < len(blobStoreRequests); i++ { - poly := DataToPoly(blobStoreRequests[i].Data) - blobIDs = append(blobIDs, blobStoreRequests[i].BlobIDs) - blobDataStartDegrees = append(blobDataStartDegrees, len(overallPoly)) - overallPoly = append(overallPoly, poly...) - } - return overallPoly, blobIDs, blobDataStartDegrees -} -``` -The disperser returns to each requester the KZG commitment to the `overallPoly` that their data was included in, its start and end degrees, and the corresponding [DataStoreHeader](../spec/types/node-types.md#datastoreheader) that the blob was included in. - -### Encoding - -The disperser encodes the `overallPoly` for each quorum among all of the `BlobStoreRequests`. The disperser generates its encoding parameters for each quorum relative to the highest `AdversaryThresholdBPs` and highest `QuorumThresholdBPs` for each quorum among all of the `BlobStoreRequests`. - -[TODO: @bxue-l2] - -### Aggregation - -## Confirmation diff --git a/docs/spec/integrations/rollups.md b/docs/spec/integrations/rollups.md deleted file mode 100644 index 00d9c2b..0000000 --- a/docs/spec/integrations/rollups.md +++ /dev/null @@ -1,63 +0,0 @@ -# Rollups - -## Deciding Trust Assumption - -Rollups need to define the quorums they want to sign off on the availability of their data and their trust assumptions on each of those quorums. The rollups need to define: - -1. `AdversaryThresholdBPs`. This is the maximum ratio (in basis points) that can be adversarial in the quorum. -2. `QuorumThresholdBPs`. This is the minimum ratio (in basis points) that can need to sign on the availability of the rollups data for the rollup's contracts to consider the data available. - -## Requests to Store Data - -When the rollup has data that they want to make available, they construct a request to the disperser of the form [`BlobStoreRequest`](./types.md#blobstorerequest) and receive a response of the form [`BlobStoreResponse`](./types.md#blobstoreresponse). - -This flow is detailed [here](./disperser.md#requests-to-store-data). - -## Optimistic Rollups - -### State Claims - -When making state claims, validators of the optimistic rollup should resubmit the header of the dataStore (or load dataStore's quorum params from storage [TODO: @gpsanant @Sidu28 fill this out after on chain verification]) and validate their trust assumptions from [Deciding Trust Assumptions](#deciding-trust-assumption). In addition, the start and end degree of the rollup's data taken from the `BlobStoreResponse` received from the disperser. - -### Revealing Data Onchain during Fraud Proofs (Optimistic rollups) - -To keep the interface between EIP-4844 and ZGDA the same, optimistic rollups need to reveal data onchain against the commitment to their own data instead of the concatenated data of all of the `BlobStoreRequests` in the batch. To prove the rollups own data commitment against the batched (concatenated) commitment that was posted onchain in the dataStore header, rollups generate the following proof. - -A challenger retrieves the data corresponding to the KZG commitment pointed to by validators of their rollup and parses their rollup's data from the claimed start and end degree. They then prove to a smart contract the commitment to the rollups data, along with their fraud proof, via the [subcommitment proofs](#subcommitment-proof). Note that the rollup's smart contract will implement the verifier described in the proof. - -[TODO: Explain how the powers of tau are put on chain (use logarithmic adding)] - -## ZK Rollups - -## Subcommitment Proof - -Call $C \in \mathbb{G}_1$ is the commitment to the polynomial $c(x)$ batching the data among many `BlobStoreRequest`s. The retriever then finds the data of a rollup by taking the coefficients between degrees $m$ and $n$. Call the polynomial that corresponds to the rollup's data $b(x)$. In math: - -$$c(x) = f(x) + x^n b(x) + x^m g(x)$$ - -Where $\text{degree}(f(x) < n)$, $\text{degree}(b(x)) < m-n$, and $\text{degree}(g(x)) < \text{degree}(c(x)) - m + 1$ - -Suppose a prover wants to prove the commitment to $b(x)$ to a lightweight verifier given the verifier has knowledge of $C$ and $m, n$. - -The challenger can generate a proof of the commitment to $b(x)$, $B \in \mathbb{G}_1$, by -- Generate a commitment to $f(x)$ and $x^{\text{max degree} - n}f(x)$. Call these $F$ and $L_F$. -- Generate a commitment to $b(x)$ and $x^{\text{max degree} - (m - n)}b(x)$. Call these $B$ and $L_B$. -- Generate a commitment to $g(x)$ and $x^{\text{max degree} - (\text{degree}(c(x)) - m + 1)}g(x)$. Call these $G$ and $L_G$. -- Calculate $\gamma = keccak256(C, F, B, G)$. -- Calculate $\pi_F$, the commitment to $\pi_F(x) = \frac{f(x) - f(\gamma)}{x - \gamma}$ -- Calculate $\pi_B$, the commitment to $\pi_B(x) = \frac{b(x) - b(\gamma)}{x - \gamma}$ -- Calculate $\pi_G$, the commitment to $\pi_G(x) = \frac{g(x) - g(\gamma)}{x - \gamma}$ -- Calculate $\pi_C$, the commitment to $\pi_C(x) = \frac{c(x) - c(\gamma)}{x - \gamma}$ -- Calculate $\beta = keccak256(\gamma, \pi_F, \pi_B, \pi_G, \pi_C)$ -- Calculate $\pi = \pi_F + \beta \pi_B + \beta^2 \pi_G + \beta^3 \pi_C$ - - -The prover then submits to the verifier $F, B, G, L_F, L_B, L_G, \pi, f(\gamma), b(\gamma), g(\gamma), c(\gamma)$ along with $C$ from the dataStore header of the blob in question. The verifier then verifies: - -- $e(F, [x^{\text{max degree} - n}]_2) = e(L_F, [1]_2)$. This verifies the low degreeness of $F$. -- $e(B, [x^{\text{max degree} - (m - n)}]_2) = e(L_B, [1]_2)$. This verifies the low degreeness of $B$. -- $e(G, [x^{\text{max degree} - (\text{degree} - m)}]_2) = e(L_G, [1]_2)$. This verifies the low degreeness of $G$. -- Calculate $\gamma = keccak256(C, F, B, G)$. -- Calculate $\beta = keccak256(\gamma, \pi_F, \pi_B, \pi_G, \pi_C)$ -- $e(F - [f(\gamma)]_1 + \beta(B - [b(\gamma)]_1) + \beta^2(G - [g(\gamma)]_1) + \beta^3(C - [c(\gamma)]_1), [1]_2) = e(\pi, [x-\gamma]_2)$. This verifies a random opening of all of the claimed polynomials at the same x-coordinate. -- $c(\gamma) = f(\gamma) + \gamma^nb(\gamma) + \gamma^mg(\gamma)$. This verifies that the polynomials have the claimed shifted relationship with $c(x)$. diff --git a/docs/spec/integrations/types.md b/docs/spec/integrations/types.md deleted file mode 100644 index 3a43f89..0000000 --- a/docs/spec/integrations/types.md +++ /dev/null @@ -1,23 +0,0 @@ -### `BlobStoreRequest` - -```go -type BlobStoreRequest struct { - BlobID [32]byte - Data []byte - HeaderQuorumParams []struct{ - QuorumID uint8 - AdversaryThresholdBPs uint16 - QuorumThresholdBPs uint16 - } -} -``` - -### `BlobStoreResponse` - -```go -type BlobStoreResponse struct { - BlobID [32]byte - StartDegree uint32 - EndDegree uint32 - DataStoreHeader DataStoreHeader -} \ No newline at end of file diff --git a/docs/spec/introduction.md b/docs/spec/introduction.md deleted file mode 100644 index e640a3b..0000000 --- a/docs/spec/introduction.md +++ /dev/null @@ -1,30 +0,0 @@ -# Introduction - -The ZGDA system is a scalable Data Availability (DA) service that is secured by Ethereum stakers via EigenLayer. In informal terms, DA is a guarantee that a given piece of data is available to anyone who wishes to retrieve it. ZGDA is focused on providing DA with both high security and throughput. - -At a high level, a DA system is one which accepts blobs of data via some interface and then makes them available to retrievers through another interface. - -Two important aspects of a DA system are -1. Security: The security of a DA system constitutes the set of conditions which are sufficient to ensure that all data blobs certified by the system as available are indeed available for honest retrievers to download. -2. Throughput: The throughput of a DA system is the rate at which the system is able to accept blobs of data, typically measured in bytes/second. - -## EigenLayer Quorums - -Most baseline ZGDA security guarantees are derived under a Byzantine model which stipulates that a maximum percentage of validators will behave adversarially at any given moment in time. As an EigenLayer AVS, ZGDA makes use of the validator set represented by validators who have restaked Ether or other staking assets via the EigenLayer platform. Consequently, all constraints on adversarial behavior per the Byzantine modeling approach take the form of a maximum amount of stake which can be held by adversarial agents. - -An important aspect of restaking on EigenLayer is the notion of a quorum. EigenLayer supports restaking of various types of assets, from natively staked Ether and Liquid Staking Tokens (LSTs) to the wrapped assets of other protocols such as Ethereum rollups. Since these different categories of assets can have arbitrary and variable exchange rates, EigenLayer supports the quorum as a means for the users of protocols such as ZGDA to specify the nominal level of security that each staking token is taken to provide. In practice, a quorum is a vector specifying the relative weight of each staking strategy supported by EigenLayer. - -[TODO: Reference EigenLayer SDK quorum documentation] - -## Essential Properties of ZGDA - -### ZGDA Security - -When an end user posts a blob of data to ZGDA, they can specify a list of [security parameters](./data-model.md#quorum-information), each of which consists of a `QuorumID` identifying a particular quorum registered with ZGDA and an `AdversaryThreshold` which specifies the Byzantine adversarial tolerance that the user expects the blobs availability to respect. - -For such a blob accepted by the system (See [Dispersal Flow](./flows/dispersal.md)), ZGDA delivers the following security guarantee: Unless more than an `AdversaryThreshold` of stakers acts adversarially in every quorum associated with the blob, the blob will be available to any honest retriever. How this guarantee is supported is discussed further in [The Modules of Data Availability](./protocol-modules/overview.md) - -### ZGDA Throughput - -[TODO: Complete this section] - diff --git a/docs/spec/overview.md b/docs/spec/overview.md deleted file mode 100644 index 0860cf8..0000000 --- a/docs/spec/overview.md +++ /dev/null @@ -1,18 +0,0 @@ - -# Overview - -1. [Introduction](./introduction.md) -2. [Glossary](./definitions.md) -3. [Data Model](./data-model.md) -4. [Architecture](./architecture.md) -5. Flows - - [Dispersal](./flows/dispersal.md) - - Retrieval - - Payment -6. Protocol Modules - - [Attestation](./protocol-modules/attestation/attestation.md) - - [Storage](./protocol-modules/storage/overview.md) - - [Retrieval](./protocol-modules/retrieval//retrieval.md) - - Payment -7. System Properties - - [Throughput](./throughput.md) \ No newline at end of file diff --git a/docs/spec/protocol-modules/attestation/attestation.md b/docs/spec/protocol-modules/attestation/attestation.md deleted file mode 100644 index c755959..0000000 --- a/docs/spec/protocol-modules/attestation/attestation.md +++ /dev/null @@ -1,56 +0,0 @@ -# Attestation Module - -The attestation module of the ZGDA protocol is implemented by the ZGDA smart contracts which provide the following interfaces: -- A `confirmBatch` method for confirming data store confirmation. -- `register` and `deregister` methods for registering and deregistering DA nodes. - -**Confirmation behavior** -The `confirmBatch` interface upholds the following system properties: -1. Sufficient stake checking: A blob is only accepted on-chain when signatures from operators having sufficient stake on each quorum are presented. -2. Reorg behavior: On chain confirmations behave properly under chain reorgs or forks. -3. Confirmer permissioning: Only permissioned dispersers can confirm blobs. - -**Operator registration guards** -The `register` and `deregister` interfaces uphold the following system properties: -1. DA nodes cannot register if their delegated stake is insufficient. -2. DA nodes cannot deregister if they are still responsible for storing data. - -This document discusses how these properties are achieved by the attestation protocol. - -## Confirmation Behavior - -### Sufficient stake checking - -The [BLSRegistry.sol](../contracts-registry.md) maintains the `pubkeyToStakeHistory` and `pubKeyToIndexHistory` storage variables, which allow for the current stake and index of each operator to be retrieved for an arbitrary block number. These variables are updated whenever DA nodes register or deregister. - -TODO: Describe quorum storage variables. - -Whenever the `confirmBatch` method of the [ServiceMananger.sol](../contracts-service-manager.md) is called, the following checks are used to ensure that sufficient stake is held by the set of signatories. -- Signature verification. The signature of the calculated aggregate public key is verified. -- Quorum threshold check. The total stake of the signing DA nodes is verified to be above the quorum thresholds for each quorum. - -### Reorg behavior - -One aspect of the chain behavior of which the attestation protocol must be aware is that of chain reorganization. The following requirements relate to chain reorganizations: -1. Signed attestations should remain valid under reorgs so that a disperser never needs to resend the data and gather new signatures. -2. If an attestation is reorged out, a disperser should always be able to simply resubmit it after a specific waiting period. -3. Payloads constructed by a disperser and sent to DA nodes should never be rejected due to reorgs. - -These requirements result in the following design choices: -- Chunk allotments should be based on registration state from a finalized block. -- If an attestation is reorged out and if the transaction containing the header of a batch is not present within `BLOCK_STALE_MEASURE` blocks since `referenceBlockNumber` and the block that is `BLOCK_STALE_MEASURE` blocks since `referenceBlockNumber` is finalized, then the disperser should again start a new dispersal with that blob of data. Otherwise, the disperser must not re-submit another transaction containing the header of a batch associated with the same blob of data. -- Payment payloads sent to DA nodes should only take into account finalized attestations. - -The first and second decision satisfies requirements 1 and 2. The three decisions together satisfy requirement 3. - -Whenever the `confirmBatch` method of the [ServiceMananger.sol](../contracts-service-manager.md) is called, the following checks are used to ensure that only finalized registration state is utilized: -- Stake staleness check. The `referenceBlockNumber` is verified to be within `BLOCK_STALE_MEASURE` blocks before the confirmation block.This is to make sure that batches using outdated stakes are not confirmed. It is assured that stakes from within `BLOCK_STALE_MEASURE` blocks before confirmation are valid by delaying removal of stake by `BLOCK_STALE_MEASURE + MAX_DURATION_BLOCKS`. - -### Confirmer Permissioning - -TODO: Specify how confirmer is permissioned - - -## Operator registration guards - -TODO: Describe these guards diff --git a/docs/spec/protocol-modules/overview.md b/docs/spec/protocol-modules/overview.md deleted file mode 100644 index 929759b..0000000 --- a/docs/spec/protocol-modules/overview.md +++ /dev/null @@ -1,23 +0,0 @@ - -# The "Modules" of Data Availability - -The overall security guarantee provided by ZGDA is actually a composite of many smaller guarantees, each with its own intricacies. For the purpose of exposition, in this section we break down the ZGDA protocol into a set of three modules, which divide roughly along the lines of the guarantees for which the modules are responsible. - -## Attestation -The main guarantee supported by the attestation module concerns the on-chain conditions under which a batch is able to be confirmed by the ZGDA smart contracts. In particular, the attestation module is responsible for upholding the following guarantee: -- Sufficient stake checking: A blob is only accepted on-chain when signatures from operators having sufficient stake on each quorum are presented. - -The Attestation module is largely implemented by the ZGDA smart contracts via bookkeeping of stake and associated checks performed at the batch confirmation phase of the [Disperal Flow](../flows/dispersal.md). For more details, see the [Attestation module documentation](./attestation/attestation.md) - -## Storage -The main guarantee supported by the storage module concerns the off-chain conditions which mirror the on-chain conditions of the storage module. In particular, the storage module is responsible for upholding the following guarantee: -- Honest custody of complete blob: When the minimal adversarial threshold assumptions of a blob are met for any quorum, then on-chain acceptance of a blob implies a full blob is held by honest DA nodes of that quorum for the designated period. - -The Storage module is largely implemented by the DA nodes, with an untrusted supporting role by the Disperser. For more details, see the -[Storage module documentation](./storage/overview.md) - -## Retrieval -The main guarantee supported by the retrieval module concerns the retrievability of stored blob data by honest consumers of that data. In particular, the retrieval module is responsible for upholding the following guarantee: -- TODO: Articulate the retrieval guarantee that we support. - -For more details, see the [Retrieval module documentation](./retrieval/retrieval.md) diff --git a/docs/spec/protocol-modules/payment/payment.md b/docs/spec/protocol-modules/payment/payment.md deleted file mode 100644 index 3b14938..0000000 --- a/docs/spec/protocol-modules/payment/payment.md +++ /dev/null @@ -1,16 +0,0 @@ - -## Payment Guarantee - -THIS SECTION IS A DRAFT. - -**Considerations for how payment verification affects indexing requirements** - -- If I need to be able to calculate everyone's payment, then I need to be able to index back to an arbitrarily early state. -- If I only need to be able to calculate my own payment, then I only need to be able to index from my starting point. I can also do accumulation; don't need to store everything. -- If cumulative payments are solidified on chain periodically, then I don't have to index back so far. - -Posting cumulative payments as calldata could be somewhat expensive; we would only want to do this one per period. - -Preliminary decision: We can build the indexer to 1) sync from the last time that cumulative payments were posted, 2) act as an accumulator so that it doesn't have to store old events. Then we can separately design ways to incentivise/enforce periodic posting of cumulative payments on chain. - -What actually needs to be stored in order to calculate payments? All of the staking amounts are in the persistent on-chain state. All that is needed is the sizes of the blobs, payment rates, etc. diff --git a/docs/spec/protocol-modules/retrieval/retrieval.md b/docs/spec/protocol-modules/retrieval/retrieval.md deleted file mode 100644 index 6fb66a5..0000000 --- a/docs/spec/protocol-modules/retrieval/retrieval.md +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/spec/protocol-modules/storage/assignment.md b/docs/spec/protocol-modules/storage/assignment.md deleted file mode 100644 index c43618c..0000000 --- a/docs/spec/protocol-modules/storage/assignment.md +++ /dev/null @@ -1,100 +0,0 @@ - -# Assignment - -The assignment functionality within ZGDA is carried out by the `AssignmentCoordinator`, which is responsible for taking the current OperatorState and the security requirements represented by a given QuorumParam and determining or validating system parameters that will satisfy these security requirements given the OperatorStates. There are two classes of parameters that must be determined or validated: - -1) the chunk indices that will be assigned to each DA node. -2) the length of each chunk (measured in number of symbols). In keeping with the constraint imposed by the Encoding module, all chunks must have the same length, so this parameter is a scalar. - - -## Interface - -The AssignmentCoordinator must implement the following interface, which facilitates with the above tasks: - -```go -type AssignmentCoordinator interface { - - // GetAssignments calculates the full set of node assignments. - GetAssignments(state *OperatorState, blobLength uint, info *BlobQuorumInfo) (map[OperatorID]Assignment, AssignmentInfo, error) - - // GetOperatorAssignment calculates the assignment for a specific DA node - GetOperatorAssignment(state *OperatorState, header *BlobHeader, quorum QuorumID, id OperatorID) (Assignment, AssignmentInfo, error) - - // ValidateChunkLength validates that the chunk length for the given quorum satisfies all protocol requirements - ValidateChunkLength(state *OperatorState, header *BlobHeader, quorum QuorumID) (bool, error) - - // CalculateChunkLength calculates the chunk length for the given quorum that satisfies all protocol requirements - CalculateChunkLength(state *OperatorState, blobLength uint, param *SecurityParam) (uint, error) -} -``` - -## Standard Assignment Security Logic - -The standard assignment coordinator implements a very simple logic for determining the number of chunks per node and the chunk length, which we describe here. More background concerning this design can be found in the [Design Document](../../../design/assignment.md) - - -**Chunk Length**. - -The protocol requires that chunk lengths are sufficiently small that operators with a small proportion of stake are able to receive a quantity of data commensurate with their stake share. For each operator $i$, let $S_i$ signify the amount of stake held by that operator. - -We require that the chunk size $C$ satisfy - -$$ -C \le \text{NextPowerOf2}\left(\frac{B}{\gamma}\max\left(\frac{\min_jS_j}{\sum_jS_j}, \frac{1}{M_\text{max}} \right) \right) -$$ - - -where $\gamma = \beta-\alpha$, with $\alpha$ and $\beta$ as defined in the [Storage Overview](./overview.md). - -This means that as long as an operator has a stake share of at least $1/M_\text{max}$, then the encoded data that they will receive will be within a factor of 2 of their share of stake. Operators with less than $1/M_\text{max}$ of stake will receive no more than a $1/M_\text{max}$ of the encoded data. $M_\text{max}$ represents the maximum number of chunks that the disperser can be required to encode per blob. This limit is included because proving costs scale somewhat super-linearly with the number of chunks. - -In the future, additional constraints on chunk length may be added; for instance, the chunk length may be set in order to maintain a fixed number of chunks per blob across all system states. Currently, the protocol does not mandate a specific value for the chunk length, but will accept the range satisfying the above constraint. The `CalculateChunkLength` function is provided as a convenience function which can be used to find a chunk length satisfying the protocol requirements. - - - -**Index Assignment**. - -For each operator $i$, let $S_i$ signify the amount of stake held by that operator. We want for the number of chunks assigned to operator $i$ to satisfy - -$$ -\frac{\gamma m_i C}{B} \ge \frac{S_i}{\sum_j S_j} -$$ - -Let - -$$ -m_i = \text{ceil}\left(\frac{B S_i}{C\gamma \sum_j S_j}\right)\tag{1} -$$ - -**Correctness**. -Let's show that any sets $U_q$ and $U_a$ satisfying the constraints in the [Acceptance Guarantee](./overview.md#acceptance-guarantee), the data held by the operators $U_q \setminus U_a$ will constitute an entire blob. The amount of data held by these operators is given by - -$$ -\sum_{i \in U_q \setminus U_a} m_i C -$$ - -We have from (1) and from the definitions of $U_q$ and $U_a$ that - -$$ -\sum_{i \in U_q \setminus U_a} m_i C \ge =\frac{B}{\gamma}\sum_{i \in U_q \setminus U_a}\frac{S_i}{\sum_j S_j} = \frac{B}{\gamma}\frac{\sum_{i \in U_q} S_i - \sum_{i \in U_a} S_i}{\sum_jS_j} \ge B \frac{\beta-\alpha}{\gamma} = B \tag{2} -$$ - -Thus, the reconstruction requirement from the [Encoding](./encoding.md) module is satisfied. - -## Validation Actions - -Validation with respect to assignments is performed at different layers of the protocol: - -### DA Nodes - -When the DA node receives a `StoreChunks` request, it performs the following validation actions relative to each blob header: -- It uses the `ValidateChunkLength` to validate that the `ChunkLength` for the blob satisfies the above constraints. -- It uses `GetOperatorAssignment` to calculate the chunk indices for which it is responsible, and verifies that each of the chunks that it has received lies on the polynomial at these indices (see [Encoding validation actions](./encoding.md#validation-actions)) - -This step ensures that each honest node has received the blobs for which it is accountable under the [Standard Assignment Coordinator](#standard-assignment-security-logic). - -Since the DA nodes will allow a range of `ChunkLength` values, as long as they satisfy the constraints of the protocol, it is necessary for there to be consensus on the `ChunkLength` that is in use for a particular blob and quorum. For this reason, the `ChunkLength` is included in the `BlobQuorumParam` which is hashed to create the merkle root contained in the `BatchHeaderHash` signed by the DA nodes. - -### Rollup Smart Contract - -When the rollup confirms its blob against the ZGDA batch, it checks that the `QuorumThreshold` for the blob is greater than the `AdversaryThreshold`. This means that if the `ChunkLength` determined by the disperser is invalid, the batch cannot be confirmed as a sufficient number of nodes will not sign. diff --git a/docs/spec/protocol-modules/storage/overview.md b/docs/spec/protocol-modules/storage/overview.md deleted file mode 100644 index cf6018c..0000000 --- a/docs/spec/protocol-modules/storage/overview.md +++ /dev/null @@ -1,39 +0,0 @@ -# Storage - -## Overview - -Within the modular structure of the ZGDA protocol, when we consider "storage," we are thinking about the following guarantee: - ->> When the minimal adversarial threshold assumptions of a blob are met for any quorum, then on-chain acceptance of a blob implies a full blob is held by honest DA nodes of that quorum for the designated period. - -We can further break this guarantee into two parts: -1. Acceptance guarantee: When a sufficient portion of stake is held by honest DA nodes of a given quorum, then off-chain acceptance implies that a full blob was transferred to the honest DA nodes of that quorum. -2. Storage guarantee: When honest nodes receive data that is accepted on-chain, they will store it for the designated period. - -## Acceptance Guarantee - -Let $\alpha$ denote the maximum proportion of adversarial stake that the system is able to tolerate (such that the actual amount will always be less than or equal to $\alpha$). Likewise, let $\beta$ represent the amount of stake held by the signing operators. - -The acceptance guarantee requires that for any possible group of dishonest operators, we need to be able to reconstruct from its complement. That is for any $U_q \subseteq O$ such that - -$$ \sum_{i \in U_q} S_i \ge \beta \sum_{i \in O}S_i$$ - -and any $U_a \subseteq U_q$ such - -$$ \sum_{i \in U_a} S_i \le \alpha \sum_{i \in O}S_i$$ - -we need to be able to reconstruct from $U_q \setminus U_a$. - -The guarantee is upheld by two smaller modules of encoding and assignment. - -#### Encoding -Encoding is used to take a data blob and transform it into an extended representation consisting of a collection of chunks, such that the original blob can be reconstructed from any sufficiently large group of chunks. This must be done in a verifiable manner so that the agent performing the encoding does not need to be a trusted actor. See [Encoding](./encoding.md) for details and validation actions. - -#### Assignment -The acceptance guarantee is only satisfied when chunks are properly assigned to DA nodes in proportion to the amount of stake held by the DA nodes within the required quorums. See [Assignment](./assignment.md) for details and validation actions. - -## Storage Guarantee - -The storage guarantee derives simply from the conditions under which a node will continue to store a blob which has been accepted. Once an ZGDA node has attested to a batch, it will store it until one of the following conditions is met: -- If there is no finalized confirmation transaction including the header of a batch within `BLOCK_STALE_MEASURE` blocks of the dataStore's `referenceBlockNumber`, the node knows that the dataStore cannot be confirmed on chain, so they prune it from their storage. -- If there is a finalized confirmation, TODO: how long will they store? diff --git a/docs/spec/throughput.md b/docs/spec/throughput.md deleted file mode 100644 index be8558f..0000000 --- a/docs/spec/throughput.md +++ /dev/null @@ -1,45 +0,0 @@ -# ZGDA Throughput Characteristics - -## What is the total throughput of ZGDA? - -Let $S_i$ denote the total stake delegated to an operator $i \in O$, and $n = |O|$ denote the total number of operators. Let $C_i$ be the throughput/bandwidth capacity by the individual operator $i$. - -Recall that the system specifies a security parameter $\alpha$ corresponding to the maximum amount of adversarial stake tolerated. For a given data store with a percentage of a stake signed $\beta > \alpha$, this means that we assume that a percentage $\gamma = \beta-\alpha$ of the total stake is both 1) honest and 2) in possession of their chunk. - -This writeup will assume the use of the (unoptimized) basic assignment scheme specified in the [Assignment Module](./protocol-modules/storage/assignment.md#standard-assignment-security-logic), with the quantization parameter $\rho$. - -This means that for every blob, an operator $i$ is assigned a number of chunks given by - -$$m_i = \text{ceil}\left(\frac{n\rho S_i}{\sum_j S_j}\right) = \text{ceil}\left(n\rho\alpha_i\right),$$ - -where we define $\alpha_i$ to be the fraction of total stake held by $i$. - -Moreover, blobs will be encoded with the reconstruction threshold $m$ (number of chunks needed to reconstruct blob, i.e. number of systematic chunks) satisfying - -$$m \ge n\rho\gamma$$ - -For a given unit of throughput $T$ accepted by the system, a fraction $\eta_i = \frac{T_i}{T} = \frac{m_i}{m}$ must be accepted by operator $i$. Since - -$$T_i = T\frac{m_i}{m} \le C_i$$ - -must hold for all $i \in O$, rearranging we see that - -$$T = \min_{i\in O} C_i \frac{m}{m_i} = \min_{i\in O} \frac{n\rho C_i}{\text{ceil}(n\rho \alpha_i)}\gamma \approx \min_{i\in O} \frac{C_i}{\max(1/n\rho,\alpha_i)}\gamma.\tag{1}$$ - - -## Discussion - -Notice that Eq. (1) implies two dynamics by which the total throughput of ZGDA can increase. With $j \in O$ as operator for which $C_i/\max(1/n\rho,\alpha_i)$ is currently the smallest: - -1. Operator $j$ can increase its capacity. -2. If $\alpha_j > 1/n\rho$, then $\alpha_j$ can decrease either by stakers redelegating from $j$ to some operator with more capacity per stake or by new stakers entering the ecosystem and delegating to such an operator. - -In the next section, we will consider whether we can use these observations to construct a mechanism which incentivizes operators to marginally increase their capacity (when the demand exists) in order to gain new stake/rewards or in order to avoid losing their delegated stake. - -Note that the quantization parameter $\rho$ plays a critical role in capping the system throughput. In particular, it is likely that the throughput will be given by - -$$ -T = n\rho\gamma C_j -$$ - -where $j$ is the smallest operator, in which case reallocations of stake as in 2) will no longer suffice to scale system throughput. Thus, it makes sense to explore approaches for ensuring that $\rho$ can be scaled to prevent smaller operators from bottlenecking the system throughput. For the purposes of this writeup, we will assume that quantization is not a limiting factor. diff --git a/docs/spec/upgrading.md b/docs/spec/upgrading.md deleted file mode 100644 index 52b8e15..0000000 --- a/docs/spec/upgrading.md +++ /dev/null @@ -1,2 +0,0 @@ - -# Upgrading \ No newline at end of file diff --git a/go.mod b/go.mod index 9a76fed..a0a259b 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,6 @@ require ( github.com/urfave/cli v1.22.14 github.com/urfave/cli/v2 v2.25.7 github.com/wealdtech/go-merkletree v1.0.1-0.20230205101955-ec7a95ea11ca - github.com/zero-gravity-labs/zerog-data-avail/api v0.0.0-20240304091756-a470f1aff6ee go.uber.org/automaxprocs v1.5.2 google.golang.org/grpc v1.59.0 ) diff --git a/go.sum b/go.sum index 35a7759..3f41971 100644 --- a/go.sum +++ b/go.sum @@ -807,8 +807,6 @@ github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zero-gravity-labs/zerog-data-avail/api v0.0.0-20240304091756-a470f1aff6ee h1:ARGnYMo3uRB0LTrpi8f4b/6k5c2+qIrHBa0G04FQ1Jo= -github.com/zero-gravity-labs/zerog-data-avail/api v0.0.0-20240304091756-a470f1aff6ee/go.mod h1:FTI1J6kVXOOjvTj/ICJm77hGWHYO5/6WvfAI1uyxAw8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= diff --git a/inabox/AnvilStateGen_README.md b/inabox/AnvilStateGen_README.md index 7c2e966..cb95705 100644 --- a/inabox/AnvilStateGen_README.md +++ b/inabox/AnvilStateGen_README.md @@ -1,9 +1,10 @@ -# Anvil State Generation steps for `N` Operators +# Anvil State Generation steps for N Operators ## Generate Anvil State for 4 Operators for Anvil Chain to run on Kubernetes: 1. Update InitialSupply in the contract to 100000 ether enough for 200 operators [Click here to view the highlighted code on GitHub](https://github.com/0glabs/0g-data-avail/blob/7a16b44b8b06e770e15d372108df2fd220720697/contracts/script/SetUpZGDA.s.sol#L58C38-L58C38) +1. Update InitialSupply in the contract to 100000 ether enough for 200 operators. ```solidity // Define the initial supply as 100000 ether @@ -11,6 +12,7 @@ uint256 initialSupply = 100000 ether; ``` 2. Update InABox testconfig-anvil.yaml with below for 20 Operators for Anvil Chain to run on Kubernetes: + ```yaml environment: name: "staging" @@ -67,11 +69,13 @@ services: ``` 3. Run Anvil with below command in another terminal: + ``` anvil --port 8545 --dump-state opr-state.json ``` Output: + ``` forge script script/SetUpZGDA.s.sol:SetupZGDA --rpc-url http://127.0.0.1:8545 \ --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ @@ -92,7 +96,8 @@ Copy generated states to states directory in this repo [here](https://github.com ``` ## Generate Anvil State for 200 Operators for Anvil Chain to run on Kubernetes: -1. Use Secrets from dir: `inabox/secrets/keys_for_200_operators.zip` + +1. Use Secrets from dir: `inabox/secrets/keys_for_200_operators.zip` 2. Update testconfig-anvil.yaml to below ```yaml @@ -149,4 +154,3 @@ services: ENCODER_ADDRESS: encoder.encoder.svc.cluster.local:34000 USE_GRAPH: false ``` - diff --git a/pkg/encoding/README.md b/pkg/encoding/README.md deleted file mode 100644 index aef8113..0000000 --- a/pkg/encoding/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# encoding - - -- performs Reed Solomon Encoding using elliptic curve points. The library enables KZG multi-proof and reveal in O(n log n) time using FFT, based on FK20 algorithm. - -- is built upon crypto primitive from https://pkg.go.dev/github.com/protolambda/go-kzg - -- accepts arbitrary number of systematic nodes, parity nodes and data size, free of restriction on power of 2 diff --git a/pkg/kzg/README.md b/pkg/kzg/README.md deleted file mode 100644 index ccf8ac2..0000000 --- a/pkg/kzg/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# KZG and FFT utils - -This repo is *super experimental*. - -This is an implementation in Go, initially aimed at chunkification and extension of data, -and building/verifying KZG proofs for the output data. -The KZG proofs, or Kate proofs, are built on top of BLS12-381. - -Part of a low-latency data-availability sampling network prototype for Eth2 Phase 1. -See https://github.com/protolambda/eth2-das - -Code is based on: -- [KZG Data availability code by Dankrad](https://github.com/ethereum/research/tree/master/kzg_data_availability) -- [Verkle and FFT code by Dankrad and Vitalik](https://github.com/ethereum/research/tree/master/verkle) -- [Reed solomon erasure code recovery with FFTs by Vitalik](https://ethresear.ch/t/reed-solomon-erasure-code-recovery-in-n-log-2-n-time-with-ffts/3039) -- [FFT explainer by Vitalik](https://vitalik.ca/general/2019/05/12/fft.html) -- [Kate explainer by Dankrad](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) -- [Kate amortized paper by Dankrad and Dmitry](https://github.com/khovratovich/Kate/blob/master/Kate_amortized.pdf) - -Features: -- (I)FFT on `F_r` -- (I)FFT on `G1` -- Specialized FFT for extension of `F_r` data -- KZG - - commitments - - generate/verify proof for single point - - generate/verify proofs for multiple points - - generate/verify proofs for all points, using FK20 - - generate/verify proofs for ranges (cosets) of points, using FK20 -- Data recovery: given an arbitrary subset of data (at least half), recover the rest -- Optimized for Data-availability usage -- Change Bignum / BLS with build tags. - -## BLS - -Currently supported BLS implementations: Herumi BLS and Kilic BLS (default). - -## Field elements (Fr) - -The BLS curve order is used for the modulo math, different libraries could be used to provide this functionality. -Note: some of these libraries do not have full BLS functionality, only Bignum / uint256. The KZG code will be excluded when compiling with a non-BLS build tag. - -Build tag options: -- (no build tags, default): Use Kilic BLS library. Previously used by `bignum_kilic` build tag. [`kilic/bls12-381`](https://github.com/kilic/bls12-381) -- `-tags bignum_hbls`: use Herumi BLS library. [`herumi/bls-eth-go-binary`](https://github.com/herumi/bls-eth-go-binary/) -- `-tags bignum_hol256`: Use the uint256 code that Geth uses, [`holiman/uint256`](https://github.com/holiman/uint256) -- `-tags bignum_pure`: Use the native Go Bignum implementation. - - -## Benchmarks - -See [`BENCH.md`](./BENCH.md) for benchmarks of FFT, FFT in G1, FFT-extension, zero polynomials, and sample recovery. - -## License - -MIT, see [`LICENSE`](./LICENSE) file. -