mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-06 22:23:56 -05:00
**What type of PR is this?** Feature **What does this PR do? Why is it needed?** Adds data column support to backfill. **Acknowledgements** - [x] I have read [CONTRIBUTING.md](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md). - [x] I have included a uniquely named [changelog fragment file](https://github.com/prysmaticlabs/prysm/blob/develop/CONTRIBUTING.md#maintaining-changelogmd). - [x] I have added a description to this PR with sufficient context for reviewers to understand this PR. --------- Co-authored-by: Kasey <kasey@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Preston Van Loon <preston@pvl.dev>
41 lines
2.2 KiB
Go
41 lines
2.2 KiB
Go
package das
|
|
|
|
import (
|
|
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
|
)
|
|
|
|
// Bisector describes a type that takes a set of RODataColumns via the Bisect method
|
|
// and returns a BisectionIterator that returns batches of those columns to be
|
|
// verified together.
|
|
type Bisector interface {
|
|
// Bisect initializes the BisectionIterator and returns the result.
|
|
Bisect([]blocks.RODataColumn) (BisectionIterator, error)
|
|
}
|
|
|
|
// BisectionIterator describes an iterator that returns groups of columns to verify.
|
|
// It is up to the bisector implementation to decide how to chunk up the columns,
|
|
// whether by block, by peer, or any other strategy. For example, backfill implements
|
|
// a bisector that keeps track of the source of each sidecar by peer, and groups
|
|
// sidecars by peer in the Next method, enabling it to track which peers, out of all
|
|
// the peers contributing to a batch, gave us bad data.
|
|
// When a batch fails, the OnError method should be used so that the bisector can
|
|
// keep track of the failed groups of columns and eg apply that knowledge in peer scoring.
|
|
// The same column will be returned multiple times by Next; first as part of a larger batch,
|
|
// and again as part of a more fine grained batch if there was an error in the large batch.
|
|
// For example, first as part of a batch of all columns spanning peers, and then again
|
|
// as part of a batch of columns from a single peer if some column in the larger batch
|
|
// failed verification.
|
|
type BisectionIterator interface {
|
|
// Next returns the next group of columns to verify.
|
|
// When the iteration is complete, Next should return (nil, io.EOF).
|
|
Next() ([]blocks.RODataColumn, error)
|
|
// OnError should be called when verification of a group of columns obtained via Next() fails.
|
|
OnError(error)
|
|
// Error can be used at the end of the iteration to get a single error result. It will return
|
|
// nil if OnError was never called, or an error of the implementers choosing representing the set
|
|
// of errors seen during iteration. For instance when bisecting from columns spanning peers to columns
|
|
// from a single peer, the broader error could be dropped, and then the more specific error
|
|
// (for a single peer's response) returned after bisecting to it.
|
|
Error() error
|
|
}
|