diff --git a/go.mod b/go.mod index cfe1a61..bcd0b4e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/ethpandaops/beacon go 1.19 require ( - github.com/attestantio/go-eth2-client v0.18.4-0.20231012194602-0eff364fec01 + github.com/attestantio/go-eth2-client v0.19.5 github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 github.com/ethpandaops/ethwallclock v0.2.0 github.com/go-co-op/gocron v1.16.2 @@ -23,6 +23,7 @@ require ( github.com/goccy/go-yaml v1.9.5 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/holiman/uint256 v1.2.2 // indirect + github.com/huandu/go-clone v1.6.0 // indirect github.com/klauspost/cpuid/v2 v2.1.2 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.16 // indirect diff --git a/go.sum b/go.sum index 6b4c7f7..d234a41 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/attestantio/go-eth2-client v0.18.4-0.20231012194602-0eff364fec01 h1:KSfIKKL501RgHJrQIoS+0OpJuG3pFi2o5wKPrHkcs5M= -github.com/attestantio/go-eth2-client v0.18.4-0.20231012194602-0eff364fec01/go.mod h1:KSVlZSW1A3jUg5H8O89DLtqxgJprRfTtI7k89fLdhu0= +github.com/attestantio/go-eth2-client v0.19.5 h1:4V+vhXsCYji5jWrlONbr03GV7qoLRdzq96dLgXaqmek= +github.com/attestantio/go-eth2-client v0.19.5/go.mod h1:mZve1kV9Ctj0I1HH9gdg+MnI8lZ+Cb2EktEtOYrBlsM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= @@ -45,7 +45,10 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/go-clone v1.6.0 h1:HMo5uvg4wgfiy5FoGOqlFLQED/VGRm2D9Pi8g1FXPGc= +github.com/huandu/go-clone v1.6.0/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= github.com/huandu/go-clone/generic v1.6.0 h1:Wgmt/fUZ28r16F2Y3APotFD59sHk1p78K0XLdbUYN5U= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.1.2 h1:XhdX4fqAJUA0yj+kUwMavO0hHrSPAecYdYf1ZmxHvak= diff --git a/pkg/beacon/beacon.go b/pkg/beacon/beacon.go index de4db2a..f7975ef 100644 --- a/pkg/beacon/beacon.go +++ b/pkg/beacon/beacon.go @@ -8,6 +8,7 @@ import ( "time" eth2client "github.com/attestantio/go-eth2-client" + eapi "github.com/attestantio/go-eth2-client/api" v1 "github.com/attestantio/go-eth2-client/api/v1" "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/altair" @@ -386,7 +387,7 @@ func (n *node) fetchIsHealthy(ctx context.Context) error { return errors.New("client does not implement eth2client.NodeSyncingProvider") } - _, err := provider.NodeSyncing(ctx) + _, err := provider.NodeSyncing(ctx, &eapi.NodeSyncingOpts{}) if err != nil { return err } @@ -437,12 +438,24 @@ func (n *node) getBlock(ctx context.Context, blockID string) (*spec.VersionedSig return nil, errors.New("client does not implement eth2client.SignedBeaconBlockProvider") } - signedBeaconBlock, err := provider.SignedBeaconBlock(ctx, blockID) + signedBeaconBlock, err := provider.SignedBeaconBlock(ctx, &eapi.SignedBeaconBlockOpts{ + Block: blockID, + }) if err != nil { + var apiErr *eapi.Error + if errors.As(err, &apiErr) { + switch apiErr.StatusCode { + case 404: + return nil, nil + case 503: + return nil, errors.New("beacon node is syncing") + } + } + return nil, err } - return signedBeaconBlock, nil + return signedBeaconBlock.Data, nil } func (n *node) Healthy() bool { diff --git a/pkg/beacon/fetch.go b/pkg/beacon/fetch.go index d720438..6a57aa4 100644 --- a/pkg/beacon/fetch.go +++ b/pkg/beacon/fetch.go @@ -5,6 +5,7 @@ import ( "errors" eth2client "github.com/attestantio/go-eth2-client" + "github.com/attestantio/go-eth2-client/api" v1 "github.com/attestantio/go-eth2-client/api/v1" "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/deneb" @@ -19,16 +20,16 @@ func (n *node) FetchSyncStatus(ctx context.Context) (*v1.SyncState, error) { return nil, errors.New("client does not implement eth2client.NodeSyncingProvider") } - status, err := provider.NodeSyncing(ctx) + status, err := provider.NodeSyncing(ctx, &api.NodeSyncingOpts{}) if err != nil { return nil, err } - n.stat.UpdateSyncState(status) + n.stat.UpdateSyncState(status.Data) - n.publishSyncStatus(ctx, status) + n.publishSyncStatus(ctx, status.Data) - return status, nil + return status.Data, nil } func (n *node) FetchPeers(ctx context.Context) (*types.Peers, error) { @@ -50,16 +51,16 @@ func (n *node) FetchNodeVersion(ctx context.Context) (string, error) { return "", errors.New("client does not implement eth2client.NodeVersionProvider") } - version, err := provider.NodeVersion(ctx) + rsp, err := provider.NodeVersion(ctx, &api.NodeVersionOpts{}) if err != nil { return "", err } - n.nodeVersion = version + n.nodeVersion = rsp.Data - n.publishNodeVersionUpdated(ctx, version) + n.publishNodeVersionUpdated(ctx, rsp.Data) - return version, nil + return rsp.Data, nil } func (n *node) FetchBlock(ctx context.Context, stateID string) (*spec.VersionedSignedBeaconBlock, error) { @@ -72,12 +73,14 @@ func (n *node) FetchBeaconState(ctx context.Context, stateID string) (*spec.Vers return nil, errors.New("client does not implement eth2client.NodeVersionProvider") } - beaconState, err := provider.BeaconState(ctx, stateID) + rsp, err := provider.BeaconState(ctx, &api.BeaconStateOpts{ + State: stateID, + }) if err != nil { return nil, err } - return beaconState, nil + return rsp.Data, nil } func (n *node) FetchRawBeaconState(ctx context.Context, stateID string, contentType string) ([]byte, error) { @@ -90,11 +93,15 @@ func (n *node) FetchFinality(ctx context.Context, stateID string) (*v1.Finality, return nil, errors.New("client does not implement eth2client.FinalityProvider") } - finality, err := provider.Finality(ctx, stateID) + rsp, err := provider.Finality(ctx, &api.FinalityOpts{ + State: stateID, + }) if err != nil { return nil, err } + finality := rsp.Data + if stateID == "head" { changed := false if n.finality == nil || @@ -123,12 +130,12 @@ func (n *node) FetchSpec(ctx context.Context) (*state.Spec, error) { return nil, errors.New("client does not implement eth2client.SpecProvider") } - data, err := provider.Spec(ctx) + rsp, err := provider.Spec(ctx, &api.SpecOpts{}) if err != nil { return nil, err } - sp := state.NewSpec(data) + sp := state.NewSpec(rsp.Data) n.spec = &sp @@ -138,17 +145,19 @@ func (n *node) FetchSpec(ctx context.Context) (*state.Spec, error) { } func (n *node) FetchBeaconBlockBlobs(ctx context.Context, blockID string) ([]*deneb.BlobSidecar, error) { - provider, isProvider := n.client.(eth2client.BeaconBlockBlobsProvider) + provider, isProvider := n.client.(eth2client.BlobSidecarsProvider) if !isProvider { - return nil, errors.New("client does not implement eth2client.BeaconBlockBlobsProvider") + return nil, errors.New("client does not implement eth2client.BlobSidecarsProvider") } - data, err := provider.BeaconBlockBlobs(ctx, blockID) + rsp, err := provider.BlobSidecars(ctx, &api.BlobSidecarsOpts{ + Block: blockID, + }) if err != nil { return nil, err } - return data, nil + return rsp.Data, nil } func (n *node) FetchProposerDuties(ctx context.Context, epoch phase0.Epoch) ([]*v1.ProposerDuty, error) { @@ -159,12 +168,14 @@ func (n *node) FetchProposerDuties(ctx context.Context, epoch phase0.Epoch) ([]* return nil, errors.New("client does not implement eth2client.ProposerDutiesProvider") } - duties, err := provider.ProposerDuties(ctx, epoch, nil) + rsp, err := provider.ProposerDuties(ctx, &api.ProposerDutiesOpts{ + Epoch: epoch, + }) if err != nil { return nil, err } - return duties, nil + return rsp.Data, nil } func (n *node) FetchForkChoice(ctx context.Context) (*v1.ForkChoice, error) { @@ -173,7 +184,12 @@ func (n *node) FetchForkChoice(ctx context.Context) (*v1.ForkChoice, error) { return nil, errors.New("client does not implement eth2client.ForkChoiceProvider") } - return provider.ForkChoice(ctx) + rsp, err := provider.ForkChoice(ctx, &api.ForkChoiceOpts{}) + if err != nil { + return nil, err + } + + return rsp.Data, nil } func (n *node) FetchDepositSnapshot(ctx context.Context) (*types.DepositSnapshot, error) { @@ -186,12 +202,15 @@ func (n *node) FetchBeaconCommittees(ctx context.Context, state string, epoch ph return nil, errors.New("client does not implement eth2client.BeaconCommitteesProvider") } - duties, err := provider.BeaconCommitteesAtEpoch(ctx, state, epoch) + rsp, err := provider.BeaconCommittees(ctx, &api.BeaconCommitteesOpts{ + State: state, + Epoch: &epoch, + }) if err != nil { return nil, err } - return duties, nil + return rsp.Data, nil } func (n *node) FetchAttestationData(ctx context.Context, slot phase0.Slot, committeeIndex phase0.CommitteeIndex) (*phase0.AttestationData, error) { @@ -200,10 +219,13 @@ func (n *node) FetchAttestationData(ctx context.Context, slot phase0.Slot, commi return nil, errors.New("client does not implement eth2client.AttestationDataProvider") } - attestationData, err := provider.AttestationData(ctx, slot, committeeIndex) + rsp, err := provider.AttestationData(ctx, &api.AttestationDataOpts{ + Slot: slot, + CommitteeIndex: committeeIndex, + }) if err != nil { return nil, err } - return attestationData, nil + return rsp.Data, nil } diff --git a/pkg/beacon/genesis.go b/pkg/beacon/genesis.go index 66595fe..d2aec45 100644 --- a/pkg/beacon/genesis.go +++ b/pkg/beacon/genesis.go @@ -5,6 +5,7 @@ import ( "errors" eth2client "github.com/attestantio/go-eth2-client" + "github.com/attestantio/go-eth2-client/api" v1 "github.com/attestantio/go-eth2-client/api/v1" ) @@ -14,12 +15,12 @@ func (n *node) FetchGenesis(ctx context.Context) (*v1.Genesis, error) { return nil, errors.New("client does not implement eth2client.GenesisProvider") } - genesis, err := provider.Genesis(ctx) + rsp, err := provider.Genesis(ctx, &api.GenesisOpts{}) if err != nil { return nil, err } - n.genesis = genesis + n.genesis = rsp.Data - return genesis, nil + return rsp.Data, nil }