From 39aeafa5af61666b25b56b0348c4ac35a4f91022 Mon Sep 17 00:00:00 2001 From: evan-forbes Date: Tue, 3 May 2022 15:55:25 -0500 Subject: [PATCH 1/3] add ADR 008 and point to it in 007 --- .../adr-007-minimal-changes-to-tendermint.md | 237 ++++++++++++++++++ .../adr-008-updating-to-tendermint-v0.35.x.md | 53 ++++ .../img/core-node-relation.jpg | Bin 0 -> 27397 bytes 3 files changed, 290 insertions(+) create mode 100644 docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md create mode 100644 docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md create mode 100644 docs/celestia-architecture/img/core-node-relation.jpg diff --git a/docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md b/docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md new file mode 100644 index 0000000000..e71a411440 --- /dev/null +++ b/docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md @@ -0,0 +1,237 @@ +# ADR 007: From Ukraine, with Love + +## Changelog + +- 20-08-2021: Initial Description +- 03-05-2022: Update pointing to ADR 008 + +## Context + +Currently, our fork of tendermint includes changes to how to erasure block data, minor changes to the header to commit +to that data, additions to serve data availability sampling, along with some miscellaneous modification to adhere to the +spec. Instead of incorporating all of these changes into our fork of tendermint, we will only make the strictly +necessary changes and the other services and their code to the new celestia-node repo. Notably, we will also refactor +some of the remaining necessary changes to be more isolated from the rest of the tendermint codebase. Both of these +strategies should significantly streamline pulling updates from upstream, and allow us to iterate faster since most +changes will be isolated to celestia-node. + +Update: many of the changes described below have since been minimized or removed. Please see ADR 008 for a summarized list of changes. Notably, we removed intermediate state roots, adopted two new methods from ABCI++ instead of PreprocessTxs, and are still signing over the PartSetHeader. + +## Decision + +Treat tendermint more as a "black box". + +## Detailed Design + +### Overview + +We keep the bare-minimum changes to tendermint in our fork, celestia-core. Where necessary and possible we augment the +tendermint node in a separate process, via celestia-node, which communicates with the tendermint node via RPC. All data +availability sampling logic, including all Celestia-specific networking logic not already provided by tendermint, is +moved into celestia node: + +![core node relation](./img/core-node-relation.png) + +The detailed design of celestia-node will be defined in the repository itself. + +### Necessary changes to tendermint + +#### Changing the repo import names to celestiaorg + +- Rebrand (https://github.com/celestiaorg/celestia-core/pull/476) + +#### Changes to the README.md other basic things + +- update github templates (https://github.com/celestiaorg/celestia-core/pull/405) +- update README.md (https://github.com/celestiaorg/celestia-core/pull/10) + +#### Adding the extra types of block data + +- Update core data types (https://github.com/celestiaorg/celestia-core/pull/17) + - Create the Message/Messages types + - Proto and the tendermint version + - Create the IntermediateStateRoots type + - Proto and the tendermint version +- Data availability for evidence (https://github.com/celestiaorg/celestia-core/pull/19) + - Add both types to `types.Data` + - Modify proto + - Add `EvidenceData` to `types.Data` + +#### Add the HeaderHash to the Commit + +- Add header hash to commit(https://github.com/celestiaorg/celestia-core/pull/198) + +#### Adding the consts package in types + +#### Remove iavl as a dependency + +- remove iavl as a dependency (https://github.com/celestiaorg/celestia-core/pull/129) + +#### Using the `DataAvailabilityHeader` to calculate the DataHash + +The `DataAvailabilityHeader` struct will be used by celestia-core as well as by the celestia-node. It might make sense +to (eventually) move the struct together with all the DA-related code into a separate repository and go-module. +@Wondertan explored this as part of [#427](https://github.com/celestiaorg/celestia-core/pull/427#issue-674512464). This +way all client implementations can depend on that module without running into circular dependencies. Hence, we only +describe how to hash the block data here: + +- Update core types (https://github.com/celestiaorg/celestia-core/pull/17) + - Replace the `Data.Hash()` with `DAH.Hash()` + - Use DAH to fill DataHash when filling the header + - Fill the DAH when making a block to generate the data hash + +#### Add availableDataOriginalSharesUsed to the header + +- Add availableDataOriginalSharesUsed to the header (https://github.com/celestiaorg/celestia-core/pull/262) + +#### Reap some number of transactions probably using the app or some other mech + +- Enforce a minimum square size (https://github.com/celestiaorg/celestia-core/pull/282) +- Use squares with a width that is a power of two(https://github.com/celestiaorg/celestia-core/pull/331) +- Adopt reamping from the mempool to max square size (https://github.com/celestiaorg/celestia-core/issues/77) +- Proposal: Decide on a mech to pick square size and communicate that to the + app (https://github.com/celestiaorg/celestia-core/issues/454) +- Also see ABCI++ for a less hacky solution + +#### Filling the DAH using share merging and splitting + +- Compute Shares (not merged) (https://github.com/celestiaorg/celestia-core/pull/60) + - part II (not merged) (https://github.com/celestiaorg/celestia-core/pull/63) + - while this was not merged, we will need some function to compute the shares that make up the block data +- Share Splitting (https://github.com/celestiaorg/celestia-core/pull/246) + - Serialize each constituent of block data + - Split into shares + - Txs (contiguous) + - Messages (not contiguous) + - Evidence (contiguous) + - IntermediateStateRoots (contiguous) +- Combine shares into original square +- ExtendBlockData +- Generate nmt root of each row and col +- Use those roots to generate the DataHash +- Share Merging (https://github.com/celestiaorg/celestia-core/pull/261) + - Sort by namespace + - Parse each reserved type + - Parse remaining messages + +#### Add the wrapper around nmt to erasure namespaces + +- Implement rsmt tree wrapper for nmt (https://github.com/celestiaorg/celestia-core/pull/238) + +#### Add PreprocessTxs to ABCI + +- Add PreprocessTxs method to ABCI (https://github.com/celestiaorg/celestia-core/pull/110) +- Add method to ABCI interface +- Create sync and async versions +- Add sync version the the CreateProposalBlock method of BlockExecutor + +#### Fill the DAH while making the block + +- Basic DA functionality (https://github.com/celestiaorg/celestia-core/pull/83) + +#### Only produce blocks on some interval + +- Control block times (https://github.com/tendermint/tendermint/issues/5911) + +#### Stop signing over the PartSetHeader + +- Replace canonical blockID with just a hash in the CononicalVote +- Replace the LastBlockID in the header with just a hash + +#### Optionally remove some unused code + +- Removing misc unsued code (https://github.com/celestiaorg/celestia-core/pull/208) +- Remove docs deployment (https://github.com/celestiaorg/celestia-core/pull/134) +- Start deleting docs (https://github.com/celestiaorg/celestia-core/pull/209) +- Remove tendermint-db in favor of badgerdb (https://github.com/celestiaorg/celestia-core/pull/241) +- Delete blockchain 2 until further notice (https://github.com/celestiaorg/celestia-core/pull/309) +- We don’t need to support using out of process apps + +#### Nice to Haves + +- More efficient hashing (https://github.com/celestiaorg/celestia-core/pull/351) + +We should also take this opportunity to refactor as many additions to tendermint into their own package as possible. +This will hopefully make updating to future versions of tendermint easier. For example, when we fill the data +availability header, instead of using a method on `Block`, it could be handled by a function that takes `types.Data` as +input and returns the DAH, the number of shares used in the square, along with the obligatory error. + +```go +func FillDataAvailabilityHeader(data types.Data) (types.DataAvailabilityHeader, numOrigDataShares, error) +``` + +We could perform a similar treatment to the `splitIntoShares` methods and their helper method `ComputeShares`. Instead +of performing the share splitting logic in those methods, we could keep it in a different package and instead call the +equivalent function to compute the shares. + +Beyond refactoring and some minor additions, we will also have to remove and revert quite a few changes to get to the +minimum desired changes specified above. + +### Changes that will need to be reverted + +#### IPLD Plugin + +- Introduction (https://github.com/celestiaorg/celestia-core/pull/144) +- Initial integration (https://github.com/celestiaorg/celestia-core/pull/152) +- Custom Multihash (https://github.com/celestiaorg/celestia-core/pull/155) +- Puting data during proposal (https://github.com/celestiaorg/celestia-core/pull/178) +- Module name (https://github.com/celestiaorg/celestia-core/pull/151) +- Update rsmt2d (https://github.com/celestiaorg/celestia-core/pull/290) +- Make plugin a package (https://github.com/celestiaorg/celestia-core/pull/294) + +#### Adding DAH to Stuff + +- Adding DAH to Proposal (https://github.com/celestiaorg/celestia-core/pull/248/files) +- Blockmeta (https://github.com/celestiaorg/celestia-core/pull/372) + +#### Embedding DAS + +- GetLeafData (https://github.com/celestiaorg/celestia-core/pull/212) +- RetrieveBlockData (https://github.com/celestiaorg/celestia-core/pull/232) +- ValidateAvailability (https://github.com/celestiaorg/celestia-core/pull/270) +- Prevent double writes to IPFS (https://github.com/celestiaorg/celestia-core/pull/271) +- Stop Pinning (https://github.com/celestiaorg/celestia-core/pull/276) +- Rework IPFS Node (https://github.com/celestiaorg/celestia-core/pull/334) +- Refactor for putting the block (https://github.com/celestiaorg/celestia-core/pull/338) +- Config for IPFS node (https://github.com/celestiaorg/celestia-core/pull/340) +- IPLD Dag instead of CoreAPI (https://github.com/celestiaorg/celestia-core/pull/352) +- Adding the DAG to the blockstore (https://github.com/celestiaorg/celestia-core/pull/356) +- Saving and Loading using IPFS (https://github.com/celestiaorg/celestia-core/pull/374) +- Manual Providing (https://github.com/celestiaorg/celestia-core/pull/375) +- Refactor node provider (https://github.com/celestiaorg/celestia-core/pull/400) +- DAS in light client workaround (https://github.com/celestiaorg/celestia-core/pull/413) + +#### BlockID and PartSetHeader + +- Decouple ParSetHeader from BlockID (https://github.com/celestiaorg/celestia-core/pull/441) +- Stop Signing over the PartSetHeader (https://github.com/celestiaorg/celestia-core/pull/457) +- We still don’t want to sign over the PartSetHeader, but we will not be able to use the same mechanism used in the + linked PR, as that way requires decoupling of the PSH from the BlockID +- Remove PSH from some consensus messages (https://github.com/celestiaorg/celestia-core/pull/479) + +Note: This ADR overrides ADR 005 Decouple BlockID and the PartSetHeader. The PartSetHeader and the BlockID will mostly +remain the same. This will make pulling changes from upstream much easier + +## Status + +Accepted + +## Consequences + +### Positive + +- Pulling changes from upstream is streamlined +- Separation of functionality will help us iterate faster +- Creates a great opportunity for reconsidering past design choices without fully starting from scratch +- Prepare for future designs +- Don’t have to have two p2p stacks in a single repo + +### Negative + +- Perform some computation multiple times +- Running multiple nodes instead of a single node is less convenient for node operators (but only in the case the full + celestia-node wants to participate in the consensus protocol) + +## References + +Tracking Issue #491 \ No newline at end of file diff --git a/docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md b/docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md new file mode 100644 index 0000000000..95773d8eca --- /dev/null +++ b/docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md @@ -0,0 +1,53 @@ +# ADR 008: Updating to tendermint v0.35.x + +## Changelog + +- 03-05-2022: Initial document describing changes to tendermint v0.35.x + +## Context + +Building off of ADR 007, we have further distilled the necessary changes to tendermint and continued to move added logic to other repos. Specifically, we have moved generation of the data hash, efficient construction of the data square, and a message inclusion check to celestia-app via adopting two new methods from ABCI++. This document is to serve as a guide for the remaining changes made on top of tendermint v0.35.4. + +### Changes to tendermint + +#### Misc + +- [update github templates](https://github.com/celestiaorg/celestia-core/pull/405) +- [update README.md](https://github.com/celestiaorg/celestia-core/pull/737/commits/be9039d4e0f5d876ec3d8d4521be3374172d7992) +- [updating to go 1.17](https://github.com/celestiaorg/celestia-core/pull/737/commits/6094b7338082d106f81da987dffa56eb540a675e) +- [adding the consts package](https://github.com/celestiaorg/celestia-core/pull/737/commits/fea8528b0177230b7e75396ae05f7a9b5da23741) + +#### Changing the way the data hash is calculated + +To enable data availability sampling, Celestia uses a proprietary data square format to encode its block data. The data hash is generated from this data square by calculating namespace merkle tree root over each row and column. In the following changes, we implement encoding and decoding of block data to the data square format and tooling to generate the data hash. More details over this design can be found in our (archived but still very useful) [specs repo](https://github.com/celestiaorg/celestia-specs) + +- [Adding the Data Availability Header](https://github.com/celestiaorg/celestia-core/pull/737/commits/116b7af4000920030a373363487ef9a9f084e066) +- [Adding a wrapper for namespaced merkle trees](https://github.com/celestiaorg/celestia-core/pull/737/commits/eee8f352cb6a1687a9f6b470abe28bbd4eb66413) +- [Adding Messages and Evidence to the block data](https://github.com/celestiaorg/celestia-core/pull/737/commits/86df6529a7c0cc1112c34b6bf1b5364aa0518dec) +- [Adding share splitting and merging for block encoding](https://github.com/celestiaorg/celestia-core/pull/737/commits/bf2d8b46c1caf1fed52e7db9bf8aa6a9847d84ab) +- [Modifying MakeBlock to also accept Messages](https://github.com/celestiaorg/celestia-core/pull/737/commits/bb970a417356ab030c934ccd2bd39c9641af45f8) + +#### Adding PrepareProposal and ProcessProposal ABCI methods from ABCI++ + +- [PrepareProposal](https://github.com/celestiaorg/celestia-core/pull/737/commits/07f9a05444db763c44ff81f564e7350ddf57e5a4) +- [ProcessProposal](https://github.com/celestiaorg/celestia-core/pull/737/commits/2c9552db09841f2bbebc1ec34653b2441def9f13) + +more details on how we use these new methods in the app can be found in the [ABCI++ Adoption ADR](https://github.com/celestiaorg/celestia-app/blob/master/docs/architecture/ADR-001-ABCI%2B%2B.md). + +#### Wrapping Malleated Transactions + +Tendermint and the cosmos-sdk were not built to handle malleated transactions (txs that are submitted by the user, but modified by the block producer before being included in a block). While not a final solution, we have resorted to adding the hash of the original transaction (the one that is not modified by the block producer) to the modified one. This allows us to track the transaction in the event system and mempool. + +- [Index malleated Txs](https://github.com/celestiaorg/celestia-core/pull/737/commits/a54e3599a5ef6b2ba8b63f586aed8185a3f59e4d) + +#### Create NMT Inclusion Proofs for Transactions + +Since the block data that is committed over is encoded as a data square and we use namespaced merkle trees to generate the row and column roots of that square, we have to create transaction inclusion proofs also using nmts and a data square. The problem is that the block data isn't stored as a square, so in order to generate the inclusion proofs, we have to regenerate a portion of the square. We do that here. + +- [Create namespace merkle tree inclusion proofs for transactions included in the block](https://github.com/celestiaorg/celestia-core/pull/737/commits/01051aa5fef0693bf3bda801e39c80e5746b9c33) + +#### Adding the DataCommitment RPC endpoint + +This RPC endpoint is used by quantum gravity bridge orchestrators to create a commitment over the block data of a range of blocks. + +- [Adding the DataCommitment RPC endpoint](https://github.com/celestiaorg/celestia-core/pull/737/commits/134eeefb7af41afe760d4adc5b22a9d55e36bc3e) \ No newline at end of file diff --git a/docs/celestia-architecture/img/core-node-relation.jpg b/docs/celestia-architecture/img/core-node-relation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c93640633cf02be18acf18574f61d6250a92b63 GIT binary patch literal 27397 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 Date: Wed, 4 May 2022 07:10:20 -0500 Subject: [PATCH 2/3] fix date Co-authored-by: John Adler --- .../adr-008-updating-to-tendermint-v0.35.x.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md b/docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md index 95773d8eca..276358c418 100644 --- a/docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md +++ b/docs/celestia-architecture/adr-008-updating-to-tendermint-v0.35.x.md @@ -2,7 +2,7 @@ ## Changelog -- 03-05-2022: Initial document describing changes to tendermint v0.35.x +- 2022-05-03: Initial document describing changes to tendermint v0.35.x ## Context From 84eeb6d7fea31927d68552d226309495857cbbcf Mon Sep 17 00:00:00 2001 From: Evan Forbes <42654277+evan-forbes@users.noreply.github.com> Date: Wed, 4 May 2022 07:10:39 -0500 Subject: [PATCH 3/3] fix date Co-authored-by: John Adler --- .../adr-007-minimal-changes-to-tendermint.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md b/docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md index e71a411440..2a7816ffa3 100644 --- a/docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md +++ b/docs/celestia-architecture/adr-007-minimal-changes-to-tendermint.md @@ -2,8 +2,8 @@ ## Changelog -- 20-08-2021: Initial Description -- 03-05-2022: Update pointing to ADR 008 +- 2021-08-20: Initial Description +- 2022-05-03: Update pointing to ADR 008 ## Context