From 805473cb3835a3123f4056d25877eb46e24634f3 Mon Sep 17 00:00:00 2001 From: kasey <489222+kasey@users.noreply.github.com> Date: Wed, 28 Sep 2022 15:10:27 -0500 Subject: [PATCH] Give forkchoice to stategen (#11439) * add forkchoice to stategen.New, update everywhere * conflict_1 * Fix proposer_bellatrix test Co-authored-by: Potuz --- .../blockchain/chain_info_norace_test.go | 7 +- beacon-chain/blockchain/chain_info_test.go | 8 +- .../blockchain/execution_engine_test.go | 20 +-- .../head_sync_committee_info_test.go | 5 +- beacon-chain/blockchain/head_test.go | 2 +- beacon-chain/blockchain/mock_test.go | 2 +- beacon-chain/blockchain/pow_block_test.go | 4 +- .../blockchain/process_attestation_test.go | 121 ++---------------- beacon-chain/blockchain/process_block_test.go | 77 ++++++----- beacon-chain/blockchain/receive_block_test.go | 15 ++- beacon-chain/blockchain/service_test.go | 25 ++-- beacon-chain/execution/BUILD.bazel | 1 + beacon-chain/execution/service_test.go | 3 +- beacon-chain/monitor/BUILD.bazel | 1 + beacon-chain/monitor/service_test.go | 3 +- beacon-chain/node/node.go | 6 +- .../rpc/eth/validator/validator_test.go | 24 ++-- .../rpc/prysm/v1alpha1/beacon/BUILD.bazel | 1 + .../prysm/v1alpha1/beacon/assignments_test.go | 11 +- .../v1alpha1/beacon/attestations_test.go | 7 +- .../prysm/v1alpha1/beacon/committees_test.go | 7 +- .../prysm/v1alpha1/beacon/validators_test.go | 51 ++++---- .../rpc/prysm/v1alpha1/debug/BUILD.bazel | 1 + .../rpc/prysm/v1alpha1/debug/block_test.go | 3 +- .../rpc/prysm/v1alpha1/debug/state_test.go | 3 +- .../prysm/v1alpha1/validator/attester_test.go | 3 +- .../validator/proposer_bellatrix_test.go | 12 +- .../prysm/v1alpha1/validator/proposer_test.go | 9 +- beacon-chain/slasher/BUILD.bazel | 1 + beacon-chain/slasher/detect_blocks_test.go | 3 +- .../slasher/process_slashings_test.go | 5 +- beacon-chain/state/stategen/BUILD.bazel | 2 + beacon-chain/state/stategen/getter_test.go | 41 +++--- beacon-chain/state/stategen/migrate_test.go | 9 +- beacon-chain/state/stategen/replay_test.go | 11 +- beacon-chain/state/stategen/service.go | 5 +- beacon-chain/state/stategen/service_test.go | 3 +- beacon-chain/state/stategen/setter_test.go | 23 ++-- beacon-chain/sync/BUILD.bazel | 1 + .../sync/pending_blocks_queue_test.go | 15 ++- beacon-chain/sync/sync_fuzz_test.go | 7 +- .../sync/validate_beacon_blocks_test.go | 31 ++--- .../validate_sync_committee_message_test.go | 19 +-- .../validate_sync_contribution_proof_test.go | 29 +++-- .../shared/common/forkchoice/service.go | 5 +- 45 files changed, 296 insertions(+), 346 deletions(-) diff --git a/beacon-chain/blockchain/chain_info_norace_test.go b/beacon-chain/blockchain/chain_info_norace_test.go index a5babaa819..fdb4d1309d 100644 --- a/beacon-chain/blockchain/chain_info_norace_test.go +++ b/beacon-chain/blockchain/chain_info_norace_test.go @@ -5,6 +5,7 @@ import ( "testing" testDB "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" "github.com/prysmaticlabs/prysm/v3/consensus-types/blocks" ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1" @@ -32,7 +33,7 @@ func TestHeadSlot_DataRace(t *testing.T) { func TestHeadRoot_DataRace(t *testing.T) { beaconDB := testDB.SetupDB(t) s := &Service{ - cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB)}, + cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB, doublylinkedtree.New())}, head: &head{root: [32]byte{'A'}}, } b, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) @@ -54,7 +55,7 @@ func TestHeadBlock_DataRace(t *testing.T) { wsb, err := blocks.NewSignedBeaconBlock(ðpb.SignedBeaconBlock{Block: ðpb.BeaconBlock{Body: ðpb.BeaconBlockBody{}}}) require.NoError(t, err) s := &Service{ - cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB)}, + cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB, doublylinkedtree.New())}, head: &head{block: wsb}, } b, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) @@ -74,7 +75,7 @@ func TestHeadBlock_DataRace(t *testing.T) { func TestHeadState_DataRace(t *testing.T) { beaconDB := testDB.SetupDB(t) s := &Service{ - cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB)}, + cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB, doublylinkedtree.New())}, } b, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) require.NoError(t, err) diff --git a/beacon-chain/blockchain/chain_info_test.go b/beacon-chain/blockchain/chain_info_test.go index 9e6a1b929e..4c68d5fefd 100644 --- a/beacon-chain/blockchain/chain_info_test.go +++ b/beacon-chain/blockchain/chain_info_test.go @@ -84,7 +84,7 @@ func TestFinalizedCheckpt_GenesisRootOk(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), WithForkChoiceStore(fcs), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -109,7 +109,7 @@ func TestCurrentJustifiedCheckpt_CanRetrieve(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), WithForkChoiceStore(fcs), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -136,7 +136,7 @@ func TestHeadRoot_CanRetrieve(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), WithForkChoiceStore(fcs), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -155,7 +155,7 @@ func TestHeadRoot_UseDB(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), WithForkChoiceStore(fcs), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), } service, err := NewService(ctx, opts...) require.NoError(t, err) diff --git a/beacon-chain/blockchain/execution_engine_test.go b/beacon-chain/blockchain/execution_engine_test.go index 73803bea6f..519b21b187 100644 --- a/beacon-chain/blockchain/execution_engine_test.go +++ b/beacon-chain/blockchain/execution_engine_test.go @@ -42,7 +42,7 @@ func Test_NotifyForkchoiceUpdate(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), } @@ -431,7 +431,7 @@ func Test_NotifyNewPayload(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } phase0State, _ := util.DeterministicGenesisState(t, 1) @@ -677,7 +677,7 @@ func Test_NotifyNewPayload_SetOptimisticToValid(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } bellatrixState, _ := util.DeterministicGenesisStateBellatrix(t, 2) @@ -720,7 +720,7 @@ func Test_GetPayloadAttribute(t *testing.T) { beaconDB := testDB.SetupDB(t) opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, doublylinkedtree.New())), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), } @@ -762,8 +762,8 @@ func Test_UpdateLastValidatedCheckpoint(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - stateGen := stategen.New(beaconDB) fcs := doublylinkedtree.New() + stateGen := stategen.New(beaconDB, fcs) opts := []Option{ WithDatabase(beaconDB), WithStateGen(stateGen), @@ -876,10 +876,11 @@ func Test_UpdateLastValidatedCheckpoint(t *testing.T) { func TestService_removeInvalidBlockAndState(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -928,10 +929,11 @@ func TestService_removeInvalidBlockAndState(t *testing.T) { func TestService_getPayloadHash(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), } service, err := NewService(ctx, opts...) require.NoError(t, err) diff --git a/beacon-chain/blockchain/head_sync_committee_info_test.go b/beacon-chain/blockchain/head_sync_committee_info_test.go index bb5c80483b..5982c1d835 100644 --- a/beacon-chain/blockchain/head_sync_committee_info_test.go +++ b/beacon-chain/blockchain/head_sync_committee_info_test.go @@ -7,6 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/cache" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" dbtest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" "github.com/prysmaticlabs/prysm/v3/config/params" types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" @@ -19,7 +20,7 @@ func TestService_headSyncCommitteeFetcher_Errors(t *testing.T) { beaconDB := dbtest.SetupDB(t) c := &Service{ cfg: &config{ - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), }, } c.head = &head{} @@ -37,7 +38,7 @@ func TestService_HeadDomainFetcher_Errors(t *testing.T) { beaconDB := dbtest.SetupDB(t) c := &Service{ cfg: &config{ - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), }, } c.head = &head{} diff --git a/beacon-chain/blockchain/head_test.go b/beacon-chain/blockchain/head_test.go index 34875fc323..08da22fde0 100644 --- a/beacon-chain/blockchain/head_test.go +++ b/beacon-chain/blockchain/head_test.go @@ -479,7 +479,7 @@ func TestUpdateHead_noSavedChanges(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } diff --git a/beacon-chain/blockchain/mock_test.go b/beacon-chain/blockchain/mock_test.go index e2bb69ff47..eeba368f6c 100644 --- a/beacon-chain/blockchain/mock_test.go +++ b/beacon-chain/blockchain/mock_test.go @@ -16,7 +16,7 @@ func testServiceOptsWithDB(t *testing.T) []Option { fcs := doublylinkedtree.New() return []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } } diff --git a/beacon-chain/blockchain/pow_block_test.go b/beacon-chain/blockchain/pow_block_test.go index e8ecc56d91..96a49e268c 100644 --- a/beacon-chain/blockchain/pow_block_test.go +++ b/beacon-chain/blockchain/pow_block_test.go @@ -112,7 +112,7 @@ func Test_validateMergeBlock(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } service, err := NewService(ctx, opts...) @@ -162,7 +162,7 @@ func Test_getBlkParentHashAndTD(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } service, err := NewService(ctx, opts...) diff --git a/beacon-chain/blockchain/process_attestation_test.go b/beacon-chain/blockchain/process_attestation_test.go index dc905d76e8..12839bfed3 100644 --- a/beacon-chain/blockchain/process_attestation_test.go +++ b/beacon-chain/blockchain/process_attestation_test.go @@ -21,120 +21,15 @@ import ( "github.com/prysmaticlabs/prysm/v3/time/slots" ) -func TestStore_OnAttestation_ErrorConditions_ProtoArray(t *testing.T) { +func TestStore_OnAttestation_ErrorConditions(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithForkChoiceStore(doublylinkedtree.New()), - WithStateGen(stategen.New(beaconDB)), - } - service, err := NewService(ctx, opts...) - require.NoError(t, err) - - _, err = blockTree1(t, beaconDB, []byte{'g'}) - require.NoError(t, err) - - blkWithoutState := util.NewBeaconBlock() - blkWithoutState.Block.Slot = 0 - util.SaveBlock(t, ctx, beaconDB, blkWithoutState) - BlkWithOutStateRoot, err := blkWithoutState.Block.HashTreeRoot() - require.NoError(t, err) - - blkWithStateBadAtt := util.NewBeaconBlock() - blkWithStateBadAtt.Block.Slot = 1 - util.SaveBlock(t, ctx, beaconDB, blkWithStateBadAtt) - BlkWithStateBadAttRoot, err := blkWithStateBadAtt.Block.HashTreeRoot() - require.NoError(t, err) - - s, err := util.NewBeaconState() - require.NoError(t, err) - require.NoError(t, s.SetSlot(100*params.BeaconConfig().SlotsPerEpoch)) - require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, s, BlkWithStateBadAttRoot)) - - blkWithValidState := util.NewBeaconBlock() - blkWithValidState.Block.Slot = 2 - util.SaveBlock(t, ctx, beaconDB, blkWithValidState) - - blkWithValidStateRoot, err := blkWithValidState.Block.HashTreeRoot() - require.NoError(t, err) - s, err = util.NewBeaconState() - require.NoError(t, err) - err = s.SetFork(ðpb.Fork{ - Epoch: 0, - CurrentVersion: params.BeaconConfig().GenesisForkVersion, - PreviousVersion: params.BeaconConfig().GenesisForkVersion, - }) - require.NoError(t, err) - require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, s, blkWithValidStateRoot)) - - tests := []struct { - name string - a *ethpb.Attestation - wantedErr string - }{ - { - name: "attestation's data slot not aligned with target vote", - a: util.HydrateAttestation(ðpb.Attestation{Data: ðpb.AttestationData{Slot: params.BeaconConfig().SlotsPerEpoch, Target: ðpb.Checkpoint{Root: make([]byte, 32)}}}), - wantedErr: "slot 32 does not match target epoch 0", - }, - { - name: "no pre state for attestations's target block", - a: util.HydrateAttestation(ðpb.Attestation{Data: ðpb.AttestationData{Target: ðpb.Checkpoint{Root: BlkWithOutStateRoot[:]}}}), - wantedErr: "could not get pre state for epoch 0", - }, - { - name: "process attestation doesn't match current epoch", - a: util.HydrateAttestation(ðpb.Attestation{Data: ðpb.AttestationData{Slot: 100 * params.BeaconConfig().SlotsPerEpoch, Target: ðpb.Checkpoint{Epoch: 100, - Root: BlkWithStateBadAttRoot[:]}}}), - wantedErr: "target epoch 100 does not match current epoch", - }, - { - name: "process nil attestation", - a: nil, - wantedErr: "attestation can't be nil", - }, - { - name: "process nil field (a.Data) in attestation", - a: ðpb.Attestation{}, - wantedErr: "attestation's data can't be nil", - }, - { - name: "process nil field (a.Target) in attestation", - a: ðpb.Attestation{ - Data: ðpb.AttestationData{ - BeaconBlockRoot: make([]byte, fieldparams.RootLength), - Target: nil, - Source: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, - }, - AggregationBits: make([]byte, 1), - Signature: make([]byte, 96), - }, - wantedErr: "attestation's target can't be nil", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := service.OnAttestation(ctx, tt.a) - if tt.wantedErr != "" { - assert.ErrorContains(t, tt.wantedErr, err) - } else { - assert.NoError(t, err) - } - }) - } -} - -func TestStore_OnAttestation_ErrorConditions_DoublyLinkedTree(t *testing.T) { - ctx := context.Background() - beaconDB := testDB.SetupDB(t) - - opts := []Option{ - WithDatabase(beaconDB), - WithForkChoiceStore(doublylinkedtree.New()), - WithStateGen(stategen.New(beaconDB)), + WithForkChoiceStore(fc), + WithStateGen(stategen.New(beaconDB, fc)), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -240,7 +135,7 @@ func TestStore_OnAttestation_Ok_DoublyLinkedTree(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } service, err := NewService(ctx, opts...) @@ -269,7 +164,7 @@ func TestStore_SaveCheckpointState(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, doublylinkedtree.New())), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -331,7 +226,7 @@ func TestStore_UpdateCheckpointState(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, doublylinkedtree.New())), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -437,7 +332,7 @@ func TestVerifyFinalizedConsistency_InconsistentRoot_DoublyLinkedTree(t *testing fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } service, err := NewService(ctx, opts...) diff --git a/beacon-chain/blockchain/process_block_test.go b/beacon-chain/blockchain/process_block_test.go index 2aec50ff8f..b168c37f4b 100644 --- a/beacon-chain/blockchain/process_block_test.go +++ b/beacon-chain/blockchain/process_block_test.go @@ -52,7 +52,7 @@ func TestStore_OnBlock(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } @@ -145,10 +145,11 @@ func TestStore_OnBlockBatch(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -188,10 +189,11 @@ func TestStore_OnBlockBatch_NotifyNewPayload(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -223,10 +225,11 @@ func TestCachedPreState_CanGetFromStateSummary(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -252,7 +255,7 @@ func TestFillForkChoiceMissingBlocks_CanSave(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, doublylinkedtree.New())), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -301,7 +304,7 @@ func TestFillForkChoiceMissingBlocks_RootsMatch(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, doublylinkedtree.New())), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -352,7 +355,7 @@ func TestFillForkChoiceMissingBlocks_FilterFinalized(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, doublylinkedtree.New())), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -408,9 +411,10 @@ func TestFillForkChoiceMissingBlocks_FinalizedSibling(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fc)), } service, err := NewService(ctx, opts...) require.NoError(t, err) @@ -555,7 +559,7 @@ func TestAncestor_HandleSkipSlot(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } service, err := NewService(ctx, opts...) @@ -646,7 +650,7 @@ func TestAncestor_CanUseDB(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } service, err := NewService(ctx, opts...) @@ -708,7 +712,7 @@ func TestVerifyBlkDescendant(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } b := util.NewBeaconBlock() @@ -803,7 +807,7 @@ func TestOnBlock_CanFinalize_WithOnTick(t *testing.T) { require.NoError(t, err) opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithDepositCache(depositCache), WithStateNotifier(&mock.MockStateNotifier{}), @@ -853,7 +857,7 @@ func TestOnBlock_CanFinalize(t *testing.T) { require.NoError(t, err) opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithDepositCache(depositCache), WithStateNotifier(&mock.MockStateNotifier{}), @@ -901,7 +905,7 @@ func TestOnBlock_NilBlock(t *testing.T) { require.NoError(t, err) opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithDepositCache(depositCache), } @@ -920,7 +924,7 @@ func TestOnBlock_InvalidSignature(t *testing.T) { require.NoError(t, err) opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithDepositCache(depositCache), WithStateNotifier(&mock.MockStateNotifier{}), @@ -956,7 +960,7 @@ func TestOnBlock_CallNewPayloadAndForkchoiceUpdated(t *testing.T) { require.NoError(t, err) opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithDepositCache(depositCache), WithStateNotifier(&mock.MockStateNotifier{}), @@ -1169,7 +1173,7 @@ func Test_validateMergeTransitionBlock(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), WithAttestationPool(attestations.NewPool()), @@ -1307,7 +1311,7 @@ func TestService_insertSlashingsToForkChoiceStore(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), } @@ -1360,7 +1364,7 @@ func TestOnBlock_ProcessBlocksParallel(t *testing.T) { require.NoError(t, err) opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), WithDepositCache(depositCache), WithStateNotifier(&mock.MockStateNotifier{}), @@ -1438,7 +1442,7 @@ func Test_verifyBlkFinalizedSlot_invalidBlock(t *testing.T) { fcs := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fcs)), WithForkChoiceStore(fcs), } service, err := NewService(ctx, opts...) @@ -1469,11 +1473,12 @@ func TestStore_NoViableHead_FCU(t *testing.T) { beaconDB := testDB.SetupDB(t) mockEngine := &mockExecution.EngineClient{ErrNewPayload: execution.ErrAcceptedSyncingPayloadStatus, ErrForkchoiceUpdated: execution.ErrAcceptedSyncingPayloadStatus} + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), WithAttestationPool(attestations.NewPool()), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), WithStateNotifier(&mock.MockStateNotifier{}), WithExecutionEngineCaller(mockEngine), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), @@ -1628,11 +1633,12 @@ func TestStore_NoViableHead_NewPayload(t *testing.T) { beaconDB := testDB.SetupDB(t) mockEngine := &mockExecution.EngineClient{ErrNewPayload: execution.ErrAcceptedSyncingPayloadStatus, ErrForkchoiceUpdated: execution.ErrAcceptedSyncingPayloadStatus} + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), WithAttestationPool(attestations.NewPool()), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), WithStateNotifier(&mock.MockStateNotifier{}), WithExecutionEngineCaller(mockEngine), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), @@ -1788,11 +1794,12 @@ func TestStore_NoViableHead_Liveness(t *testing.T) { beaconDB := testDB.SetupDB(t) mockEngine := &mockExecution.EngineClient{ErrNewPayload: execution.ErrAcceptedSyncingPayloadStatus, ErrForkchoiceUpdated: execution.ErrAcceptedSyncingPayloadStatus} + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), WithAttestationPool(attestations.NewPool()), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), WithStateNotifier(&mock.MockStateNotifier{}), WithExecutionEngineCaller(mockEngine), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), @@ -1997,11 +2004,12 @@ func TestStore_NoViableHead_Liveness_Protoarray(t *testing.T) { beaconDB := testDB.SetupDB(t) mockEngine := &mockExecution.EngineClient{ErrNewPayload: execution.ErrAcceptedSyncingPayloadStatus, ErrForkchoiceUpdated: execution.ErrAcceptedSyncingPayloadStatus} + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), WithAttestationPool(attestations.NewPool()), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), WithStateNotifier(&mock.MockStateNotifier{}), WithExecutionEngineCaller(mockEngine), WithProposerIdsCache(cache.NewProposerPayloadIDsCache()), @@ -2212,7 +2220,7 @@ func noViableHead_Reboot(t *testing.T) { opts := []Option{ WithDatabase(beaconDB), WithAttestationPool(attestations.NewPool()), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, newfc)), WithForkChoiceStore(newfc), WithStateNotifier(&mock.MockStateNotifier{}), WithExecutionEngineCaller(mockEngine), @@ -2417,11 +2425,12 @@ func noViableHead_Reboot(t *testing.T) { func TestOnBlock_HandleBlockAttestations(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), WithAttestationPool(attestations.NewPool()), - WithStateGen(stategen.New(beaconDB)), - WithForkChoiceStore(doublylinkedtree.New()), + WithStateGen(stategen.New(beaconDB, fc)), + WithForkChoiceStore(fc), WithStateNotifier(&mock.MockStateNotifier{}), } service, err := NewService(ctx, opts...) diff --git a/beacon-chain/blockchain/receive_block_test.go b/beacon-chain/blockchain/receive_block_test.go index 45b9c3f850..ef0dec85fb 100644 --- a/beacon-chain/blockchain/receive_block_test.go +++ b/beacon-chain/blockchain/receive_block_test.go @@ -127,13 +127,14 @@ func TestService_ReceiveBlock(t *testing.T) { genesisBlockRoot := bytesutil.ToBytes32(nil) require.NoError(t, beaconDB.SaveState(ctx, genesis, genesisBlockRoot)) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithForkChoiceStore(doublylinkedtree.New()), + WithForkChoiceStore(fc), WithAttestationPool(attestations.NewPool()), WithExitPool(voluntaryexits.NewPool()), WithStateNotifier(&blockchainTesting.MockStateNotifier{RecordEvents: true}), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fc)), WithFinalizedStateAtStartUp(genesis), } s, err := NewService(ctx, opts...) @@ -166,13 +167,14 @@ func TestService_ReceiveBlockUpdateHead(t *testing.T) { beaconDB := testDB.SetupDB(t) genesisBlockRoot := bytesutil.ToBytes32(nil) require.NoError(t, beaconDB.SaveState(ctx, genesis, genesisBlockRoot)) + fc := doublylinkedtree.New() opts := []Option{ WithDatabase(beaconDB), - WithForkChoiceStore(doublylinkedtree.New()), + WithForkChoiceStore(fc), WithAttestationPool(attestations.NewPool()), WithExitPool(voluntaryexits.NewPool()), WithStateNotifier(&blockchainTesting.MockStateNotifier{RecordEvents: true}), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fc)), } s, err := NewService(ctx, opts...) @@ -242,12 +244,13 @@ func TestService_ReceiveBlockBatch(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + fc := doublylinkedtree.New() beaconDB := testDB.SetupDB(t) opts := []Option{ WithDatabase(beaconDB), - WithForkChoiceStore(doublylinkedtree.New()), + WithForkChoiceStore(fc), WithStateNotifier(&blockchainTesting.MockStateNotifier{RecordEvents: true}), - WithStateGen(stategen.New(beaconDB)), + WithStateGen(stategen.New(beaconDB, fc)), } s, err := NewService(ctx, opts...) require.NoError(t, err) diff --git a/beacon-chain/blockchain/service_test.go b/beacon-chain/blockchain/service_test.go index da9afb252c..b4df415410 100644 --- a/beacon-chain/blockchain/service_test.go +++ b/beacon-chain/blockchain/service_test.go @@ -117,7 +117,8 @@ func setupBeaconChain(t *testing.T, beaconDB db.Database) *Service { depositCache, err := depositcache.New() require.NoError(t, err) - stateGen := stategen.New(beaconDB) + fc := doublylinkedtree.New() + stateGen := stategen.New(beaconDB, fc) // Safe a state in stategen to purposes of testing a service stop / shutdown. require.NoError(t, stateGen.SaveState(ctx, bytesutil.ToBytes32(bState.FinalizedCheckpoint().Root), bState)) @@ -128,7 +129,7 @@ func setupBeaconChain(t *testing.T, beaconDB db.Database) *Service { WithAttestationPool(attestations.NewPool()), WithP2PBroadcaster(&mockBroadcaster{}), WithStateNotifier(&mockBeaconNode{}), - WithForkChoiceStore(doublylinkedtree.New()), + WithForkChoiceStore(fc), WithAttestationService(attService), WithStateGen(stateGen), } @@ -305,9 +306,10 @@ func TestChainService_InitializeChainInfo(t *testing.T) { require.NoError(t, beaconDB.SaveFinalizedCheckpoint(ctx, ðpb.Checkpoint{Epoch: slots.ToEpoch(finalizedSlot), Root: headRoot[:]})) attSrv, err := attestations.NewService(ctx, &attestations.Config{}) require.NoError(t, err) - stateGen := stategen.New(beaconDB) + fc := doublylinkedtree.New() + stateGen := stategen.New(beaconDB, fc) c, err := NewService(ctx, - WithForkChoiceStore(doublylinkedtree.New()), + WithForkChoiceStore(fc), WithDatabase(beaconDB), WithStateGen(stateGen), WithAttestationService(attSrv), @@ -364,9 +366,10 @@ func TestChainService_InitializeChainInfo_SetHeadAtGenesis(t *testing.T) { } require.NoError(t, beaconDB.SaveStateSummary(ctx, ss)) require.NoError(t, beaconDB.SaveFinalizedCheckpoint(ctx, ðpb.Checkpoint{Root: headRoot[:], Epoch: slots.ToEpoch(finalizedSlot)})) - stateGen := stategen.New(beaconDB) + fc := doublylinkedtree.New() + stateGen := stategen.New(beaconDB, fc) c, err := NewService(ctx, - WithForkChoiceStore(doublylinkedtree.New()), + WithForkChoiceStore(fc), WithDatabase(beaconDB), WithStateGen(stateGen), WithAttestationService(attSrv), @@ -387,8 +390,9 @@ func TestChainService_InitializeChainInfo_SetHeadAtGenesis(t *testing.T) { func TestChainService_SaveHeadNoDB(t *testing.T) { beaconDB := testDB.SetupDB(t) ctx := context.Background() + fc := doublylinkedtree.New() s := &Service{ - cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB), ForkChoiceStore: doublylinkedtree.New()}, + cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB, fc), ForkChoiceStore: fc}, } blk := util.NewBeaconBlock() blk.Block.Slot = 1 @@ -431,7 +435,7 @@ func TestServiceStop_SaveCachedBlocks(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) beaconDB := testDB.SetupDB(t) s := &Service{ - cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB)}, + cfg: &config{BeaconDB: beaconDB, StateGen: stategen.New(beaconDB, doublylinkedtree.New())}, ctx: ctx, cancel: cancel, initSyncBlocks: make(map[[32]byte]interfaces.SignedBeaconBlock), @@ -531,9 +535,10 @@ func TestChainService_EverythingOptimistic(t *testing.T) { require.NoError(t, beaconDB.SaveFinalizedCheckpoint(ctx, ðpb.Checkpoint{Epoch: slots.ToEpoch(finalizedSlot), Root: headRoot[:]})) attSrv, err := attestations.NewService(ctx, &attestations.Config{}) require.NoError(t, err) - stateGen := stategen.New(beaconDB) + fc := doublylinkedtree.New() + stateGen := stategen.New(beaconDB, fc) c, err := NewService(ctx, - WithForkChoiceStore(doublylinkedtree.New()), + WithForkChoiceStore(fc), WithDatabase(beaconDB), WithStateGen(stateGen), WithAttestationService(attSrv), diff --git a/beacon-chain/execution/BUILD.bazel b/beacon-chain/execution/BUILD.bazel index 79a90bb64c..cae0d87e8e 100644 --- a/beacon-chain/execution/BUILD.bazel +++ b/beacon-chain/execution/BUILD.bazel @@ -102,6 +102,7 @@ go_test( "//beacon-chain/db/testing:go_default_library", "//beacon-chain/execution/testing:go_default_library", "//beacon-chain/execution/types:go_default_library", + "//beacon-chain/forkchoice/doubly-linked-tree:go_default_library", "//beacon-chain/state/stategen:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/execution/service_test.go b/beacon-chain/execution/service_test.go index 84dc28fbd6..ca6c616830 100644 --- a/beacon-chain/execution/service_test.go +++ b/beacon-chain/execution/service_test.go @@ -20,6 +20,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/cache/depositcache" dbutil "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" mockExecution "github.com/prysmaticlabs/prysm/v3/beacon-chain/execution/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" "github.com/prysmaticlabs/prysm/v3/config/params" contracts "github.com/prysmaticlabs/prysm/v3/contracts/deposit" @@ -469,7 +470,7 @@ func TestInitDepositCacheWithFinalization_OK(t *testing.T) { headBlock := util.NewBeaconBlock() headRoot, err := headBlock.Block.HashTreeRoot() require.NoError(t, err) - stateGen := stategen.New(beaconDB) + stateGen := stategen.New(beaconDB, doublylinkedtree.New()) emptyState, err := util.NewBeaconState() require.NoError(t, err) diff --git a/beacon-chain/monitor/BUILD.bazel b/beacon-chain/monitor/BUILD.bazel index 27216e8408..b7b1b8be9d 100644 --- a/beacon-chain/monitor/BUILD.bazel +++ b/beacon-chain/monitor/BUILD.bazel @@ -54,6 +54,7 @@ go_test( "//beacon-chain/core/feed:go_default_library", "//beacon-chain/core/feed/state:go_default_library", "//beacon-chain/db/testing:go_default_library", + "//beacon-chain/forkchoice/doubly-linked-tree:go_default_library", "//beacon-chain/state/stategen:go_default_library", "//config/params:go_default_library", "//consensus-types/blocks:go_default_library", diff --git a/beacon-chain/monitor/service_test.go b/beacon-chain/monitor/service_test.go index 3a46d21744..f07b6d20db 100644 --- a/beacon-chain/monitor/service_test.go +++ b/beacon-chain/monitor/service_test.go @@ -12,6 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/feed" statefeed "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/feed/state" testDB "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" "github.com/prysmaticlabs/prysm/v3/consensus-types/blocks" types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" @@ -88,7 +89,7 @@ func setupService(t *testing.T) *Service { } return &Service{ config: &ValidatorMonitorConfig{ - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), StateNotifier: chainService.StateNotifier(), HeadFetcher: chainService, AttestationNotifier: chainService.OperationNotifier(), diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 3496c6d038..bf03777a05 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -201,7 +201,7 @@ func New(cliCtx *cli.Context, opts ...Option) (*BeaconNode, error) { } log.Debugln("Starting State Gen") - if err := beacon.startStateGen(ctx, bfs); err != nil { + if err := beacon.startStateGen(ctx, bfs, beacon.forkChoicer); err != nil { return nil, err } @@ -480,9 +480,9 @@ func (b *BeaconNode) startSlasherDB(cliCtx *cli.Context) error { return nil } -func (b *BeaconNode) startStateGen(ctx context.Context, bfs *backfill.Status) error { +func (b *BeaconNode) startStateGen(ctx context.Context, bfs *backfill.Status, fc forkchoice.ForkChoicer) error { opts := []stategen.StateGenOption{stategen.WithBackfillStatus(bfs)} - sg := stategen.New(b.db, opts...) + sg := stategen.New(b.db, fc, opts...) cp, err := b.db.FinalizedCheckpoint(ctx) if err != nil { diff --git a/beacon-chain/rpc/eth/validator/validator_test.go b/beacon-chain/rpc/eth/validator/validator_test.go index 63615c8334..65bffa7c9a 100644 --- a/beacon-chain/rpc/eth/validator/validator_test.go +++ b/beacon-chain/rpc/eth/validator/validator_test.go @@ -679,7 +679,7 @@ func TestProduceBlockV2(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } proposerSlashings := make([]*ethpbalpha.ProposerSlashing, params.BeaconConfig().MaxProposerSlashings) @@ -783,7 +783,7 @@ func TestProduceBlockV2(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), } @@ -932,7 +932,7 @@ func TestProduceBlockV2(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ProposerSlotIndexCache: cache.NewProposerPayloadIDsCache(), BlockBuilder: &builderTest.MockBuilderService{ @@ -1062,7 +1062,7 @@ func TestProduceBlockV2SSZ(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } proposerSlashings := make([]*ethpbalpha.ProposerSlashing, 1) @@ -1223,7 +1223,7 @@ func TestProduceBlockV2SSZ(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), } @@ -1427,7 +1427,7 @@ func TestProduceBlockV2SSZ(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ProposerSlotIndexCache: cache.NewProposerPayloadIDsCache(), BlockBuilder: &builderTest.MockBuilderService{ @@ -1652,7 +1652,7 @@ func TestProduceBlindedBlock(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } proposerSlashings := make([]*ethpbalpha.ProposerSlashing, params.BeaconConfig().MaxProposerSlashings) @@ -1756,7 +1756,7 @@ func TestProduceBlindedBlock(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), } @@ -1949,7 +1949,7 @@ func TestProduceBlindedBlock(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ProposerSlotIndexCache: cache.NewProposerPayloadIDsCache(), BlockBuilder: &builderTest.MockBuilderService{ @@ -2084,7 +2084,7 @@ func TestProduceBlindedBlockSSZ(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } proposerSlashings := make([]*ethpbalpha.ProposerSlashing, 1) @@ -2245,7 +2245,7 @@ func TestProduceBlindedBlockSSZ(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), } @@ -2449,7 +2449,7 @@ func TestProduceBlindedBlockSSZ(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ProposerSlotIndexCache: cache.NewProposerPayloadIDsCache(), } diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel index 0eb62189a5..690055a2c7 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel @@ -98,6 +98,7 @@ go_test( "//beacon-chain/core/transition:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/db/testing:go_default_library", + "//beacon-chain/forkchoice/doubly-linked-tree:go_default_library", "//beacon-chain/operations/attestations:go_default_library", "//beacon-chain/operations/slashings:go_default_library", "//beacon-chain/p2p/testing:go_default_library", diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go index ae59c4458e..8748c7462c 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go @@ -10,6 +10,7 @@ import ( mock "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/helpers" dbTest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" mockstategen "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen/mock" "github.com/prysmaticlabs/prysm/v3/cmd" @@ -60,7 +61,7 @@ func TestServer_ListAssignments_NoResults(t *testing.T) { bs := &Server{ BeaconDB: db, GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), ReplayerBuilder: mockstategen.NewMockReplayerBuilder(mockstategen.WithMockState(st)), } wanted := ðpb.ValidatorAssignments{ @@ -122,7 +123,7 @@ func TestServer_ListAssignments_Pagination_InputOutOfRange(t *testing.T) { }, }, GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), ReplayerBuilder: mockstategen.NewMockReplayerBuilder(mockstategen.WithMockState(s)), } @@ -198,7 +199,7 @@ func TestServer_ListAssignments_Pagination_DefaultPageSize_NoArchive(t *testing. }, }, GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), ReplayerBuilder: mockstategen.NewMockReplayerBuilder(mockstategen.WithMockState(s)), } @@ -265,7 +266,7 @@ func TestServer_ListAssignments_FilterPubkeysIndices_NoPagination(t *testing.T) }, }, GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), ReplayerBuilder: mockstategen.NewMockReplayerBuilder(mockstategen.WithMockState(s)), } @@ -336,7 +337,7 @@ func TestServer_ListAssignments_CanFilterPubkeysIndices_WithPagination(t *testin }, }, GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } addDefaultReplayerBuilder(bs, db) diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go index 7e2ac8b630..b4fc67ea95 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go @@ -16,6 +16,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" dbTest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/attestations" state_native "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/state-native" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" @@ -569,7 +570,7 @@ func TestServer_ListIndexedAttestations_GenesisEpoch(t *testing.T) { BeaconDB: db, GenesisTimeFetcher: &chainMock.ChainService{State: state}, HeadFetcher: &chainMock.ChainService{State: state}, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } err := db.SaveStateSummary(ctx, ðpb.StateSummary{ Root: targetRoot1[:], @@ -669,7 +670,7 @@ func TestServer_ListIndexedAttestations_OldEpoch(t *testing.T) { GenesisTimeFetcher: &chainMock.ChainService{ Genesis: time.Now(), }, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } err = db.SaveStateSummary(ctx, ðpb.StateSummary{ Root: blockRoot[:], @@ -940,7 +941,7 @@ func TestServer_StreamIndexedAttestations_OK(t *testing.T) { }, AttestationNotifier: chainService.OperationNotifier(), CollectedAttestationsBuffer: make(chan []*ethpb.Attestation, 1), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } for dataRoot, sameDataAtts := range atts { diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go index c49d09e847..a7fe0d92ce 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go @@ -10,6 +10,7 @@ import ( mock "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/helpers" dbTest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" mockstategen "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen/mock" @@ -42,7 +43,7 @@ func TestServer_ListBeaconCommittees_CurrentEpoch(t *testing.T) { bs := &Server{ HeadFetcher: m, GenesisTimeFetcher: m, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } b := util.NewBeaconBlock() util.SaveBlock(t, ctx, db, b) @@ -115,7 +116,7 @@ func TestServer_ListBeaconCommittees_PreviousEpoch(t *testing.T) { bs := &Server{ HeadFetcher: m, GenesisTimeFetcher: m, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } addDefaultReplayerBuilder(bs, db) @@ -170,7 +171,7 @@ func TestRetrieveCommitteesForRoot(t *testing.T) { bs := &Server{ HeadFetcher: m, GenesisTimeFetcher: m, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } b := util.NewBeaconBlock() util.SaveBlock(t, ctx, db, b) diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go index 5a32e76554..31dee7dd3d 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go @@ -18,6 +18,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/v3/beacon-chain/db" dbTest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state" state_native "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/state-native" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" @@ -107,7 +108,7 @@ func TestServer_ListValidatorBalances_NoResults(t *testing.T) { require.NoError(t, st.SetSlot(0)) bs := &Server{ GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } headState, err := util.NewBeaconState() @@ -174,7 +175,7 @@ func TestServer_ListValidatorBalances_DefaultResponse_NoArchive(t *testing.T) { require.NoError(t, beaconDB.SaveState(ctx, st, gRoot)) bs := &Server{ GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), HeadFetcher: &mock.ChainService{ State: st, }, @@ -203,7 +204,7 @@ func TestServer_ListValidatorBalances_PaginationOutOfRange(t *testing.T) { bs := &Server{ GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), HeadFetcher: &mock.ChainService{ State: headState, }, @@ -252,7 +253,7 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) { bs := &Server{ GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), HeadFetcher: &mock.ChainService{ State: headState, }, @@ -336,7 +337,7 @@ func TestServer_ListValidatorBalances_Pagination_CustomPageSizes(t *testing.T) { bs := &Server{ GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), HeadFetcher: &mock.ChainService{ State: headState, }, @@ -404,7 +405,7 @@ func TestServer_ListValidatorBalances_OutOfRange(t *testing.T) { bs := &Server{ GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), HeadFetcher: &mock.ChainService{ State: headState, }, @@ -500,7 +501,7 @@ func TestServer_ListValidators_NoResults(t *testing.T) { HeadFetcher: &mock.ChainService{ State: st, }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } wanted := ðpb.Validators{ ValidatorList: make([]*ethpb.Validators_ValidatorContainer, 0), @@ -567,7 +568,7 @@ func TestServer_ListValidators_OnlyActiveValidators(t *testing.T) { // We are in epoch 0. Genesis: time.Now(), }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } b := util.NewBeaconBlock() @@ -635,7 +636,7 @@ func TestServer_ListValidators_InactiveInTheMiddle(t *testing.T) { // We are in epoch 0. Genesis: time.Now(), }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } b := util.NewBeaconBlock() @@ -667,7 +668,7 @@ func TestServer_ListValidatorBalances_UnknownValidatorInResponse(t *testing.T) { bs := &Server{ GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), HeadFetcher: &mock.ChainService{ State: headState, }, @@ -725,7 +726,7 @@ func TestServer_ListValidators_NoPagination(t *testing.T) { Epoch: 0, }, }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } received, err := bs.ListValidators(context.Background(), ðpb.ListValidatorsRequest{}) @@ -791,7 +792,7 @@ func TestServer_ListValidators_IndicesPubKeys(t *testing.T) { // We are in epoch 0. Genesis: time.Now(), }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } pubKeysWanted := make([][]byte, len(pubkeyIndicesWanted)) @@ -827,7 +828,7 @@ func TestServer_ListValidators_Pagination(t *testing.T) { // We are in epoch 0. Genesis: time.Now(), }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } tests := []struct { @@ -964,7 +965,7 @@ func TestServer_ListValidators_PaginationOutOfRange(t *testing.T) { // We are in epoch 0. Genesis: time.Now(), }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } req := ðpb.ListValidatorsRequest{PageToken: strconv.Itoa(1), PageSize: 100} @@ -1008,7 +1009,7 @@ func TestServer_ListValidators_DefaultPageSize(t *testing.T) { // We are in epoch 0. Genesis: time.Now(), }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } req := ðpb.ListValidatorsRequest{} @@ -1132,7 +1133,7 @@ func TestServer_ListValidators_ProcessHeadStateSlots(t *testing.T) { GenesisTimeFetcher: &mock.ChainService{ Genesis: time.Now().Add(time.Duration(-1*int64(secondsPerEpoch)) * time.Second), }, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } req := ðpb.ListValidatorsRequest{ @@ -1489,7 +1490,7 @@ func TestServer_GetValidatorParticipation_CannotRequestFutureEpoch(t *testing.T) State: headState, }, GenesisTimeFetcher: &mock.ChainService{}, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), } wanted := "Cannot retrieve information about an epoch" @@ -1552,7 +1553,7 @@ func TestServer_GetValidatorParticipation_CurrentAndPrevEpoch(t *testing.T) { bs := &Server{ BeaconDB: beaconDB, HeadFetcher: m, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), GenesisTimeFetcher: &mock.ChainService{ Genesis: prysmTime.Now().Add(time.Duration(-1*offset) * time.Second), }, @@ -1631,7 +1632,7 @@ func TestServer_GetValidatorParticipation_OrphanedUntilGenesis(t *testing.T) { bs := &Server{ BeaconDB: beaconDB, HeadFetcher: m, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), GenesisTimeFetcher: &mock.ChainService{ Genesis: prysmTime.Now().Add(time.Duration(-1*offset) * time.Second), }, @@ -1729,7 +1730,7 @@ func runGetValidatorParticipationCurrentAndPrevEpoch(t *testing.T, genState stat bs := &Server{ BeaconDB: beaconDB, HeadFetcher: m, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), GenesisTimeFetcher: &mock.ChainService{ Genesis: prysmTime.Now().Add(time.Duration(-1*offset) * time.Second), }, @@ -2210,7 +2211,7 @@ func TestServer_GetIndividualVotes_ValidatorsDontExist(t *testing.T) { util.SaveBlock(t, ctx, beaconDB, b) gRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) - gen := stategen.New(beaconDB) + gen := stategen.New(beaconDB, doublylinkedtree.New()) require.NoError(t, gen.SaveState(ctx, gRoot, beaconState)) require.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) @@ -2306,7 +2307,7 @@ func TestServer_GetIndividualVotes_Working(t *testing.T) { util.SaveBlock(t, ctx, beaconDB, b) gRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) - gen := stategen.New(beaconDB) + gen := stategen.New(beaconDB, doublylinkedtree.New()) require.NoError(t, gen.SaveState(ctx, gRoot, beaconState)) require.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) @@ -2369,7 +2370,7 @@ func TestServer_GetIndividualVotes_WorkingAltair(t *testing.T) { util.SaveBlock(t, ctx, beaconDB, b) gRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) - gen := stategen.New(beaconDB) + gen := stategen.New(beaconDB, doublylinkedtree.New()) require.NoError(t, gen.SaveState(ctx, gRoot, beaconState)) require.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) @@ -2433,7 +2434,7 @@ func TestServer_GetIndividualVotes_AltairEndOfEpoch(t *testing.T) { util.SaveBlock(t, ctx, beaconDB, b) gRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) - gen := stategen.New(beaconDB) + gen := stategen.New(beaconDB, doublylinkedtree.New()) require.NoError(t, gen.SaveState(ctx, gRoot, beaconState)) require.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) @@ -2521,7 +2522,7 @@ func TestServer_GetIndividualVotes_BellatrixEndOfEpoch(t *testing.T) { util.SaveBlock(t, ctx, beaconDB, b) gRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) - gen := stategen.New(beaconDB) + gen := stategen.New(beaconDB, doublylinkedtree.New()) require.NoError(t, gen.SaveState(ctx, gRoot, beaconState)) require.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel index dbb30de250..4aa00860b8 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel @@ -46,6 +46,7 @@ go_test( "//beacon-chain/blockchain/testing:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/db/testing:go_default_library", + "//beacon-chain/forkchoice/doubly-linked-tree:go_default_library", "//beacon-chain/p2p/testing:go_default_library", "//beacon-chain/state/stategen:go_default_library", "//beacon-chain/state/stategen/mock:go_default_library", diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go b/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go index f41ceea362..4f7b2ca971 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go @@ -9,6 +9,7 @@ import ( mock "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/helpers" dbTest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" fieldparams "github.com/prysmaticlabs/prysm/v3/config/fieldparams" "github.com/prysmaticlabs/prysm/v3/config/params" @@ -53,7 +54,7 @@ func TestServer_GetAttestationInclusionSlot(t *testing.T) { offset := int64(2 * params.BeaconConfig().SlotsPerEpoch.Mul(params.BeaconConfig().SecondsPerSlot)) bs := &Server{ BeaconDB: db, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), GenesisTimeFetcher: &mock.ChainService{Genesis: time.Now().Add(time.Duration(-1*offset) * time.Second)}, } diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go b/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go index a8a28a4f6d..15caf4149f 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go @@ -7,6 +7,7 @@ import ( mock "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" dbTest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" mockstategen "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen/mock" types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" @@ -34,7 +35,7 @@ func TestServer_GetBeaconState(t *testing.T) { util.SaveBlock(t, ctx, db, b) gRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) - gen := stategen.New(db) + gen := stategen.New(db, doublylinkedtree.New()) require.NoError(t, gen.SaveState(ctx, gRoot, st)) require.NoError(t, db.SaveState(ctx, st, gRoot)) bs := &Server{ diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go index 72d68734a5..8d7fd4e460 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go @@ -10,6 +10,7 @@ import ( mock "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/cache" dbutil "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/attestations" mockp2p "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/testing" state_native "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/state-native" @@ -334,7 +335,7 @@ func TestServer_GetAttestationData_HeadStateSlotGreaterThanRequestSlot(t *testin FinalizationFetcher: &mock.ChainService{CurrentJustifiedCheckPoint: beaconState.CurrentJustifiedCheckpoint()}, TimeFetcher: &mock.ChainService{Genesis: time.Now().Add(time.Duration(-1*offset) * time.Second)}, StateNotifier: chainService.StateNotifier(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } require.NoError(t, db.SaveState(ctx, beaconState, blockRoot)) util.SaveBlock(t, ctx, db, block) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go index 4e245c9f97..7a6fe175a1 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go @@ -55,7 +55,7 @@ func TestServer_buildHeaderBlock(t *testing.T) { proposerServer := &Server{ BeaconDB: db, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } b, err := util.GenerateFullBlockAltair(copiedState, keys, util.DefaultBlockGenConfig(), 1) require.NoError(t, err) @@ -66,7 +66,7 @@ func TestServer_buildHeaderBlock(t *testing.T) { b1, err := util.GenerateFullBlockAltair(copiedState, keys, util.DefaultBlockGenConfig(), 2) require.NoError(t, err) - vs := &Server{StateGen: stategen.New(db), BeaconDB: db} + vs := &Server{StateGen: stategen.New(db, doublylinkedtree.New()), BeaconDB: db} h := &v1.ExecutionPayloadHeader{ BlockNumber: 123, GasLimit: 456, @@ -484,7 +484,7 @@ func TestServer_getAndBuildHeaderBlock(t *testing.T) { Timestamp: ts, } - vs.StateGen = stategen.New(vs.BeaconDB) + vs.StateGen = stategen.New(vs.BeaconDB, doublylinkedtree.New()) vs.GenesisFetcher = &blockchainTest.ChainService{} vs.ForkFetcher = &blockchainTest.ChainService{Fork: ðpb.Fork{}} @@ -603,7 +603,7 @@ func TestServer_GetBellatrixBeaconBlock_HappyCase(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ExecutionEngineCaller: &mockExecution.EngineClient{ PayloadIDBytes: &v1.PayloadIDBytes{1}, @@ -705,7 +705,7 @@ func TestServer_GetBellatrixBeaconBlock_LocalProgressingWithBuilderSkipped(t *te AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ExecutionEngineCaller: &mockExecution.EngineClient{ PayloadIDBytes: &v1.PayloadIDBytes{1}, @@ -840,7 +840,7 @@ func TestServer_GetBellatrixBeaconBlock_BuilderCase(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ExecutionEngineCaller: &mockExecution.EngineClient{ PayloadIDBytes: &v1.PayloadIDBytes{1}, diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go index 460ff4855c..ad40f57ee1 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go @@ -21,6 +21,7 @@ import ( coretime "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/time" dbutil "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" mockExecution "github.com/prysmaticlabs/prysm/v3/beacon-chain/execution/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/attestations" "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/slashings" "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/synccommittee" @@ -133,7 +134,7 @@ func TestProposer_ComputeStateRoot_OK(t *testing.T) { ChainStartFetcher: &mockExecution.Chain{}, Eth1InfoFetcher: &mockExecution.Chain{}, Eth1BlockFetcher: &mockExecution.Chain{}, - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), } req := util.NewBeaconBlock() req.Block.ProposerIndex = 84 @@ -1920,7 +1921,7 @@ func TestProposer_GetBeaconBlock_PreForkEpoch(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), } @@ -2032,7 +2033,7 @@ func TestProposer_GetBeaconBlock_PostForkEpoch(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), } @@ -2185,7 +2186,7 @@ func TestProposer_GetBeaconBlock_BellatrixEpoch(t *testing.T) { AttPool: attestations.NewPool(), SlashingsPool: slashings.NewPool(), ExitPool: voluntaryexits.NewPool(), - StateGen: stategen.New(db), + StateGen: stategen.New(db, doublylinkedtree.New()), SyncCommitteePool: synccommittee.NewStore(), ExecutionEngineCaller: &mockExecution.EngineClient{ PayloadIDBytes: &enginev1.PayloadIDBytes{1}, diff --git a/beacon-chain/slasher/BUILD.bazel b/beacon-chain/slasher/BUILD.bazel index 416cbcee56..0f34c0df49 100644 --- a/beacon-chain/slasher/BUILD.bazel +++ b/beacon-chain/slasher/BUILD.bazel @@ -74,6 +74,7 @@ go_test( "//beacon-chain/core/feed/state:go_default_library", "//beacon-chain/core/signing:go_default_library", "//beacon-chain/db/testing:go_default_library", + "//beacon-chain/forkchoice/doubly-linked-tree:go_default_library", "//beacon-chain/operations/slashings/mock:go_default_library", "//beacon-chain/slasher/mock:go_default_library", "//beacon-chain/slasher/types:go_default_library", diff --git a/beacon-chain/slasher/detect_blocks_test.go b/beacon-chain/slasher/detect_blocks_test.go index 1711fca521..10abb47325 100644 --- a/beacon-chain/slasher/detect_blocks_test.go +++ b/beacon-chain/slasher/detect_blocks_test.go @@ -7,6 +7,7 @@ import ( mock "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" dbtest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" slashingsmock "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/slashings/mock" slashertypes "github.com/prysmaticlabs/prysm/v3/beacon-chain/slasher/types" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" @@ -60,7 +61,7 @@ func Test_processQueuedBlocks_DetectsDoubleProposals(t *testing.T) { Database: slasherDB, StateNotifier: &mock.MockStateNotifier{}, HeadStateFetcher: mockChain, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), SlashingPoolInserter: &slashingsmock.PoolMock{}, }, params: DefaultParams(), diff --git a/beacon-chain/slasher/process_slashings_test.go b/beacon-chain/slasher/process_slashings_test.go index 547cc240d7..bc1d23437e 100644 --- a/beacon-chain/slasher/process_slashings_test.go +++ b/beacon-chain/slasher/process_slashings_test.go @@ -7,6 +7,7 @@ import ( mock "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" dbtest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" slashingsmock "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/slashings/mock" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" "github.com/prysmaticlabs/prysm/v3/config/params" @@ -44,7 +45,7 @@ func TestService_processAttesterSlashings(t *testing.T) { serviceCfg: &ServiceConfig{ Database: slasherDB, AttestationStateFetcher: mockChain, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), SlashingPoolInserter: &slashingsmock.PoolMock{}, HeadStateFetcher: mockChain, }, @@ -151,7 +152,7 @@ func TestService_processProposerSlashings(t *testing.T) { serviceCfg: &ServiceConfig{ Database: slasherDB, AttestationStateFetcher: mockChain, - StateGen: stategen.New(beaconDB), + StateGen: stategen.New(beaconDB, doublylinkedtree.New()), SlashingPoolInserter: &slashingsmock.PoolMock{}, HeadStateFetcher: mockChain, }, diff --git a/beacon-chain/state/stategen/BUILD.bazel b/beacon-chain/state/stategen/BUILD.bazel index b5a0efbc4e..c58cf08350 100644 --- a/beacon-chain/state/stategen/BUILD.bazel +++ b/beacon-chain/state/stategen/BUILD.bazel @@ -26,6 +26,7 @@ go_library( "//beacon-chain/core/transition:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/db/filters:go_default_library", + "//beacon-chain/forkchoice:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/sync/backfill:go_default_library", "//cache/lru:go_default_library", @@ -70,6 +71,7 @@ go_test( "//beacon-chain/core/transition:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/db/testing:go_default_library", + "//beacon-chain/forkchoice/doubly-linked-tree:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/state/stategen/getter_test.go b/beacon-chain/state/stategen/getter_test.go index 9e45b16c00..d4d48ac83d 100644 --- a/beacon-chain/state/stategen/getter_test.go +++ b/beacon-chain/state/stategen/getter_test.go @@ -6,6 +6,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/blocks" testDB "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/config/params" types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v3/encoding/bytesutil" @@ -19,7 +20,7 @@ func TestStateByRoot_GenesisState(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) b := util.NewBeaconBlock() bRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) @@ -36,7 +37,7 @@ func TestStateByRoot_ColdState(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.finalizedInfo.slot = 2 service.slotsPerArchivedPoint = 1 @@ -59,7 +60,7 @@ func TestStateByRootIfCachedNoCopy_HotState(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) r := [32]byte{'A'} @@ -74,7 +75,7 @@ func TestStateByRootIfCachedNoCopy_ColdState(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.finalizedInfo.slot = 2 service.slotsPerArchivedPoint = 1 @@ -97,7 +98,7 @@ func TestStateByRoot_HotStateUsingEpochBoundaryCacheNoReplay(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) require.NoError(t, beaconState.SetSlot(10)) @@ -115,7 +116,7 @@ func TestStateByRoot_HotStateUsingEpochBoundaryCacheWithReplay(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) blk := util.NewBeaconBlock() @@ -140,7 +141,7 @@ func TestStateByRoot_HotStateCached(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) r := [32]byte{'A'} @@ -156,7 +157,7 @@ func TestDeleteStateFromCaches(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) r := [32]byte{'A'} @@ -185,7 +186,7 @@ func TestStateByRoot_StateByRootInitialSync(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) b := util.NewBeaconBlock() bRoot, err := b.Block.HashTreeRoot() require.NoError(t, err) @@ -202,7 +203,7 @@ func TestStateByRootInitialSync_UseEpochStateCache(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) targetSlot := types.Slot(10) @@ -220,7 +221,7 @@ func TestStateByRootInitialSync_UseCache(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) r := [32]byte{'A'} @@ -238,7 +239,7 @@ func TestStateByRootInitialSync_UseCache(t *testing.T) { func TestStateByRootInitialSync_CanProcessUpTo(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) blk := util.NewBeaconBlock() @@ -262,7 +263,7 @@ func TestStateByRootInitialSync_CanProcessUpTo(t *testing.T) { func TestLoadeStateByRoot_Cached(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) r := [32]byte{'A'} @@ -277,7 +278,7 @@ func TestLoadeStateByRoot_Cached(t *testing.T) { func TestLoadeStateByRoot_FinalizedState(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) genesisStateRoot, err := beaconState.HashTreeRoot(ctx) @@ -301,7 +302,7 @@ func TestLoadeStateByRoot_FinalizedState(t *testing.T) { func TestLoadeStateByRoot_EpochBoundaryStateCanProcess(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) gBlk := util.NewBeaconBlock() @@ -327,7 +328,7 @@ func TestLoadeStateByRoot_EpochBoundaryStateCanProcess(t *testing.T) { func TestLoadeStateByRoot_FromDBBoundaryCase(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) gBlk := util.NewBeaconBlock() @@ -353,7 +354,7 @@ func TestLoadeStateByRoot_FromDBBoundaryCase(t *testing.T) { func TestLastAncestorState_CanGetUsingDB(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) b0 := util.NewBeaconBlock() b0.Block.ParentRoot = bytesutil.PadTo([]byte{'a'}, 32) @@ -393,7 +394,7 @@ func TestLastAncestorState_CanGetUsingDB(t *testing.T) { func TestLastAncestorState_CanGetUsingCache(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) b0 := util.NewBeaconBlock() b0.Block.ParentRoot = bytesutil.PadTo([]byte{'a'}, 32) @@ -433,7 +434,7 @@ func TestLastAncestorState_CanGetUsingCache(t *testing.T) { func TestState_HasState(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) s, err := util.NewBeaconState() require.NoError(t, err) rHit1 := [32]byte{1} @@ -465,7 +466,7 @@ func TestState_HasState(t *testing.T) { func TestState_HasStateInCache(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) s, err := util.NewBeaconState() require.NoError(t, err) rHit1 := [32]byte{1} diff --git a/beacon-chain/state/stategen/migrate_test.go b/beacon-chain/state/stategen/migrate_test.go index 08ab72cc5b..1d2b7e7bf5 100644 --- a/beacon-chain/state/stategen/migrate_test.go +++ b/beacon-chain/state/stategen/migrate_test.go @@ -6,6 +6,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/blocks" testDB "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v3/testing/assert" @@ -17,7 +18,7 @@ import ( func TestMigrateToCold_CanSaveFinalizedInfo(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) b := util.NewBeaconBlock() b.Block.Slot = 1 @@ -36,7 +37,7 @@ func TestMigrateToCold_HappyPath(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.slotsPerArchivedPoint = 1 beaconState, _ := util.DeterministicGenesisState(t, 32) stateSlot := types.Slot(1) @@ -66,7 +67,7 @@ func TestMigrateToCold_RegeneratePath(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.slotsPerArchivedPoint = 1 beaconState, pks := util.DeterministicGenesisState(t, 32) genesisStateRoot, err := beaconState.HashTreeRoot(ctx) @@ -116,7 +117,7 @@ func TestMigrateToCold_StateExistsInDB(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.slotsPerArchivedPoint = 1 beaconState, _ := util.DeterministicGenesisState(t, 32) stateSlot := types.Slot(1) diff --git a/beacon-chain/state/stategen/replay_test.go b/beacon-chain/state/stategen/replay_test.go index 0227375481..28ebaca18d 100644 --- a/beacon-chain/state/stategen/replay_test.go +++ b/beacon-chain/state/stategen/replay_test.go @@ -7,6 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v3/beacon-chain/db" testDB "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/config/params" consensusblocks "github.com/prysmaticlabs/prysm/v3/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v3/consensus-types/interfaces" @@ -41,7 +42,7 @@ func TestReplayBlocks_AllSkipSlots(t *testing.T) { require.NoError(t, beaconState.SetCurrentJustifiedCheckpoint(cp)) require.NoError(t, beaconState.AppendCurrentEpochAttestations(ðpb.PendingAttestation{})) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) targetSlot := params.BeaconConfig().SlotsPerEpoch - 1 newState, err := service.replayBlocks(context.Background(), beaconState, []interfaces.SignedBeaconBlock{}, targetSlot) require.NoError(t, err) @@ -70,7 +71,7 @@ func TestReplayBlocks_SameSlot(t *testing.T) { require.NoError(t, beaconState.SetCurrentJustifiedCheckpoint(cp)) require.NoError(t, beaconState.AppendCurrentEpochAttestations(ðpb.PendingAttestation{})) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) targetSlot := beaconState.Slot() newState, err := service.replayBlocks(context.Background(), beaconState, []interfaces.SignedBeaconBlock{}, targetSlot) require.NoError(t, err) @@ -100,7 +101,7 @@ func TestReplayBlocks_LowerSlotBlock(t *testing.T) { require.NoError(t, beaconState.SetCurrentJustifiedCheckpoint(cp)) require.NoError(t, beaconState.AppendCurrentEpochAttestations(ðpb.PendingAttestation{})) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) targetSlot := beaconState.Slot() b := util.NewBeaconBlock() b.Block.Slot = beaconState.Slot() - 1 @@ -130,7 +131,7 @@ func TestReplayBlocks_ThroughForkBoundary(t *testing.T) { }) require.NoError(t, err) - service := New(testDB.SetupDB(t)) + service := New(testDB.SetupDB(t), doublylinkedtree.New()) targetSlot := params.BeaconConfig().SlotsPerEpoch newState, err := service.replayBlocks(context.Background(), beaconState, []interfaces.SignedBeaconBlock{}, targetSlot) require.NoError(t, err) @@ -160,7 +161,7 @@ func TestReplayBlocks_ThroughBellatrixForkBoundary(t *testing.T) { }) require.NoError(t, err) - service := New(testDB.SetupDB(t)) + service := New(testDB.SetupDB(t), doublylinkedtree.New()) targetSlot := params.BeaconConfig().SlotsPerEpoch * 2 newState, err := service.replayBlocks(context.Background(), beaconState, []interfaces.SignedBeaconBlock{}, targetSlot) require.NoError(t, err) diff --git a/beacon-chain/state/stategen/service.go b/beacon-chain/state/stategen/service.go index a6b3351458..032a29440b 100644 --- a/beacon-chain/state/stategen/service.go +++ b/beacon-chain/state/stategen/service.go @@ -9,6 +9,7 @@ import ( "sync" "github.com/prysmaticlabs/prysm/v3/beacon-chain/db" + "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state" "github.com/prysmaticlabs/prysm/v3/beacon-chain/sync/backfill" "github.com/prysmaticlabs/prysm/v3/config/params" @@ -45,6 +46,7 @@ type State struct { epochBoundaryStateCache *epochBoundaryState saveHotStateDB *saveHotStateDbConfig backfillStatus *backfill.Status + fc forkchoice.ForkChoicer } // This tracks the config in the event of long non-finality, @@ -76,7 +78,7 @@ func WithBackfillStatus(bfs *backfill.Status) StateGenOption { } // New returns a new state management object. -func New(beaconDB db.NoHeadAccessDatabase, opts ...StateGenOption) *State { +func New(beaconDB db.NoHeadAccessDatabase, fc forkchoice.ForkChoicer, opts ...StateGenOption) *State { s := &State{ beaconDB: beaconDB, hotStateCache: newHotStateCache(), @@ -86,6 +88,7 @@ func New(beaconDB db.NoHeadAccessDatabase, opts ...StateGenOption) *State { saveHotStateDB: &saveHotStateDbConfig{ duration: defaultHotStateDBInterval, }, + fc: fc, } for _, o := range opts { o(s) diff --git a/beacon-chain/state/stategen/service_test.go b/beacon-chain/state/stategen/service_test.go index b5d71506f2..5c7d3b7436 100644 --- a/beacon-chain/state/stategen/service_test.go +++ b/beacon-chain/state/stategen/service_test.go @@ -5,6 +5,7 @@ import ( "testing" testDB "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/config/params" ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v3/testing/assert" @@ -16,7 +17,7 @@ func TestResume(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) b := util.NewBeaconBlock() util.SaveBlock(t, ctx, service.beaconDB, b) root, err := b.Block.HashTreeRoot() diff --git a/beacon-chain/state/stategen/setter_test.go b/beacon-chain/state/stategen/setter_test.go index 5d0b40cc3a..3f99bc62f2 100644 --- a/beacon-chain/state/stategen/setter_test.go +++ b/beacon-chain/state/stategen/setter_test.go @@ -5,6 +5,7 @@ import ( "testing" testDB "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/config/params" "github.com/prysmaticlabs/prysm/v3/testing/assert" "github.com/prysmaticlabs/prysm/v3/testing/require" @@ -16,7 +17,7 @@ func TestSaveState_HotStateCanBeSaved(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.slotsPerArchivedPoint = 1 beaconState, _ := util.DeterministicGenesisState(t, 32) // This goes to hot section, verify it can save on epoch boundary. @@ -37,7 +38,7 @@ func TestSaveState_HotStateCached(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.slotsPerArchivedPoint = 1 beaconState, _ := util.DeterministicGenesisState(t, 32) require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) @@ -57,7 +58,7 @@ func TestState_ForceCheckpoint_SavesStateToDatabase(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - svc := New(beaconDB) + svc := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) @@ -76,7 +77,7 @@ func TestSaveState_Alreadyhas(t *testing.T) { hook := logTest.NewGlobal() ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) @@ -95,7 +96,7 @@ func TestSaveState_Alreadyhas(t *testing.T) { func TestSaveState_CanSaveOnEpochBoundary(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) @@ -116,7 +117,7 @@ func TestSaveState_NoSaveNotEpochBoundary(t *testing.T) { hook := logTest.NewGlobal() ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) beaconState, _ := util.DeterministicGenesisState(t, 32) require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch-1)) @@ -140,7 +141,7 @@ func TestSaveState_CanSaveHotStateToDB(t *testing.T) { hook := logTest.NewGlobal() ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.EnableSaveHotStateToDB(ctx) beaconState, _ := util.DeterministicGenesisState(t, 32) require.NoError(t, beaconState.SetSlot(defaultHotStateDBInterval)) @@ -157,7 +158,7 @@ func TestEnableSaveHotStateToDB_Enabled(t *testing.T) { hook := logTest.NewGlobal() ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.EnableSaveHotStateToDB(ctx) require.LogsContain(t, hook, "Entering mode to save hot states in DB") @@ -168,7 +169,7 @@ func TestEnableSaveHotStateToDB_AlreadyEnabled(t *testing.T) { hook := logTest.NewGlobal() ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.saveHotStateDB.enabled = true service.EnableSaveHotStateToDB(ctx) require.LogsDoNotContain(t, hook, "Entering mode to save hot states in DB") @@ -179,7 +180,7 @@ func TestEnableSaveHotStateToDB_Disabled(t *testing.T) { hook := logTest.NewGlobal() ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) service.saveHotStateDB.enabled = true b := util.NewBeaconBlock() util.SaveBlock(t, ctx, beaconDB, b) @@ -196,7 +197,7 @@ func TestEnableSaveHotStateToDB_AlreadyDisabled(t *testing.T) { hook := logTest.NewGlobal() ctx := context.Background() beaconDB := testDB.SetupDB(t) - service := New(beaconDB) + service := New(beaconDB, doublylinkedtree.New()) require.NoError(t, service.DisableSaveHotStateToDB(ctx)) require.LogsDoNotContain(t, hook, "Exiting mode to save hot states in DB") require.Equal(t, false, service.saveHotStateDB.enabled) diff --git a/beacon-chain/sync/BUILD.bazel b/beacon-chain/sync/BUILD.bazel index 2684759f70..a297b128ef 100644 --- a/beacon-chain/sync/BUILD.bazel +++ b/beacon-chain/sync/BUILD.bazel @@ -182,6 +182,7 @@ go_test( "//beacon-chain/db/testing:go_default_library", "//beacon-chain/execution:go_default_library", "//beacon-chain/execution/testing:go_default_library", + "//beacon-chain/forkchoice/doubly-linked-tree:go_default_library", "//beacon-chain/operations/attestations:go_default_library", "//beacon-chain/operations/slashings:go_default_library", "//beacon-chain/p2p:go_default_library", diff --git a/beacon-chain/sync/pending_blocks_queue_test.go b/beacon-chain/sync/pending_blocks_queue_test.go index 3eef62c6ed..99df757bde 100644 --- a/beacon-chain/sync/pending_blocks_queue_test.go +++ b/beacon-chain/sync/pending_blocks_queue_test.go @@ -16,6 +16,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" dbtest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/execution" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/peers" p2ptest "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/testing" p2ptypes "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/types" @@ -47,7 +48,7 @@ func TestRegularSyncBeaconBlockSubscriber_ProcessPendingBlocks1(t *testing.T) { Epoch: 0, }, }, - stateGen: stategen.New(db), + stateGen: stategen.New(db, doublylinkedtree.New()), }, slotToPendingBlocks: gcache.New(time.Second, 2*time.Second), seenPendingBlocks: make(map[[32]byte]bool), @@ -119,7 +120,7 @@ func TestRegularSyncBeaconBlockSubscriber_OptimisticStatus(t *testing.T) { Epoch: 0, }, }, - stateGen: stategen.New(db), + stateGen: stategen.New(db, doublylinkedtree.New()), }, slotToPendingBlocks: gcache.New(time.Second, 2*time.Second), seenPendingBlocks: make(map[[32]byte]bool), @@ -191,7 +192,7 @@ func TestRegularSyncBeaconBlockSubscriber_ExecutionEngineTimesOut(t *testing.T) }, ReceiveBlockMockErr: execution.ErrHTTPTimeout, }, - stateGen: stategen.New(db), + stateGen: stategen.New(db, doublylinkedtree.New()), }, slotToPendingBlocks: gcache.New(time.Second, 2*time.Second), seenPendingBlocks: make(map[[32]byte]bool), @@ -318,7 +319,7 @@ func TestRegularSyncBeaconBlockSubscriber_DoNotReprocessBlock(t *testing.T) { Epoch: 0, }, }, - stateGen: stategen.New(db), + stateGen: stategen.New(db, doublylinkedtree.New()), }, slotToPendingBlocks: gcache.New(time.Second, 2*time.Second), seenPendingBlocks: make(map[[32]byte]bool), @@ -383,7 +384,7 @@ func TestRegularSyncBeaconBlockSubscriber_ProcessPendingBlocks_2Chains(t *testin Root: make([]byte, 32), }, }, - stateGen: stategen.New(db), + stateGen: stategen.New(db, doublylinkedtree.New()), }, slotToPendingBlocks: gcache.New(time.Second, 2*time.Second), seenPendingBlocks: make(map[[32]byte]bool), @@ -703,7 +704,7 @@ func TestService_ProcessPendingBlockOnCorrectSlot(t *testing.T) { p2p: p1, beaconDB: db, chain: &mockChain, - stateGen: stategen.New(db), + stateGen: stategen.New(db, doublylinkedtree.New()), }, slotToPendingBlocks: gcache.New(time.Second, 2*time.Second), seenPendingBlocks: make(map[[32]byte]bool), @@ -781,7 +782,7 @@ func TestService_ProcessBadPendingBlocks(t *testing.T) { p2p: p1, beaconDB: db, chain: &mockChain, - stateGen: stategen.New(db), + stateGen: stategen.New(db, doublylinkedtree.New()), }, slotToPendingBlocks: gcache.New(time.Second, 2*time.Second), seenPendingBlocks: make(map[[32]byte]bool), diff --git a/beacon-chain/sync/sync_fuzz_test.go b/beacon-chain/sync/sync_fuzz_test.go index f4937b709f..52a0666302 100644 --- a/beacon-chain/sync/sync_fuzz_test.go +++ b/beacon-chain/sync/sync_fuzz_test.go @@ -17,6 +17,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" dbtest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" p2ptest "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/stategen" @@ -51,7 +52,7 @@ func FuzzValidateBeaconBlockPubSub_Phase0(f *testing.F) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(f, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -132,7 +133,7 @@ func FuzzValidateBeaconBlockPubSub_Altair(f *testing.F) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(f, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -213,7 +214,7 @@ func FuzzValidateBeaconBlockPubSub_Bellatrix(f *testing.F) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(f, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ diff --git a/beacon-chain/sync/validate_beacon_blocks_test.go b/beacon-chain/sync/validate_beacon_blocks_test.go index f9c7ccedb9..02534c774a 100644 --- a/beacon-chain/sync/validate_beacon_blocks_test.go +++ b/beacon-chain/sync/validate_beacon_blocks_test.go @@ -19,6 +19,7 @@ import ( coreTime "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/transition" dbtest "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/operations/attestations" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" p2ptest "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/testing" @@ -64,7 +65,7 @@ func TestValidateBeaconBlockPubSub_InvalidSignature(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[badPrivKeyIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), FinalizedCheckPoint: ðpb.Checkpoint{ Epoch: 0, @@ -167,7 +168,7 @@ func TestValidateBeaconBlockPubSub_CanRecoverStateSummary(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -231,7 +232,7 @@ func TestValidateBeaconBlockPubSub_IsInCache(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -297,7 +298,7 @@ func TestValidateBeaconBlockPubSub_ValidProposerSignature(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -365,7 +366,7 @@ func TestValidateBeaconBlockPubSub_WithLookahead(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) offset := int64(blkSlot.Mul(params.BeaconConfig().SecondsPerSlot)) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-offset, 0), DB: db, @@ -433,7 +434,7 @@ func TestValidateBeaconBlockPubSub_AdvanceEpochsForState(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) offset := int64(blkSlot.Mul(params.BeaconConfig().SecondsPerSlot)) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-offset, 0), DB: db, @@ -540,7 +541,7 @@ func TestValidateBeaconBlockPubSub_IgnoreAndQueueBlocksFromNearFuture(t *testing msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Now(), FinalizedCheckPoint: ðpb.Checkpoint{ Epoch: 0, @@ -829,7 +830,7 @@ func TestValidateBeaconBlockPubSub_ParentNotFinalizedDescendant(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -898,7 +899,7 @@ func TestValidateBeaconBlockPubSub_InvalidParentBlock(t *testing.T) { currBlockRoot, err := msg.Block.HashTreeRoot() require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0), State: beaconState, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -1006,7 +1007,7 @@ func TestValidateBeaconBlockPubSub_RejectBlocksFromBadParent(t *testing.T) { genesisTime := time.Now() - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{ Genesis: time.Unix(genesisTime.Unix()-int64(slotsSinceGenesis.Mul(perSlot)), 0), FinalizedCheckPoint: ðpb.Checkpoint{ @@ -1108,7 +1109,7 @@ func TestValidateBeaconBlockPubSub_ValidExecutionPayload(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(presentTime-int64(params.BeaconConfig().SecondsPerSlot), 0), DB: db, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -1180,7 +1181,7 @@ func TestValidateBeaconBlockPubSub_InvalidPayloadTimestamp(t *testing.T) { msg.Signature, err = signing.ComputeDomainAndSign(beaconState, 0, msg.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx]) require.NoError(t, err) - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) chainService := &mock.ChainService{Genesis: time.Unix(presentTime-int64(params.BeaconConfig().SecondsPerSlot), 0), DB: db, FinalizedCheckPoint: ðpb.Checkpoint{ @@ -1224,7 +1225,7 @@ func Test_validateBellatrixBeaconBlock(t *testing.T) { db := dbtest.SetupDB(t) p := p2ptest.NewTestP2P(t) ctx := context.Background() - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) presentTime := time.Now().Unix() chainService := &mock.ChainService{Genesis: time.Unix(presentTime-int64(params.BeaconConfig().SecondsPerSlot), 0), FinalizedCheckPoint: ðpb.Checkpoint{ @@ -1255,7 +1256,7 @@ func Test_validateBellatrixBeaconBlockParentValidation(t *testing.T) { db := dbtest.SetupDB(t) p := p2ptest.NewTestP2P(t) ctx := context.Background() - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) beaconState, privKeys := util.DeterministicGenesisStateBellatrix(t, 100) parentBlock := util.NewBeaconBlockBellatrix() @@ -1311,7 +1312,7 @@ func Test_validateBeaconBlockProcessingWhenParentIsOptimistic(t *testing.T) { db := dbtest.SetupDB(t) p := p2ptest.NewTestP2P(t) ctx := context.Background() - stateGen := stategen.New(db) + stateGen := stategen.New(db, doublylinkedtree.New()) beaconState, privKeys := util.DeterministicGenesisStateBellatrix(t, 100) parentBlock := util.NewBeaconBlockBellatrix() diff --git a/beacon-chain/sync/validate_sync_committee_message_test.go b/beacon-chain/sync/validate_sync_committee_message_test.go index 728e0b3a46..3834c82399 100644 --- a/beacon-chain/sync/validate_sync_committee_message_test.go +++ b/beacon-chain/sync/validate_sync_committee_message_test.go @@ -14,6 +14,7 @@ import ( mockChain "github.com/prysmaticlabs/prysm/v3/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" testingdb "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/encoder" mockp2p "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/testing" @@ -63,7 +64,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) msg.BlockRoot = headRoot[:] s.cfg.beaconDB = beaconDB s.initCaches() @@ -91,7 +92,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) msg.BlockRoot = headRoot[:] s.cfg.beaconDB = beaconDB s.initCaches() @@ -119,7 +120,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) s.cfg.beaconDB = beaconDB s.initCaches() return s, topic @@ -146,7 +147,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) s.cfg.beaconDB = beaconDB s.initCaches() @@ -175,7 +176,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) s.cfg.beaconDB = beaconDB s.initCaches() s.cfg.chain = &mockChain.ChainService{ @@ -209,7 +210,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) s.cfg.beaconDB = beaconDB s.initCaches() msg.BlockRoot = headRoot[:] @@ -257,7 +258,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) s.cfg.beaconDB = beaconDB s.initCaches() msg.BlockRoot = headRoot[:] @@ -304,7 +305,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) s.cfg.beaconDB = beaconDB s.initCaches() msg.BlockRoot = headRoot[:] @@ -359,7 +360,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SyncCommitteeMessage, topic string) (*Service, string) { - s.cfg.stateGen = stategen.New(beaconDB) + s.cfg.stateGen = stategen.New(beaconDB, doublylinkedtree.New()) s.cfg.beaconDB = beaconDB s.initCaches() msg.BlockRoot = headRoot[:] diff --git a/beacon-chain/sync/validate_sync_contribution_proof_test.go b/beacon-chain/sync/validate_sync_contribution_proof_test.go index c478a50069..c186764397 100644 --- a/beacon-chain/sync/validate_sync_contribution_proof_test.go +++ b/beacon-chain/sync/validate_sync_contribution_proof_test.go @@ -19,6 +19,7 @@ import ( "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/v3/beacon-chain/db" testingdb "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/testing" + doublylinkedtree "github.com/prysmaticlabs/prysm/v3/beacon-chain/forkchoice/doubly-linked-tree" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/encoder" mockp2p "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/testing" @@ -72,7 +73,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) msg.Message.Contribution.BlockRoot = headRoot[:] s.cfg.beaconDB = database s.initCaches() @@ -108,7 +109,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) msg.Message.Contribution.BlockRoot = headRoot[:] s.cfg.beaconDB = database s.initCaches() @@ -144,7 +145,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database s.initCaches() return s @@ -179,7 +180,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database s.initCaches() s.cfg.chain = &mockChain.ChainService{ @@ -222,7 +223,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database s.initCaches() s.cfg.chain = &mockChain.ChainService{ @@ -265,7 +266,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database s.initCaches() s.cfg.chain = &mockChain.ChainService{ @@ -309,7 +310,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database s.initCaches() s.cfg.chain = &mockChain.ChainService{ @@ -371,7 +372,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database msg.Message.Contribution.BlockRoot = headRoot[:] hState, err := database.State(context.Background(), headRoot) @@ -436,7 +437,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database s.cfg.chain = chainService msg.Message.Contribution.BlockRoot = headRoot[:] @@ -516,7 +517,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) s.cfg.beaconDB = database msg.Message.Contribution.BlockRoot = headRoot[:] hState, err := database.State(context.Background(), headRoot) @@ -598,7 +599,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) msg.Message.Contribution.BlockRoot = headRoot[:] s.cfg.beaconDB = database hState, err := database.State(context.Background(), headRoot) @@ -682,7 +683,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) msg.Message.Contribution.BlockRoot = headRoot[:] s.cfg.beaconDB = database hState, err := database.State(context.Background(), headRoot) @@ -778,7 +779,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ), setupSvc: func(s *Service, msg *ethpb.SignedContributionAndProof) *Service { - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) msg.Message.Contribution.BlockRoot = headRoot[:] s.cfg.beaconDB = database hState, err := database.State(context.Background(), headRoot) @@ -925,7 +926,7 @@ func TestValidateSyncContributionAndProof(t *testing.T) { WithOperationNotifier(chainService.OperationNotifier()), ) go s.verifierRoutine() - s.cfg.stateGen = stategen.New(database) + s.cfg.stateGen = stategen.New(database, doublylinkedtree.New()) msg.Message.Contribution.BlockRoot = headRoot[:] s.cfg.beaconDB = database hState, err := database.State(context.Background(), headRoot) diff --git a/testing/spectest/shared/common/forkchoice/service.go b/testing/spectest/shared/common/forkchoice/service.go index 9d778d5da9..6c6d52d864 100644 --- a/testing/spectest/shared/common/forkchoice/service.go +++ b/testing/spectest/shared/common/forkchoice/service.go @@ -52,13 +52,14 @@ func startChainService(t testing.TB, depositCache, err := depositcache.New() require.NoError(t, err) + fc := doublylinkedtree.New() opts := append([]blockchain.Option{}, blockchain.WithExecutionEngineCaller(engineMock), blockchain.WithFinalizedStateAtStartUp(st), blockchain.WithDatabase(db), blockchain.WithAttestationService(attPool), - blockchain.WithForkChoiceStore(doublylinkedtree.New()), - blockchain.WithStateGen(stategen.New(db)), + blockchain.WithForkChoiceStore(fc), + blockchain.WithStateGen(stategen.New(db, fc)), blockchain.WithStateNotifier(&mock.MockStateNotifier{}), blockchain.WithAttestationPool(attestations.NewPool()), blockchain.WithDepositCache(depositCache),