Skip to content

Instantly share code, notes, and snippets.

@mdehoog
Created June 16, 2022 03:15
Show Gist options
  • Save mdehoog/aecbb3d33f77968ff9f0f550e1d07094 to your computer and use it in GitHub Desktop.
Save mdehoog/aecbb3d33f77968ff9f0f550e1d07094 to your computer and use it in GitHub Desktop.
Request blob sidecar from beacon node
package main
import (
"context"
"fmt"
libp2pcore "github.com/libp2p/go-libp2p-core"
"github.com/libp2p/go-libp2p-core/peer"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p"
"github.com/prysmaticlabs/prysm/beacon-chain/sync"
ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1"
"io"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
req := &ethpb.BlobsSidecarsByRangeRequest{
StartSlot: 10,
Count: 10,
}
svc, err := p2p.NewService(ctx, &p2p.Config{})
if err != nil {
panic(err)
}
addr, err := peer.AddrInfoFromString("/ip4/192.168.86.249/tcp/13000/p2p/16Uiu2HAmD5XwkprYDfmgunmafiH58ZfY3n56Dr41ahydoCmh23Kt")
if err != nil {
panic(err)
}
err = svc.Connect(*addr)
if err != nil {
panic(err)
}
sidecars, err := SendBlobsSidecarsByRangeRequest(ctx, svc, addr.ID, req)
if err != nil {
panic(err)
}
fmt.Printf("Got %d sidecars: %+v\n", len(sidecars), sidecars)
}
func SendBlobsSidecarsByRangeRequest(
ctx context.Context, p2pProvider p2p.P2P, pid peer.ID, req *ethpb.BlobsSidecarsByRangeRequest) ([]*ethpb.BlobsSidecar, error) {
stream, err := p2pProvider.Send(ctx, req, p2p.RPCBlobsSidecarsByRangeTopicV1, pid)
if err != nil {
return nil, err
}
defer func() {
_ = stream.Close()
}()
var blobsSidecars []*ethpb.BlobsSidecar
for {
blobs, err := ReadChunkedBlobsSidecar(stream, p2pProvider)
if errors.Is(err, io.EOF) {
break
}
if err != nil {
return nil, err
}
blobsSidecars = append(blobsSidecars, blobs)
}
return blobsSidecars, nil
}
func ReadChunkedBlobsSidecar(stream libp2pcore.Stream, p2p p2p.P2P) (*ethpb.BlobsSidecar, error) {
code, errMsg, err := sync.ReadStatusCode(stream, p2p.Encoding())
if err != nil {
return nil, err
}
if code != 0 {
return nil, errors.New(errMsg)
}
sidecar := new(ethpb.BlobsSidecar)
err = p2p.Encoding().DecodeWithMaxLength(stream, sidecar)
return sidecar, err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment