From afb55ada26a193366fdbc5dc20257ea22873ae0a Mon Sep 17 00:00:00 2001 From: nashqueue Date: Tue, 3 Jan 2023 11:43:52 +0100 Subject: [PATCH 1/4] inital draft --- ...eractive-default-rules-for-zero-padding.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md diff --git a/docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md b/docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md new file mode 100644 index 0000000000..399c2a0b3e --- /dev/null +++ b/docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md @@ -0,0 +1,56 @@ +# ADR 012: Non-Interactive Default Rules for Zero Padding + +## Changelog + +- 03.01.12: initial draft + +## Context + +When laying out blobs in the square we create padding to follow the non-interactive default rules. With ADR 009 we decreased padding by aligning the blob in the square to the index of the `MinSquareSize` of the given blob. This is a good improvement but we can do better. + +If you align the blob at an index of one you get zero padding as each blob can follow the next. This would make the hash of each square a subtree root. In a square with n shares, you would always get n subtree roots. But having a blob inclusion proof of size n for large blobs is too much and unfeasible. +Assuming there is a threshold, the number of subtree roots in a proof, where the proof size of a blob is acceptable we can use this threshold to determine the index of the blob in the square. This would give us zero padding for blobs that are smaller than the threshold and non-zero padding for blobs that are larger than the threshold but still smaller than before. + +Let's assume a good threshold assumption is that the number of subtree roots in a blob inclusion proof is acceptable if it is smaller than the `MaxSquareSize`. This would mean that the blobs smaller than the square size can use the index of one to get zero padding. Blobs that are larger than `MaxSquareSize` but smaller than `MaxSquareSize * 2` can use the index of two to get a maximum of 1 padding square. Blobs that are larger than `MaxSquareSize * 2` but smaller than `MaxSquareSize * 4` can use the index of 4 to get a maximum of 2 padding squares and so on. + +The new non-interactive default rules would be: + +Blobs start at an index that is equal to the blob length/`MaxSquareSize` rounded up. If the blob length is smaller than `MaxSquareSize` then the blob starts at index 1. + +`MaxSquareSize` can be changed to another threshold. The smaller the threshold the more padding we will have. + +## Status + +Proposed + +## Consequences + +### Light-Nodes + +The Proof size is bounded by the number of subtree roots in the blob inclusion proof. If the new bound is the `MaxSquareSize` then the worst case for the number of subtree roots in a blob inclusion proof will be `MaxSquareSize`. + +If Light-Nodes can process this proof size without a problem then we can use this bound. If not we can use a smaller bound. The smaller the bound the more padding we will have. + +In addition, we could use PFB inclusion proofs (ADR 11) to reduce the proof size of the blob inclusion proof for Light-Nodes. This would make this change not noticeable to them as they are blob size independent until we need a fraud-proof for a malicious PFB inclusion. This fraud-proof would still be magnitudes smaller than a bad encoding fraud-proof. + +Both cases require 2/3 of the Celestia validators to be malicious. In both cases, the chain would halt and fall back to social consensus. If a Light-Node can process the bad encoding fraud-proof then it can also process the PFB fraud-proof easily. + +### Partial-Nodes + +Partial nodes in this context are Celestia-node light nodes that may download all of the data in the reserved namespace. They check that the data behind the PFB was included in the `DataRoot`, via blob inclusion proofs. + +The sum of the size of all blob inclusion proofs will be larger than the sum of all blob inclusion proofs with the previous non-interactive default rules. + +In the current worst case a Celestia block is full of blobs of size 1, making the total amount of subtree roots that need to be downloaded O(n) where n is the number of shares in a block. With the new non-interactive default rules, the worst case stays the same, but the average case goes up. If the block is filled with blobs that are smaller than the threshold then the partial node will still need to download O(n) subtree roots. + +### Positive + +Most Blocks will have close to zero padding. + +### Negative + +The number of subtree roots to download for Partial-Nodes will increase in the average case. + +### Neutral + +The number of subtree roots to download for Light-Nodes will increase in the average case. This effect can be mitigated by using PFB inclusion proofs. From bed3946505a4eb4ab8ae75df6455c85b3263d0be Mon Sep 17 00:00:00 2001 From: nashqueue Date: Thu, 5 Jan 2023 19:01:51 +0100 Subject: [PATCH 2/4] new pictures and resolving commets + new insight --- ...eractive-default-rules-for-zero-padding.md | 56 ------------ ...eractive-default-rules-for-zero-padding.md | 86 ++++++++++++++++++ .../assets/blob-alignment-comparison.png | Bin 0 -> 34598 bytes .../assets/worst-case-padding-comparison.png | Bin 0 -> 16731 bytes .../worst-case-padding-in-blob-size-range.png | Bin 0 -> 34574 bytes 5 files changed, 86 insertions(+), 56 deletions(-) delete mode 100644 docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md create mode 100644 docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md create mode 100644 docs/architecture/assets/blob-alignment-comparison.png create mode 100644 docs/architecture/assets/worst-case-padding-comparison.png create mode 100644 docs/architecture/assets/worst-case-padding-in-blob-size-range.png diff --git a/docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md b/docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md deleted file mode 100644 index 399c2a0b3e..0000000000 --- a/docs/architecture/adr012-non-interactive-default-rules-for-zero-padding.md +++ /dev/null @@ -1,56 +0,0 @@ -# ADR 012: Non-Interactive Default Rules for Zero Padding - -## Changelog - -- 03.01.12: initial draft - -## Context - -When laying out blobs in the square we create padding to follow the non-interactive default rules. With ADR 009 we decreased padding by aligning the blob in the square to the index of the `MinSquareSize` of the given blob. This is a good improvement but we can do better. - -If you align the blob at an index of one you get zero padding as each blob can follow the next. This would make the hash of each square a subtree root. In a square with n shares, you would always get n subtree roots. But having a blob inclusion proof of size n for large blobs is too much and unfeasible. -Assuming there is a threshold, the number of subtree roots in a proof, where the proof size of a blob is acceptable we can use this threshold to determine the index of the blob in the square. This would give us zero padding for blobs that are smaller than the threshold and non-zero padding for blobs that are larger than the threshold but still smaller than before. - -Let's assume a good threshold assumption is that the number of subtree roots in a blob inclusion proof is acceptable if it is smaller than the `MaxSquareSize`. This would mean that the blobs smaller than the square size can use the index of one to get zero padding. Blobs that are larger than `MaxSquareSize` but smaller than `MaxSquareSize * 2` can use the index of two to get a maximum of 1 padding square. Blobs that are larger than `MaxSquareSize * 2` but smaller than `MaxSquareSize * 4` can use the index of 4 to get a maximum of 2 padding squares and so on. - -The new non-interactive default rules would be: - -Blobs start at an index that is equal to the blob length/`MaxSquareSize` rounded up. If the blob length is smaller than `MaxSquareSize` then the blob starts at index 1. - -`MaxSquareSize` can be changed to another threshold. The smaller the threshold the more padding we will have. - -## Status - -Proposed - -## Consequences - -### Light-Nodes - -The Proof size is bounded by the number of subtree roots in the blob inclusion proof. If the new bound is the `MaxSquareSize` then the worst case for the number of subtree roots in a blob inclusion proof will be `MaxSquareSize`. - -If Light-Nodes can process this proof size without a problem then we can use this bound. If not we can use a smaller bound. The smaller the bound the more padding we will have. - -In addition, we could use PFB inclusion proofs (ADR 11) to reduce the proof size of the blob inclusion proof for Light-Nodes. This would make this change not noticeable to them as they are blob size independent until we need a fraud-proof for a malicious PFB inclusion. This fraud-proof would still be magnitudes smaller than a bad encoding fraud-proof. - -Both cases require 2/3 of the Celestia validators to be malicious. In both cases, the chain would halt and fall back to social consensus. If a Light-Node can process the bad encoding fraud-proof then it can also process the PFB fraud-proof easily. - -### Partial-Nodes - -Partial nodes in this context are Celestia-node light nodes that may download all of the data in the reserved namespace. They check that the data behind the PFB was included in the `DataRoot`, via blob inclusion proofs. - -The sum of the size of all blob inclusion proofs will be larger than the sum of all blob inclusion proofs with the previous non-interactive default rules. - -In the current worst case a Celestia block is full of blobs of size 1, making the total amount of subtree roots that need to be downloaded O(n) where n is the number of shares in a block. With the new non-interactive default rules, the worst case stays the same, but the average case goes up. If the block is filled with blobs that are smaller than the threshold then the partial node will still need to download O(n) subtree roots. - -### Positive - -Most Blocks will have close to zero padding. - -### Negative - -The number of subtree roots to download for Partial-Nodes will increase in the average case. - -### Neutral - -The number of subtree roots to download for Light-Nodes will increase in the average case. This effect can be mitigated by using PFB inclusion proofs. diff --git a/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md b/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md new file mode 100644 index 0000000000..644247ff80 --- /dev/null +++ b/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md @@ -0,0 +1,86 @@ +# ADR 013: Non-Interactive Default Rules for Zero Padding + +## Changelog + +- 03.01.2023: initial draft + +## Context + +When laying out blobs in the square we create padding to follow the non-interactive default rules. With ADR 009 we decreased padding by aligning the blob in the square to the index of the `MinSquareSize` of the given blob. This is a good improvement but we can do better. + +Looking at different ranges of blob sizes we can see that the ratio of blob size to padding is not constant. Insight: **The ratio of blob size to padding is smaller for smaller blobs and larger for larger blobs.** The bigger the ratio the better. + +![Worst Case Padding In Blob Size Range](./assets/worst-case-padding-in-blob-size-range.png) + +This means that you get more padding for fever data in small blobs. This is not ideal as we want to have as little padding as possible. As padding is not being paid for there is no incentive to use larger blobs. + +In the naive approach if you align the blob at an index of one you get zero padding as each blob can follow the next. This would make the hash of each share a subtree root. In a square with n shares, you would always get n subtree roots. But having a blob inclusion proof of size n for large blobs is too much and unfeasible. + +Small blob sizes have the lowest ratio but also small inclusion proofs. Therefore increasing the proof size is not a problem until some threshold. It would increase the ratio of blob size to padding for small blobs which have the worst ratio. + +Assuming there is a threshold, **the number of subtree roots in a proof**, where the proof size of a blob is acceptable, we can use this threshold to determine the index of the blob in the square. This would give us zero padding for blobs that are smaller than the threshold and non-zero padding for blobs that are larger than the threshold but still smaller than before. + +Let's assume a good threshold assumption is that the number of subtree roots in a blob inclusion proof is acceptable if it is smaller than the `MaxSquareSize`. This would mean that the blobs smaller than the square size can use the index of one to get zero padding. Blobs that are larger than `MaxSquareSize` but smaller than `MaxSquareSize * 2` can use the index of two to get a maximum of 1 padding square. Blobs that are larger than `MaxSquareSize * 2` but smaller than `MaxSquareSize * 4` can use the index of 4 to get a maximum of 3 padding shares and so on. + +The new non-interactive default rules would be: + +Blobs start at an index that is equal to the blob length/`MaxSquareSize` rounded up. + +If the blob length is smaller than `MaxSquareSize` then the blob starts at index 1. +`MaxSquareSize` can be changed to another threshold. The smaller the threshold the more padding we will have. + +The Picture below shows the difference between the old and new non-interactive default rules in a square of size 8 and a thereshold of 8. + +![Blob Alignment Comparison](./assets/blob-alignment-comparison.png) + +## Analysis + +### Light-Nodes + +The Proof size is bounded by the number of subtree roots in the blob inclusion proof. If the new bound is the `MaxSquareSize` then the worst case for the number of subtree roots in a blob inclusion proof will be `MaxSquareSize`. + +If Light-Nodes can process this proof size without a problem then we can use this bound. If not we can use a smaller bound. The smaller the bound the more padding we will have. + +In addition, we could use PFB inclusion proofs (ADR 11) to reduce the proof size of the blob inclusion proof for Light-Nodes. This would make this change not noticeable to them as they are blob size independent until we need a fraud-proof for a malicious PFB inclusion. + +This fraud-proof would still be magnitudes smaller than a bad encoding fraud-proof. Both cases require 2/3 of the Celestia validators to be malicious. In both cases, the chain would halt and fall back to social consensus. If a Light-Node can process the bad encoding fraud-proof then it can also process the PFB fraud-proof easily. + +### Partial-Nodes + +Partial nodes in this context are Celestia-node light nodes that may download all of the data in the reserved namespace. They check that the data behind the PFB was included in the `DataRoot`, via blob inclusion proofs. + +The sum of the size of all blob inclusion proofs will be larger than the sum with the previous non-interactive default rules. + +In the current worst case a Celestia block is full of blobs of size 1, making the total amount of subtree roots that need to be downloaded O(n) where n is the number of shares in a block. With the new non-interactive default rules, the worst case stays the same, but the average case goes up. If the block is filled with blobs that are smaller than the threshold then the partial node will still need to download O(n) subtree roots. + +### Worst Case Padding + +If we choose the threshold to be the `MaxSquareSize` then the worst-case padding will be approaching 2 rows of padding. This means that this scales very well as no matter how large the blob is, the worst-case padding will be at most 2 rows of padding if we adjust the threshold to a new `MaxSquareSize`. + +Here is a diagram of the worst-case padding for a threshold of 16 for the square size of 16. The left side is before and the right side is after this change. The bigger the square the more noticeable the change will be. + +![Worst Case Padding Comparison](./assets/worst-case-padding-comparison.png) + +### Additional Remarks + +If the threshold is bigger than `MinSquareSize` for a particular blob then the blob will be aligned to the index of the `MinSquareSize` of the blob. This would prevent some blob size ranges to have higher padding than they had before this change. So the real new non-interactive default rules would be: + +Blobs start at an index that is equal to the blob length divided by `MaxSquareSize` rounded up. If this index is larger than the `MinSquareSize` of the blob then the blob starts at the index of the `MinSquareSize`. + +## Status + +Proposed + +## Consequences + +### Positive + +Most blocks will have close to zero padding. + +### Negative + +The number of subtree roots to download for Partial-Nodes will increase in the average case. + +### Neutral + +The number of subtree roots to download for Light-Nodes will increase in the average case, but it is still small enough as the threshold will be chosen wisely. Furthermore, this effect can be mitigated by using PFB inclusion proofs. diff --git a/docs/architecture/assets/blob-alignment-comparison.png b/docs/architecture/assets/blob-alignment-comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..18a2d9c6388f551a1390dcbf854b82ab27a05dae GIT binary patch literal 34598 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 b$Lq+l@vXwTd%ienYU|VX-&cHh?Wg|(FiDK^ literal 0 HcmV?d00001 diff --git a/docs/architecture/assets/worst-case-padding-comparison.png b/docs/architecture/assets/worst-case-padding-comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba29bcb6b07a6e19b64cbabfe6e90ff150f2dd3 GIT binary patch literal 16731 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 literal 0 HcmV?d00001 diff --git a/docs/architecture/assets/worst-case-padding-in-blob-size-range.png b/docs/architecture/assets/worst-case-padding-in-blob-size-range.png new file mode 100644 index 0000000000000000000000000000000000000000..d70e6de4d3d867651f8386f2ae8c71121886ba1e GIT binary patch literal 34574 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 literal 0 HcmV?d00001 From 1f5ed739998f9152daad3dee9de1edd0e47c2a27 Mon Sep 17 00:00:00 2001 From: nashqueue Date: Fri, 6 Jan 2023 15:08:38 +0100 Subject: [PATCH 3/4] resolve nits --- ...r013-non-interactive-default-rules-for-zero-padding.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md b/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md index 644247ff80..2705fdea24 100644 --- a/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md +++ b/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md @@ -12,9 +12,9 @@ Looking at different ranges of blob sizes we can see that the ratio of blob size ![Worst Case Padding In Blob Size Range](./assets/worst-case-padding-in-blob-size-range.png) -This means that you get more padding for fever data in small blobs. This is not ideal as we want to have as little padding as possible. As padding is not being paid for there is no incentive to use larger blobs. +This means small blobs generate more possible padding in comparison to the data they provide. This is not ideal as we want to have as little padding as possible. As padding is not being paid for there is no incentive to use larger blobs. -In the naive approach if you align the blob at an index of one you get zero padding as each blob can follow the next. This would make the hash of each share a subtree root. In a square with n shares, you would always get n subtree roots. But having a blob inclusion proof of size n for large blobs is too much and unfeasible. +In the naive approach if you align the blob at an index of one you get zero padding as each blob can follow the next. This would make the hash of each share a subtree root. In a square with N shares, you would always get N subtree roots. But having a blob inclusion proof of size N for large blobs is too much and unfeasible. Small blob sizes have the lowest ratio but also small inclusion proofs. Therefore increasing the proof size is not a problem until some threshold. It would increase the ratio of blob size to padding for small blobs which have the worst ratio. @@ -29,7 +29,7 @@ Blobs start at an index that is equal to the blob length/`MaxSquareSize` rounded If the blob length is smaller than `MaxSquareSize` then the blob starts at index 1. `MaxSquareSize` can be changed to another threshold. The smaller the threshold the more padding we will have. -The Picture below shows the difference between the old and new non-interactive default rules in a square of size 8 and a thereshold of 8. +The picture below shows the difference between the old and new non-interactive default rules in a square of size 8 and a threshold of 8. ![Blob Alignment Comparison](./assets/blob-alignment-comparison.png) @@ -39,7 +39,7 @@ The Picture below shows the difference between the old and new non-interactive d The Proof size is bounded by the number of subtree roots in the blob inclusion proof. If the new bound is the `MaxSquareSize` then the worst case for the number of subtree roots in a blob inclusion proof will be `MaxSquareSize`. -If Light-Nodes can process this proof size without a problem then we can use this bound. If not we can use a smaller bound. The smaller the bound the more padding we will have. +If Light-Nodes can process this proof size without a problem then we can use this bound. If not, we can use a smaller bound. The smaller the bound the more padding we will have. In addition, we could use PFB inclusion proofs (ADR 11) to reduce the proof size of the blob inclusion proof for Light-Nodes. This would make this change not noticeable to them as they are blob size independent until we need a fraud-proof for a malicious PFB inclusion. From 6d4dff0394fd45a2e249f0f1be8e058b2699bd30 Mon Sep 17 00:00:00 2001 From: nashqueue Date: Wed, 11 Jan 2023 14:08:06 +0100 Subject: [PATCH 4/4] fix rule --- .../adr013-non-interactive-default-rules-for-zero-padding.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md b/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md index 2705fdea24..34dc10e667 100644 --- a/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md +++ b/docs/architecture/adr013-non-interactive-default-rules-for-zero-padding.md @@ -24,7 +24,7 @@ Let's assume a good threshold assumption is that the number of subtree roots in The new non-interactive default rules would be: -Blobs start at an index that is equal to the blob length/`MaxSquareSize` rounded up. +Blobs start at an index that is equal to a multiple of the blob length divided by `MaxSquareSize` rounded up. If the blob length is smaller than `MaxSquareSize` then the blob starts at index 1. `MaxSquareSize` can be changed to another threshold. The smaller the threshold the more padding we will have. @@ -65,7 +65,7 @@ Here is a diagram of the worst-case padding for a threshold of 16 for the square If the threshold is bigger than `MinSquareSize` for a particular blob then the blob will be aligned to the index of the `MinSquareSize` of the blob. This would prevent some blob size ranges to have higher padding than they had before this change. So the real new non-interactive default rules would be: -Blobs start at an index that is equal to the blob length divided by `MaxSquareSize` rounded up. If this index is larger than the `MinSquareSize` of the blob then the blob starts at the index of the `MinSquareSize`. +Blobs start at an index that is equal to a multiple of the blob length divided by `MaxSquareSize` rounded up. If this index is larger than the `MinSquareSize` of the blob then the blob starts at the index of the `MinSquareSize`. ## Status