Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
97a0b00
updated duties using split endpoints
james-prysm Feb 26, 2026
e9469f8
Merge branch 'develop' into new-update-duties
james-prysm Mar 2, 2026
88e55a7
self review
james-prysm Mar 2, 2026
9852b14
Merge branch 'develop' into new-update-duties
james-prysm Mar 3, 2026
cca0500
Merge branch 'develop' into new-update-duties
james-prysm Mar 4, 2026
8a309a2
Merge branch 'develop' into new-update-duties
james-prysm Mar 10, 2026
2891c5f
updating with split duties changes
james-prysm Mar 10, 2026
0a73309
implementing beacon api usage for split duties and adding ptc duties
james-prysm Mar 10, 2026
81796bc
Merge branch 'develop' into new-update-duties
james-prysm Mar 13, 2026
091b247
Merge branch 'develop' into new-update-duties
james-prysm Mar 13, 2026
bd981ea
fixing mock
james-prysm Mar 13, 2026
9b767ba
fixing bad merge
james-prysm Mar 13, 2026
574cb69
reverting change
james-prysm Mar 13, 2026
0d2d4dc
Merge branch 'develop' into new-update-duties
james-prysm Mar 19, 2026
10a669c
Merge branch 'develop' into new-update-duties
james-prysm Mar 19, 2026
a0500ae
Merge branch 'develop' into new-update-duties
james-prysm Mar 20, 2026
456f80d
removing ptc next epoch duties
james-prysm Mar 20, 2026
f366b60
duties split test
james-prysm Mar 20, 2026
fefffa7
changelog
james-prysm Mar 20, 2026
749f446
Merge branch 'develop' into new-update-duties
james-prysm Mar 20, 2026
a20b103
adding in promote duties optimization
james-prysm Mar 23, 2026
b475cec
tmp
james-prysm Mar 23, 2026
6dbf518
only using attester duties
james-prysm Mar 23, 2026
2d9ccbd
revert some changes, only use attestation dependent root, and adding …
james-prysm Mar 24, 2026
1468d11
add check if proposer and attester dependent roots diverged we refetch
james-prysm Mar 24, 2026
3e7e729
adding fork guards for future replacement of combined endpoint
james-prysm Mar 24, 2026
368d5a9
adding fork gating for split validator duties
james-prysm Mar 24, 2026
330e24b
Merge branch 'develop' into new-update-duties
james-prysm Mar 24, 2026
2e2703b
fixing bad merge
james-prysm Mar 24, 2026
2cd4514
Merge branch 'develop' into new-update-duties
james-prysm Mar 26, 2026
34ae364
Merge branch 'develop' into new-update-duties
james-prysm Mar 30, 2026
79eab4d
Merge branch 'develop' into new-update-duties
james-prysm Mar 30, 2026
54b18ee
Merge branch 'develop' into new-update-duties
james-prysm Mar 30, 2026
f501bfc
adding ptc duties next epoch
james-prysm Mar 30, 2026
1551d18
Merge branch 'develop' into new-update-duties
james-prysm Apr 8, 2026
4b3e632
Merge branch 'develop' into new-update-duties
james-prysm Apr 10, 2026
603f3ee
Merge branch 'develop' into new-update-duties
james-prysm Apr 14, 2026
c337466
Merge branch 'develop' into new-update-duties
james-prysm Apr 15, 2026
6a5331e
fixing test
james-prysm Apr 15, 2026
a6b60ce
bug fix and unit test
james-prysm Apr 15, 2026
d367d7d
Merge branch 'develop' into new-update-duties
james-prysm Apr 21, 2026
f1f69c1
Merge branch 'develop' into new-update-duties
james-prysm Apr 27, 2026
15bf96c
Merge branch 'develop' into new-update-duties
james-prysm Apr 30, 2026
e538e7a
Merge branch 'develop' into new-update-duties
james-prysm May 1, 2026
12afa7f
Merge branch 'develop' into new-update-duties
james-prysm May 1, 2026
33ba870
Merge branch 'develop' into new-update-duties
james-prysm May 6, 2026
4d3c455
applying manu's suggestions
james-prysm May 11, 2026
55b57a7
resolving manu's concern about validator drift during promotions
james-prysm May 13, 2026
d894388
manu's suggtion for function reuse
james-prysm May 13, 2026
72a3ad1
Merge branch 'develop' into new-update-duties
james-prysm May 13, 2026
d34a649
manu's suggestion on locks for submitted pref slots
james-prysm May 13, 2026
632904f
Merge branch 'develop' into new-update-duties
james-prysm May 13, 2026
19c39de
Merge branch 'develop' into new-update-duties
james-prysm May 13, 2026
76742d2
Merge branch 'develop' into new-update-duties
james-prysm May 18, 2026
3295a7e
Merge branch 'develop' into new-update-duties
james-prysm May 20, 2026
c8cd4e2
Merge branch 'develop' into new-update-duties
james-prysm May 21, 2026
92e0a72
manu's bug fix on promotion and safer duty store access
james-prysm May 22, 2026
952e511
Merge branch 'develop' into new-update-duties
james-prysm May 22, 2026
faf4a47
Merge branch 'develop' into new-update-duties
james-prysm May 26, 2026
0f4a20c
Merge branch 'develop' into new-update-duties
james-prysm May 27, 2026
60e9620
make duties store un exported
james-prysm Jun 2, 2026
a2178bd
cleaning up redundant loops
james-prysm Jun 2, 2026
0bfc24f
more feedback from manu
james-prysm Jun 3, 2026
3997a4e
linting
james-prysm Jun 3, 2026
c7db743
corrected slot lock handling
james-prysm Jun 8, 2026
7b3032f
Merge branch 'develop' into new-update-duties
james-prysm Jun 8, 2026
d045bfd
Merge branch 'develop' into new-update-duties
james-prysm Jun 8, 2026
df55945
Merge branch 'develop' into new-update-duties
james-prysm Jun 9, 2026
47cdd7e
Merge branch 'develop' into new-update-duties
james-prysm Jun 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions changelog/james-prysm_new-update-duties.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### Changed

