Skip to content

Commit 98e2aee

Browse files
nisdasnalepae
andcommitted
Add Request And Response RPC Methods For Data Columns (#13909)
* Add RPC Handler * Add Column Requests * Update beacon-chain/db/filesystem/blob.go Co-authored-by: Manu NALEPA <[email protected]> * Update beacon-chain/p2p/rpc_topic_mappings.go Co-authored-by: Manu NALEPA <[email protected]> * Manu's Review * Manu's Review * Interface Fixes * mock manager --------- Co-authored-by: Manu NALEPA <[email protected]>
1 parent 61f8d0e commit 98e2aee

File tree

14 files changed

+263
-6
lines changed

14 files changed

+263
-6
lines changed

beacon-chain/db/filesystem/blob.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,20 @@ func (bs *BlobStorage) Get(root [32]byte, idx uint64) (blocks.VerifiedROBlob, er
246246
return verification.BlobSidecarNoop(ro)
247247
}
248248

249+
// GetColumn retrieves a single DataColumnSidecar by its root and index.
250+
func (bs *BlobStorage) GetColumn(root [32]byte, idx uint64) (*ethpb.DataColumnSidecar, error) {
251+
expected := blobNamer{root: root, index: idx}
252+
encoded, err := afero.ReadFile(bs.fs, expected.path())
253+
if err != nil {
254+
return nil, err
255+
}
256+
s := &ethpb.DataColumnSidecar{}
257+
if err := s.UnmarshalSSZ(encoded); err != nil {
258+
return nil, err
259+
}
260+
return s, nil
261+
}
262+
249263
// Remove removes all blobs for a given root.
250264
func (bs *BlobStorage) Remove(root [32]byte) error {
251265
rootDir := blobNamer{root: root}.dir()

beacon-chain/p2p/interfaces.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package p2p
33
import (
44
"context"
55

6+
"github.com/ethereum/go-ethereum/p2p/enode"
67
"github.com/ethereum/go-ethereum/p2p/enr"
78
pubsub "github.com/libp2p/go-libp2p-pubsub"
89
"github.com/libp2p/go-libp2p/core/connmgr"
@@ -81,6 +82,7 @@ type PeerManager interface {
8182
PeerID() peer.ID
8283
Host() host.Host
8384
ENR() *enr.Record
85+
NodeID() enode.ID
8486
DiscoveryAddresses() ([]multiaddr.Multiaddr, error)
8587
RefreshPersistentSubnets()
8688
FindPeersWithSubnet(ctx context.Context, topic string, subIndex uint64, threshold int) (bool, error)

beacon-chain/p2p/rpc_topic_mappings.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ const BlobSidecarsByRangeName = "/blob_sidecars_by_range"
4343
// BlobSidecarsByRootName is the name for the BlobSidecarsByRoot v1 message topic.
4444
const BlobSidecarsByRootName = "/blob_sidecars_by_root"
4545

46+
// DataColumnSidecarsByRootName is the name for the DataColumnSidecarsByRoot v1 message topic.
47+
const DataColumnSidecarsByRootName = "/data_column_sidecars_by_root"
48+
4649
const (
4750
// V1 RPC Topics
4851
// RPCStatusTopicV1 defines the v1 topic for the status rpc method.
@@ -65,6 +68,9 @@ const (
6568
// RPCBlobSidecarsByRootTopicV1 is a topic for requesting blob sidecars by their block root. New in deneb.
6669
// /eth2/beacon_chain/req/blob_sidecars_by_root/1/
6770
RPCBlobSidecarsByRootTopicV1 = protocolPrefix + BlobSidecarsByRootName + SchemaVersionV1
71+
// RPCDataColumnSidecarsByRootTopicV1 is a topic for requesting data column sidecars by their block root. New in PeerDAS.
72+
// /eth2/beacon_chain/req/data_column_sidecars_by_root/1
73+
RPCDataColumnSidecarsByRootTopicV1 = protocolPrefix + DataColumnSidecarsByRootName + SchemaVersionV1
6874

6975
// V2 RPC Topics
7076
// RPCBlocksByRangeTopicV2 defines v2 the topic for the blocks by range rpc method.

beacon-chain/p2p/service.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,15 @@ func (s *Service) ENR() *enr.Record {
358358
return s.dv5Listener.Self().Record()
359359
}
360360

361+
// NodeID returns the local node's node ID
362+
// for discovery.
363+
func (s *Service) NodeID() enode.ID {
364+
if s.dv5Listener == nil {
365+
return [32]byte{}
366+
}
367+
return s.dv5Listener.Self().ID()
368+
}
369+
361370
// DiscoveryAddresses represents our enr addresses as multiaddresses.
362371
func (s *Service) DiscoveryAddresses() ([]multiaddr.Multiaddr, error) {
363372
if s.dv5Listener == nil {

beacon-chain/p2p/subnets.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ func computeSubscribedSubnets(nodeID enode.ID, epoch primitives.Epoch) ([]uint64
239239
return subs, nil
240240
}
241241

242-
func computeCustodyColumns(nodeID enode.ID) ([]uint64, error) {
242+
func ComputeCustodyColumns(nodeID enode.ID) ([]uint64, error) {
243243
subs, err := computeSubscribedColumnSubnets(nodeID)
244244
if err != nil {
245245
return nil, err

beacon-chain/p2p/testing/fuzz_p2p.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package testing
33
import (
44
"context"
55

6+
"github.com/ethereum/go-ethereum/p2p/enode"
67
"github.com/ethereum/go-ethereum/p2p/enr"
78
pubsub "github.com/libp2p/go-libp2p-pubsub"
89
"github.com/libp2p/go-libp2p/core/control"
@@ -55,6 +56,11 @@ func (_ *FakeP2P) ENR() *enr.Record {
5556
return new(enr.Record)
5657
}
5758

59+
// NodeID returns the node id of the local peer.
60+
func (_ *FakeP2P) NodeID() enode.ID {
61+
return [32]byte{}
62+
}
63+
5864
// DiscoveryAddresses -- fake
5965
func (_ *FakeP2P) DiscoveryAddresses() ([]multiaddr.Multiaddr, error) {
6066
return nil, nil

beacon-chain/p2p/testing/mock_peermanager.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66

7+
"github.com/ethereum/go-ethereum/p2p/enode"
78
"github.com/ethereum/go-ethereum/p2p/enr"
89
"github.com/libp2p/go-libp2p/core/host"
910
"github.com/libp2p/go-libp2p/core/peer"
@@ -39,6 +40,11 @@ func (m MockPeerManager) ENR() *enr.Record {
3940
return m.Enr
4041
}
4142

43+
// NodeID .
44+
func (m MockPeerManager) NodeID() enode.ID {
45+
return [32]byte{}
46+
}
47+
4248
// DiscoveryAddresses .
4349
func (m MockPeerManager) DiscoveryAddresses() ([]multiaddr.Multiaddr, error) {
4450
if m.FailDiscoveryAddr {

beacon-chain/p2p/testing/p2p.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"testing"
1111
"time"
1212

13+
"github.com/ethereum/go-ethereum/p2p/enode"
1314
"github.com/ethereum/go-ethereum/p2p/enr"
1415
pubsub "github.com/libp2p/go-libp2p-pubsub"
1516
core "github.com/libp2p/go-libp2p/core"
@@ -263,6 +264,11 @@ func (_ *TestP2P) ENR() *enr.Record {
263264
return new(enr.Record)
264265
}
265266

267+
// NodeID returns the node id of the local peer.
268+
func (_ *TestP2P) NodeID() enode.ID {
269+
return [32]byte{}
270+
}
271+
266272
// DiscoveryAddresses --
267273
func (_ *TestP2P) DiscoveryAddresses() ([]multiaddr.Multiaddr, error) {
268274
return nil, nil

beacon-chain/p2p/types/rpc_errors.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,15 @@ var (
99
ErrInvalidSequenceNum = errors.New("invalid sequence number provided")
1010
ErrGeneric = errors.New("internal service error")
1111

12-
ErrRateLimited = errors.New("rate limited")
13-
ErrIODeadline = errors.New("i/o deadline exceeded")
14-
ErrInvalidRequest = errors.New("invalid range, step or count")
15-
ErrBlobLTMinRequest = errors.New("blob slot < minimum_request_epoch")
16-
ErrMaxBlobReqExceeded = errors.New("requested more than MAX_REQUEST_BLOB_SIDECARS")
12+
ErrRateLimited = errors.New("rate limited")
13+
ErrIODeadline = errors.New("i/o deadline exceeded")
14+
ErrInvalidRequest = errors.New("invalid range, step or count")
15+
ErrBlobLTMinRequest = errors.New("blob epoch < minimum_request_epoch")
16+
17+
ErrDataColumnLTMinRequest = errors.New("data column epoch < minimum_request_epoch")
18+
ErrMaxBlobReqExceeded = errors.New("requested more than MAX_REQUEST_BLOB_SIDECARS")
19+
ErrMaxDataColumnReqExceeded = errors.New("requested more than MAX_REQUEST_DATA_COLUMN_SIDECARS")
20+
1721
ErrResourceUnavailable = errors.New("resource requested unavailable")
22+
ErrInvalidColumnIndex = errors.New("invalid column index requested")
1823
)

beacon-chain/sync/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ go_library(
2525
"rpc_blob_sidecars_by_range.go",
2626
"rpc_blob_sidecars_by_root.go",
2727
"rpc_chunked_response.go",
28+
"rpc_data_column_sidecars_by_root.go",
2829
"rpc_goodbye.go",
2930
"rpc_metadata.go",
3031
"rpc_ping.go",

0 commit comments

Comments
 (0)