mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 21:38:05 -05:00
PeerDAS: Implement DAS (#15367)
* PeerDAS: Implement DAS * Fix Terence's comment. * Fix Terence comment. * Fix Terence's comment. * Fix James' comment. * Fix James' comment. * Rename some variable/files with blobs. * Fix James' comment. * Fix James' comment. * Fix James' comment.
This commit is contained in:
@@ -13,6 +13,7 @@ go_library(
|
||||
"roblob.go",
|
||||
"roblock.go",
|
||||
"rodatacolumn.go",
|
||||
"rosidecar.go",
|
||||
"setters.go",
|
||||
"types.go",
|
||||
],
|
||||
@@ -53,6 +54,7 @@ go_test(
|
||||
"roblob_test.go",
|
||||
"roblock_test.go",
|
||||
"rodatacolumn_test.go",
|
||||
"rosidecar_test.go",
|
||||
],
|
||||
embed = [":go_default_library"],
|
||||
deps = [
|
||||
@@ -72,5 +74,6 @@ go_test(
|
||||
"@com_github_prysmaticlabs_fastssz//:go_default_library",
|
||||
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
|
||||
"@com_github_prysmaticlabs_gohashtree//:go_default_library",
|
||||
"@com_github_stretchr_testify//require:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
96
consensus-types/blocks/rosidecar.go
Normal file
96
consensus-types/blocks/rosidecar.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package blocks
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// ROSidecar represents a read-only sidecar with its block root.
|
||||
type ROSidecar struct {
|
||||
blob *ROBlob
|
||||
dataColumn *RODataColumn
|
||||
}
|
||||
|
||||
var (
|
||||
errBlobNeeded = errors.New("blob sidecar needed")
|
||||
errDataColumnNeeded = errors.New("data column sidecar needed")
|
||||
)
|
||||
|
||||
// NewSidecarFromBlobSidecar creates a new read-only (generic) sidecar from a read-only blob sidecar.
|
||||
func NewSidecarFromBlobSidecar(blob ROBlob) ROSidecar {
|
||||
return ROSidecar{blob: &blob}
|
||||
}
|
||||
|
||||
// NewSidecarFromDataColumnSidecar creates a new read-only (generic) sidecar from a read-only data column sidecar.
|
||||
func NewSidecarFromDataColumnSidecar(dataColumn RODataColumn) ROSidecar {
|
||||
return ROSidecar{dataColumn: &dataColumn}
|
||||
}
|
||||
|
||||
// NewSidecarsFromBlobSidecars creates a new slice of read-only (generic) sidecars from a slice of read-only blobs sidecars.
|
||||
func NewSidecarsFromBlobSidecars(blobSidecars []ROBlob) []ROSidecar {
|
||||
sidecars := make([]ROSidecar, 0, len(blobSidecars))
|
||||
for _, blob := range blobSidecars {
|
||||
blobSidecar := ROSidecar{blob: &blob} // #nosec G601
|
||||
sidecars = append(sidecars, blobSidecar)
|
||||
}
|
||||
|
||||
return sidecars
|
||||
}
|
||||
|
||||
// NewSidecarsFromDataColumnSidecars creates a new slice of read-only (generic) sidecars from a slice of read-only data column sidecars.
|
||||
func NewSidecarsFromDataColumnSidecars(dataColumnSidecars []RODataColumn) []ROSidecar {
|
||||
sidecars := make([]ROSidecar, 0, len(dataColumnSidecars))
|
||||
for _, dataColumn := range dataColumnSidecars {
|
||||
dataColumnSidecar := ROSidecar{dataColumn: &dataColumn} // #nosec G601
|
||||
sidecars = append(sidecars, dataColumnSidecar)
|
||||
}
|
||||
|
||||
return sidecars
|
||||
}
|
||||
|
||||
// Blob returns the blob sidecar.
|
||||
func (sc *ROSidecar) Blob() (ROBlob, error) {
|
||||
if sc.blob == nil {
|
||||
return ROBlob{}, errBlobNeeded
|
||||
}
|
||||
|
||||
return *sc.blob, nil
|
||||
}
|
||||
|
||||
// DataColumn returns the data column sidecar.
|
||||
func (sc *ROSidecar) DataColumn() (RODataColumn, error) {
|
||||
if sc.dataColumn == nil {
|
||||
return RODataColumn{}, errDataColumnNeeded
|
||||
}
|
||||
|
||||
return *sc.dataColumn, nil
|
||||
}
|
||||
|
||||
// BlobSidecarsFromSidecars creates a new slice of read-only blobs sidecars from a slice of read-only (generic) sidecars.
|
||||
func BlobSidecarsFromSidecars(sidecars []ROSidecar) ([]ROBlob, error) {
|
||||
blobSidecars := make([]ROBlob, 0, len(sidecars))
|
||||
for _, sidecar := range sidecars {
|
||||
blob, err := sidecar.Blob()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "blob")
|
||||
}
|
||||
|
||||
blobSidecars = append(blobSidecars, blob)
|
||||
}
|
||||
|
||||
return blobSidecars, nil
|
||||
}
|
||||
|
||||
// DataColumnSidecarsFromSidecars creates a new slice of read-only data column sidecars from a slice of read-only (generic) sidecars.
|
||||
func DataColumnSidecarsFromSidecars(sidecars []ROSidecar) ([]RODataColumn, error) {
|
||||
dataColumnSidecars := make([]RODataColumn, 0, len(sidecars))
|
||||
for _, sidecar := range sidecars {
|
||||
dataColumn, err := sidecar.DataColumn()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "data column")
|
||||
}
|
||||
|
||||
dataColumnSidecars = append(dataColumnSidecars, dataColumn)
|
||||
}
|
||||
|
||||
return dataColumnSidecars, nil
|
||||
}
|
||||
109
consensus-types/blocks/rosidecar_test.go
Normal file
109
consensus-types/blocks/rosidecar_test.go
Normal file
@@ -0,0 +1,109 @@
|
||||
package blocks
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestNewSidecarFromBlobSidecar(t *testing.T) {
|
||||
blob := ROBlob{}
|
||||
sidecar := NewSidecarFromBlobSidecar(blob)
|
||||
|
||||
// Check that the blob is set
|
||||
retrievedBlob, err := sidecar.Blob()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, blob, retrievedBlob)
|
||||
|
||||
// Check that data column is not set
|
||||
_, err = sidecar.DataColumn()
|
||||
require.ErrorIs(t, err, errDataColumnNeeded)
|
||||
}
|
||||
|
||||
func TestNewSidecarFromDataColumnSidecar(t *testing.T) {
|
||||
dataColumn := RODataColumn{}
|
||||
sidecar := NewSidecarFromDataColumnSidecar(dataColumn)
|
||||
|
||||
// Check that the data column is set
|
||||
retrievedDataColumn, err := sidecar.DataColumn()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, dataColumn, retrievedDataColumn)
|
||||
|
||||
// Check that blob is not set
|
||||
_, err = sidecar.Blob()
|
||||
require.ErrorIs(t, err, errBlobNeeded)
|
||||
}
|
||||
|
||||
func TestNewSidecarsFromBlobSidecars(t *testing.T) {
|
||||
blobSidecars := []ROBlob{{}, {}}
|
||||
sidecars := NewSidecarsFromBlobSidecars(blobSidecars)
|
||||
|
||||
require.Equal(t, len(blobSidecars), len(sidecars))
|
||||
|
||||
for i, sidecar := range sidecars {
|
||||
retrievedBlob, err := sidecar.Blob()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, blobSidecars[i], retrievedBlob)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewSidecarsFromDataColumnSidecars(t *testing.T) {
|
||||
dataColumnSidecars := []RODataColumn{{}, {}}
|
||||
sidecars := NewSidecarsFromDataColumnSidecars(dataColumnSidecars)
|
||||
|
||||
require.Equal(t, len(dataColumnSidecars), len(sidecars))
|
||||
|
||||
for i, sidecar := range sidecars {
|
||||
retrievedDataColumn, err := sidecar.DataColumn()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, dataColumnSidecars[i], retrievedDataColumn)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBlobSidecarsFromSidecars(t *testing.T) {
|
||||
// Create sidecars with blobs
|
||||
blobSidecars := []ROBlob{{}, {}}
|
||||
sidecars := NewSidecarsFromBlobSidecars(blobSidecars)
|
||||
|
||||
// Convert back to blob sidecars
|
||||
retrievedBlobSidecars, err := BlobSidecarsFromSidecars(sidecars)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, len(blobSidecars), len(retrievedBlobSidecars))
|
||||
|
||||
for i, blob := range retrievedBlobSidecars {
|
||||
require.Equal(t, blobSidecars[i], blob)
|
||||
}
|
||||
|
||||
// Test with a mix of sidecar types
|
||||
mixedSidecars := []ROSidecar{
|
||||
NewSidecarFromBlobSidecar(ROBlob{}),
|
||||
NewSidecarFromDataColumnSidecar(RODataColumn{}),
|
||||
}
|
||||
|
||||
_, err = BlobSidecarsFromSidecars(mixedSidecars)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestDataColumnSidecarsFromSidecars(t *testing.T) {
|
||||
// Create sidecars with data columns
|
||||
dataColumnSidecars := []RODataColumn{{}, {}}
|
||||
sidecars := NewSidecarsFromDataColumnSidecars(dataColumnSidecars)
|
||||
|
||||
// Convert back to data column sidecars
|
||||
retrievedDataColumnSidecars, err := DataColumnSidecarsFromSidecars(sidecars)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, len(dataColumnSidecars), len(retrievedDataColumnSidecars))
|
||||
|
||||
for i, dataColumn := range retrievedDataColumnSidecars {
|
||||
require.Equal(t, dataColumnSidecars[i], dataColumn)
|
||||
}
|
||||
|
||||
// Test with a mix of sidecar types
|
||||
mixedSidecars := []ROSidecar{
|
||||
NewSidecarFromDataColumnSidecar(RODataColumn{}),
|
||||
NewSidecarFromBlobSidecar(ROBlob{}),
|
||||
}
|
||||
|
||||
_, err = DataColumnSidecarsFromSidecars(mixedSidecars)
|
||||
require.Error(t, err)
|
||||
}
|
||||
Reference in New Issue
Block a user