- validator client begins to call new separate endpoints for duties post gloas instead of get duties v2.
2 changes: 1 addition & 1 deletion validator/client/aggregator_selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ func (p *distributedSelector) RefreshSelectionProofs(ctx context.Context) error

func (p *distributedSelector) fetchSelectionProofs(ctx context.Context) (map[attSelectionKey]iface.BeaconCommitteeSelection, error) {
var req []iface.BeaconCommitteeSelection
for pk, duty := range p.v.duties.CurrentEpochDuties() {
for pk, duty := range p.v.duties.snapshot().currentDuties() {
if duty.Status != ethpb.ValidatorStatus_ACTIVE && duty.Status != ethpb.ValidatorStatus_EXITING {
continue
}
Expand Down
60 changes: 36 additions & 24 deletions validator/client/aggregator_selector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,18 @@ func TestDistributedSelector_EpochGuard(t *testing.T) {
ds := v.aggSelector.(*distributedSelector)

slot := primitives.Slot(2) * params.BeaconConfig().SlotsPerEpoch
ds.v.duties.SetFromCombinedDutiesResponse(&ethpb.ValidatorDutiesContainer{
CurrentEpochDuties: []*ethpb.ValidatorDuty{{
AttesterSlot: slot,
ValidatorIndex: 200,
PublicKey: keys.pub[:],
Status: ethpb.ValidatorStatus_ACTIVE,
}},
})
{
var data dutyStoreData
data.setFromContainer(&ethpb.ValidatorDutiesContainer{
CurrentEpochDuties: []*ethpb.ValidatorDuty{{
AttesterSlot: slot,
ValidatorIndex: 200,
PublicKey: keys.pub[:],
Status: ethpb.ValidatorStatus_ACTIVE,
}},
})
ds.v.duties.write(data)
}

sigDomain := make([]byte, 32)
client.EXPECT().DomainData(gomock.Any(), gomock.Any()).
Expand All @@ -197,14 +201,18 @@ func TestDistributedSelector_ReadyCh_BlocksUntilRefresh(t *testing.T) {
ds := v.aggSelector.(*distributedSelector)

slot := primitives.Slot(3) * params.BeaconConfig().SlotsPerEpoch
ds.v.duties.SetFromCombinedDutiesResponse(&ethpb.ValidatorDutiesContainer{
CurrentEpochDuties: []*ethpb.ValidatorDuty{{
AttesterSlot: slot,
ValidatorIndex: 200,
PublicKey: keys.pub[:],
Status: ethpb.ValidatorStatus_ACTIVE,
}},
})
{
var data dutyStoreData
data.setFromContainer(&ethpb.ValidatorDutiesContainer{
CurrentEpochDuties: []*ethpb.ValidatorDuty{{
AttesterSlot: slot,
ValidatorIndex: 200,
PublicKey: keys.pub[:],
Status: ethpb.ValidatorStatus_ACTIVE,
}},
})
ds.v.duties.write(data)
}

proof := make([]byte, 96)
proof[0] = 0xAB
Expand Down Expand Up @@ -254,14 +262,18 @@ func TestDistributedSelector_ErrorIsStickyWithinEpoch(t *testing.T) {
ds := v.aggSelector.(*distributedSelector)

slot := primitives.Slot(4) * params.BeaconConfig().SlotsPerEpoch
ds.v.duties.SetFromCombinedDutiesResponse(&ethpb.ValidatorDutiesContainer{
CurrentEpochDuties: []*ethpb.ValidatorDuty{{
AttesterSlot: slot,
ValidatorIndex: 200,
PublicKey: keys.pub[:],
Status: ethpb.ValidatorStatus_ACTIVE,
}},
})
{
var data dutyStoreData
data.setFromContainer(&ethpb.ValidatorDutiesContainer{
CurrentEpochDuties: []*ethpb.ValidatorDuty{{
AttesterSlot: slot,
ValidatorIndex: 200,
PublicKey: keys.pub[:],
Status: ethpb.ValidatorStatus_ACTIVE,
}},
})
ds.v.duties.write(data)
}

sigDomain := make([]byte, 32)
client.EXPECT().DomainData(gomock.Any(), gomock.Any()).
Expand Down
7 changes: 3 additions & 4 deletions validator/client/attest.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,12 +191,11 @@ func (v *validator) SubmitAttestation(ctx context.Context, slot primitives.Slot,

// Given the validator public key, this gets the validator assignment.
func (v *validator) duty(pubKey [fieldparams.BLSPubkeyLength]byte) (*ethpb.ValidatorDuty, error) {
v.dutiesLock.RLock()
defer v.dutiesLock.RUnlock()
if !v.duties.IsInitialized() {
snap := v.duties.snapshot()
if !snap.isInitialized() {
return nil, errors.New("no duties for validators")
}
d, ok := v.duties.CurrentDuty(pubKey)
d, ok := snap.currentDuty(pubKey)
if !ok {
return nil, fmt.Errorf("pubkey %#x not in duties", bytesutil.Trunc(pubKey[:]))
}
Expand Down
32 changes: 32 additions & 0 deletions validator/client/beacon-api/beacon_api_validator_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,38 @@ func (c *beaconApiValidatorClient) Duties(ctx context.Context, in *ethpb.DutiesR
})
}

func (c *beaconApiValidatorClient) AttesterDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.AttesterDutiesResponse, error) {
ctx, span := trace.StartSpan(ctx, "beacon-api.AttesterDuties")
defer span.End()
return wrapInMetrics[*ethpb.AttesterDutiesResponse]("AttesterDuties", func() (*ethpb.AttesterDutiesResponse, error) {
return c.attesterDuties(ctx, epoch, validatorIndices)
})
}

func (c *beaconApiValidatorClient) ProposerDuties(ctx context.Context, epoch primitives.Epoch) (*ethpb.ProposerDutiesResponse, error) {
ctx, span := trace.StartSpan(ctx, "beacon-api.ProposerDuties")
defer span.End()
return wrapInMetrics[*ethpb.ProposerDutiesResponse]("ProposerDuties", func() (*ethpb.ProposerDutiesResponse, error) {
return c.proposerDuties(ctx, epoch)
})
}

func (c *beaconApiValidatorClient) SyncCommitteeDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.SyncCommitteeDutiesResponse, error) {
ctx, span := trace.StartSpan(ctx, "beacon-api.SyncCommitteeDuties")
defer span.End()
return wrapInMetrics[*ethpb.SyncCommitteeDutiesResponse]("SyncCommitteeDuties", func() (*ethpb.SyncCommitteeDutiesResponse, error) {
return c.syncCommitteeDuties(ctx, epoch, validatorIndices)
})
}

func (c *beaconApiValidatorClient) PTCDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.PTCDutiesResponse, error) {
ctx, span := trace.StartSpan(ctx, "beacon-api.PTCDuties")
defer span.End()
return wrapInMetrics[*ethpb.PTCDutiesResponse]("PTCDuties", func() (*ethpb.PTCDutiesResponse, error) {
return c.ptcDuties(ctx, epoch, validatorIndices)
})
}

func (c *beaconApiValidatorClient) CheckDoppelGanger(ctx context.Context, in *ethpb.DoppelGangerRequest) (*ethpb.DoppelGangerResponse, error) {
ctx, span := trace.StartSpan(ctx, "beacon-api.CheckDoppelGanger")
defer span.End()
Expand Down
8 changes: 4 additions & 4 deletions validator/client/beacon-api/duties.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ func (c *beaconApiValidatorClient) dutiesForEpoch(
return nil
}

func (c *beaconApiValidatorClient) AttesterDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.AttesterDutiesResponse, error) {
func (c *beaconApiValidatorClient) attesterDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.AttesterDutiesResponse, error) {
resp, err := c.dutiesProvider.AttesterDuties(ctx, epoch, validatorIndices)
if err != nil {
return nil, errors.Wrap(err, "failed to get attester duties")
Expand Down Expand Up @@ -284,7 +284,7 @@ func (c *beaconApiValidatorClient) AttesterDuties(ctx context.Context, epoch pri
}, nil
}

func (c *beaconApiValidatorClient) ProposerDuties(ctx context.Context, epoch primitives.Epoch) (*ethpb.ProposerDutiesResponse, error) {
func (c *beaconApiValidatorClient) proposerDuties(ctx context.Context, epoch primitives.Epoch) (*ethpb.ProposerDutiesResponse, error) {
resp, err := c.dutiesProvider.ProposerDuties(ctx, epoch)
if err != nil {
return nil, errors.Wrap(err, "failed to get proposer duties")
Expand Down Expand Up @@ -320,7 +320,7 @@ func (c *beaconApiValidatorClient) ProposerDuties(ctx context.Context, epoch pri
}, nil
}

func (c *beaconApiValidatorClient) SyncCommitteeDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.SyncCommitteeDutiesResponse, error) {
func (c *beaconApiValidatorClient) syncCommitteeDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.SyncCommitteeDutiesResponse, error) {
syncDuties, err := c.dutiesProvider.SyncDuties(ctx, epoch, validatorIndices)
if err != nil {
return nil, errors.Wrap(err, "failed to get sync committee duties")
Expand Down Expand Up @@ -535,7 +535,7 @@ func (c beaconApiDutiesProvider) PTCDuties(ctx context.Context, epoch primitives
return &ptcDuties, nil
}

func (c *beaconApiValidatorClient) PTCDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.PTCDutiesResponse, error) {
func (c *beaconApiValidatorClient) ptcDuties(ctx context.Context, epoch primitives.Epoch, validatorIndices []primitives.ValidatorIndex) (*ethpb.PTCDutiesResponse, error) {
resp, err := c.dutiesProvider.PTCDuties(ctx, epoch, validatorIndices)
if err != nil {
return nil, errors.Wrap(err, "failed to get PTC duties")
Expand Down
Loading
Loading