From 7667eeeed3b7c1a3d8cc8a87f20167645a632505 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Thu, 28 Mar 2024 13:18:36 +0100 Subject: [PATCH 01/15] Remove EnableEIP4881 flag --- beacon-chain/execution/log_processing.go | 50 ++++++--------- beacon-chain/execution/service.go | 79 ++++++++---------------- beacon-chain/node/node.go | 7 +-- config/features/config.go | 6 -- 4 files changed, 45 insertions(+), 97 deletions(-) diff --git a/beacon-chain/execution/log_processing.go b/beacon-chain/execution/log_processing.go index 4eb9288fd163..3b0e17d4fa34 100644 --- a/beacon-chain/execution/log_processing.go +++ b/beacon-chain/execution/log_processing.go @@ -20,9 +20,7 @@ import ( coreState "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/types" statenative "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" - "github.com/prysmaticlabs/prysm/v5/config/features" "github.com/prysmaticlabs/prysm/v5/config/params" - "github.com/prysmaticlabs/prysm/v5/container/trie" contracts "github.com/prysmaticlabs/prysm/v5/contracts/deposit" "github.com/prysmaticlabs/prysm/v5/crypto/hash" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" @@ -226,16 +224,14 @@ func (s *Service) ProcessDepositLog(ctx context.Context, depositLog *gethtypes.L "merkleTreeIndex": index, }).Info("Invalid deposit registered in deposit contract") } - if features.Get().EnableEIP4881 { - // We finalize the trie here so that old deposits are not kept around, as they make - // deposit tree htr computation expensive. - dTrie, ok := s.depositTrie.(*depositsnapshot.DepositTree) - if !ok { - return errors.Errorf("wrong trie type initialized: %T", dTrie) - } - if err := dTrie.Finalize(index, depositLog.BlockHash, depositLog.BlockNumber); err != nil { - log.WithError(err).Error("Could not finalize trie") - } + // We finalize the trie here so that old deposits are not kept around, as they make + // deposit tree htr computation expensive. + dTrie, ok := s.depositTrie.(*depositsnapshot.DepositTree) + if !ok { + return errors.Errorf("wrong trie type initialized: %T", dTrie) + } + if err := dTrie.Finalize(index, depositLog.BlockHash, depositLog.BlockNumber); err != nil { + log.WithError(err).Error("Could not finalize trie") } return nil @@ -579,25 +575,17 @@ func (s *Service) savePowchainData(ctx context.Context) error { BeaconState: pbState, // I promise not to mutate it! DepositContainers: s.cfg.depositCache.AllDepositContainers(ctx), } - if features.Get().EnableEIP4881 { - fd, err := s.cfg.depositCache.FinalizedDeposits(ctx) - if err != nil { - return errors.Errorf("could not get finalized deposit tree: %v", err) - } - tree, ok := fd.Deposits().(*depositsnapshot.DepositTree) - if !ok { - return errors.New("deposit tree was not EIP4881 DepositTree") - } - eth1Data.DepositSnapshot, err = tree.ToProto() - if err != nil { - return err - } - } else { - tree, ok := s.depositTrie.(*trie.SparseMerkleTrie) - if !ok { - return errors.New("deposit tree was not SparseMerkleTrie") - } - eth1Data.Trie = tree.ToProto() + fd, err := s.cfg.depositCache.FinalizedDeposits(ctx) + if err != nil { + return errors.Errorf("could not get finalized deposit tree: %v", err) + } + tree, ok := fd.Deposits().(*depositsnapshot.DepositTree) + if !ok { + return errors.New("deposit tree was not EIP4881 DepositTree") + } + eth1Data.DepositSnapshot, err = tree.ToProto() + if err != nil { + return err } return s.cfg.beaconDB.SaveExecutionChainData(ctx, eth1Data) } diff --git a/beacon-chain/execution/service.go b/beacon-chain/execution/service.go index 13704c119701..a4d0eeb3a6b2 100644 --- a/beacon-chain/execution/service.go +++ b/beacon-chain/execution/service.go @@ -29,7 +29,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/stategen" - "github.com/prysmaticlabs/prysm/v5/config/features" "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/container/trie" contracts "github.com/prysmaticlabs/prysm/v5/contracts/deposit" @@ -164,14 +163,7 @@ func NewService(ctx context.Context, opts ...Option) (*Service, error) { _ = cancel // govet fix for lost cancel. Cancel is handled in service.Stop() var depositTrie cache.MerkleTree var err error - if features.Get().EnableEIP4881 { - depositTrie = depositsnapshot.NewDepositTree() - } else { - depositTrie, err = trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) - if err != nil { - return nil, errors.Wrap(err, "could not set up deposit trie") - } - } + depositTrie = depositsnapshot.NewDepositTree() genState, err := transition.EmptyGenesisState() if err != nil { return nil, errors.Wrap(err, "could not set up genesis state") @@ -740,23 +732,12 @@ func (s *Service) initializeEth1Data(ctx context.Context, eth1DataInDB *ethpb.ET return nil } var err error - if features.Get().EnableEIP4881 { - if eth1DataInDB.DepositSnapshot != nil { - s.depositTrie, err = depositsnapshot.DepositTreeFromSnapshotProto(eth1DataInDB.DepositSnapshot) - } else { - if err := s.migrateOldDepositTree(eth1DataInDB); err != nil { - return err - } - } + if eth1DataInDB.DepositSnapshot != nil { + s.depositTrie, err = depositsnapshot.DepositTreeFromSnapshotProto(eth1DataInDB.DepositSnapshot) } else { - if eth1DataInDB.Trie == nil && eth1DataInDB.DepositSnapshot != nil { - return errors.Errorf("trying to use old deposit trie after migration to the new trie. "+ - "Remove the --%s flag to resume normal operations.", features.DisableEIP4881.Name) + if err = s.migrateOldDepositTree(eth1DataInDB); err != nil { + return err } - s.depositTrie, err = trie.CreateTrieFromProto(eth1DataInDB.Trie) - } - if err != nil { - return err } s.chainStartData = eth1DataInDB.ChainstartData if !reflect.ValueOf(eth1DataInDB.BeaconState).IsZero() { @@ -766,21 +747,19 @@ func (s *Service) initializeEth1Data(ctx context.Context, eth1DataInDB *ethpb.ET } } s.latestEth1Data = eth1DataInDB.CurrentEth1Data - if features.Get().EnableEIP4881 { - ctrs := eth1DataInDB.DepositContainers - // Look at previously finalized index, as we are building off a finalized - // snapshot rather than the full trie. - lastFinalizedIndex := int64(s.depositTrie.NumOfItems() - 1) - // Correctly initialize missing deposits into active trie. - for _, c := range ctrs { - if c.Index > lastFinalizedIndex { - depRoot, err := c.Deposit.Data.HashTreeRoot() - if err != nil { - return err - } - if err := s.depositTrie.Insert(depRoot[:], int(c.Index)); err != nil { - return err - } + ctrs := eth1DataInDB.DepositContainers + // Look at previously finalized index, as we are building off a finalized + // snapshot rather than the full trie. + lastFinalizedIndex := int64(s.depositTrie.NumOfItems() - 1) + // Correctly initialize missing deposits into active trie. + for _, c := range ctrs { + if c.Index > lastFinalizedIndex { + depRoot, err := c.Deposit.Data.HashTreeRoot() + if err != nil { + return err + } + if err := s.depositTrie.Insert(depRoot[:], int(c.Index)); err != nil { + return err } } } @@ -847,21 +826,13 @@ func (s *Service) validPowchainData(ctx context.Context) (*ethpb.ETH1ChainData, BeaconState: pbState, DepositContainers: s.cfg.depositCache.AllDepositContainers(ctx), } - if features.Get().EnableEIP4881 { - trie, ok := s.depositTrie.(*depositsnapshot.DepositTree) - if !ok { - return nil, errors.New("deposit trie was not EIP4881 DepositTree") - } - eth1Data.DepositSnapshot, err = trie.ToProto() - if err != nil { - return nil, err - } - } else { - trie, ok := s.depositTrie.(*trie.SparseMerkleTrie) - if !ok { - return nil, errors.New("deposit trie was not SparseMerkleTrie") - } - eth1Data.Trie = trie.ToProto() + trie, ok := s.depositTrie.(*depositsnapshot.DepositTree) + if !ok { + return nil, errors.New("deposit trie was not EIP4881 DepositTree") + } + eth1Data.DepositSnapshot, err = trie.ToProto() + if err != nil { + return nil, err } if err := s.cfg.beaconDB.SaveExecutionChainData(ctx, eth1Data); err != nil { return nil, err diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index e87d68cf0ce9..57286fcef3e9 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -25,7 +25,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain" "github.com/prysmaticlabs/prysm/v5/beacon-chain/builder" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/db" "github.com/prysmaticlabs/prysm/v5/beacon-chain/db/filesystem" @@ -567,11 +566,7 @@ func (b *BeaconNode) startDB(cliCtx *cli.Context, depositAddress string) error { b.db = d - if features.Get().EnableEIP4881 { - depositCache, err = depositsnapshot.New() - } else { - depositCache, err = depositcache.New() - } + depositCache, err = depositsnapshot.New() if err != nil { return errors.Wrap(err, "could not create deposit cache") } diff --git a/config/features/config.go b/config/features/config.go index 43f1c3d10a67..d64e7fdde26e 100644 --- a/config/features/config.go +++ b/config/features/config.go @@ -67,7 +67,6 @@ type Flags struct { DisableStakinContractCheck bool // Disables check for deposit contract when proposing blocks EnableVerboseSigVerification bool // EnableVerboseSigVerification specifies whether to verify individual signature if batch verification fails - EnableEIP4881 bool // EnableEIP4881 specifies whether to use the deposit tree from EIP4881 PrepareAllPayloads bool // PrepareAllPayloads informs the engine to prepare a block on every slot. // BlobSaveFsync requires blob saving to block on fsync to ensure blobs are durably persisted before passing DA. @@ -252,11 +251,6 @@ func ConfigureBeaconChain(ctx *cli.Context) error { logEnabled(disableResourceManager) cfg.DisableResourceManager = true } - cfg.EnableEIP4881 = true - if ctx.IsSet(DisableEIP4881.Name) { - logEnabled(DisableEIP4881) - cfg.EnableEIP4881 = false - } if ctx.IsSet(EnableLightClient.Name) { logEnabled(EnableLightClient) cfg.EnableLightClient = true From 1fe248ed1d855cddec62d635f7f026c4fa3841cf Mon Sep 17 00:00:00 2001 From: Saolyn Date: Thu, 28 Mar 2024 16:48:55 +0100 Subject: [PATCH 02/15] Gaz --- beacon-chain/execution/BUILD.bazel | 1 - beacon-chain/node/BUILD.bazel | 1 - 2 files changed, 2 deletions(-) diff --git a/beacon-chain/execution/BUILD.bazel b/beacon-chain/execution/BUILD.bazel index 0911c1384ada..b1f936a7b138 100644 --- a/beacon-chain/execution/BUILD.bazel +++ b/beacon-chain/execution/BUILD.bazel @@ -36,7 +36,6 @@ go_library( "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", "//beacon-chain/state/stategen:go_default_library", - "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//consensus-types/blocks:go_default_library", diff --git a/beacon-chain/node/BUILD.bazel b/beacon-chain/node/BUILD.bazel index 5c989de08c10..114f8e759eb3 100644 --- a/beacon-chain/node/BUILD.bazel +++ b/beacon-chain/node/BUILD.bazel @@ -21,7 +21,6 @@ go_library( "//beacon-chain/blockchain:go_default_library", "//beacon-chain/builder:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", "//beacon-chain/cache/depositsnapshot:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/db/filesystem:go_default_library", From 8c14ee567d571d857e2d8acf7f3c0d59b5e190b4 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Thu, 28 Mar 2024 16:54:31 +0100 Subject: [PATCH 03/15] Fix missing error handler --- beacon-chain/execution/service.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/beacon-chain/execution/service.go b/beacon-chain/execution/service.go index a4d0eeb3a6b2..d71b0b949407 100644 --- a/beacon-chain/execution/service.go +++ b/beacon-chain/execution/service.go @@ -739,6 +739,9 @@ func (s *Service) initializeEth1Data(ctx context.Context, eth1DataInDB *ethpb.ET return err } } + if err != nil { + return err + } s.chainStartData = eth1DataInDB.ChainstartData if !reflect.ValueOf(eth1DataInDB.BeaconState).IsZero() { s.preGenesisState, err = native.InitializeFromProtoPhase0(eth1DataInDB.BeaconState) From e9a924163bc9dff48705921ff1924dff7cbe22b1 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Wed, 3 Apr 2024 16:50:53 +0200 Subject: [PATCH 04/15] Remove old tree and fix tests --- beacon-chain/blockchain/service_test.go | 4 +- beacon-chain/blockchain/setup_test.go | 6 +- beacon-chain/cache/depositcache/BUILD.bazel | 50 - .../cache/depositcache/deposits_cache.go | 327 ----- .../cache/depositcache/deposits_cache_test.go | 1074 ----------------- beacon-chain/cache/depositcache/log.go | 5 - .../cache/depositcache/pending_deposits.go | 151 --- .../depositcache/pending_deposits_test.go | 160 --- .../cache/depositsnapshot/deposit_fetcher.go | 46 + beacon-chain/execution/log_processing_test.go | 16 +- beacon-chain/execution/service_test.go | 14 +- .../prysm/v1alpha1/validator/duties_test.go | 4 +- .../prysm/v1alpha1/validator/proposer_test.go | 24 +- .../rpc/prysm/v1alpha1/validator/server.go | 4 +- .../v1alpha1/validator/server_mainnet_test.go | 4 +- .../prysm/v1alpha1/validator/server_test.go | 4 +- .../v1alpha1/validator/status_mainnet_test.go | 4 +- .../prysm/v1alpha1/validator/status_test.go | 28 +- beacon-chain/rpc/service.go | 4 +- .../shared/common/forkchoice/service.go | 4 +- 20 files changed, 106 insertions(+), 1827 deletions(-) delete mode 100644 beacon-chain/cache/depositcache/BUILD.bazel delete mode 100644 beacon-chain/cache/depositcache/deposits_cache.go delete mode 100644 beacon-chain/cache/depositcache/deposits_cache_test.go delete mode 100644 beacon-chain/cache/depositcache/log.go delete mode 100644 beacon-chain/cache/depositcache/pending_deposits.go delete mode 100644 beacon-chain/cache/depositcache/pending_deposits_test.go diff --git a/beacon-chain/blockchain/service_test.go b/beacon-chain/blockchain/service_test.go index e2447d036183..27582f1b8ed9 100644 --- a/beacon-chain/blockchain/service_test.go +++ b/beacon-chain/blockchain/service_test.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/transition" @@ -80,7 +80,7 @@ func setupBeaconChain(t *testing.T, beaconDB db.Database) *Service { attService, err := attestations.NewService(ctx, &attestations.Config{Pool: attestations.NewPool()}) require.NoError(t, err) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) fc := doublylinkedtree.New() diff --git a/beacon-chain/blockchain/setup_test.go b/beacon-chain/blockchain/setup_test.go index da2e4281ef60..3d3e98b3f86e 100644 --- a/beacon-chain/blockchain/setup_test.go +++ b/beacon-chain/blockchain/setup_test.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/v5/async/event" mock "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" statefeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/v5/beacon-chain/db" "github.com/prysmaticlabs/prysm/v5/beacon-chain/db/filesystem" @@ -79,7 +79,7 @@ type testServiceRequirements struct { attPool attestations.Pool attSrv *attestations.Service blsPool *blstoexec.Pool - dc *depositcache.DepositCache + dc *depositsnapshot.Cache } func minimalTestService(t *testing.T, opts ...Option) (*Service, *testServiceRequirements) { @@ -94,7 +94,7 @@ func minimalTestService(t *testing.T, opts ...Option) (*Service, *testServiceReq attSrv, err := attestations.NewService(ctx, &attestations.Config{Pool: attPool}) require.NoError(t, err) blsPool := blstoexec.NewPool() - dc, err := depositcache.New() + dc, err := depositsnapshot.New() require.NoError(t, err) req := &testServiceRequirements{ ctx: ctx, diff --git a/beacon-chain/cache/depositcache/BUILD.bazel b/beacon-chain/cache/depositcache/BUILD.bazel deleted file mode 100644 index d36d70566481..000000000000 --- a/beacon-chain/cache/depositcache/BUILD.bazel +++ /dev/null @@ -1,50 +0,0 @@ -load("@prysm//tools/go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "deposits_cache.go", - "log.go", - "pending_deposits.go", - ], - importpath = "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache", - visibility = [ - "//beacon-chain:__subpackages__", - "//testing/spectest:__subpackages__", - ], - deps = [ - "//beacon-chain/cache:go_default_library", - "//config/fieldparams:go_default_library", - "//config/params:go_default_library", - "//container/trie:go_default_library", - "//crypto/hash:go_default_library", - "//encoding/bytesutil:go_default_library", - "//proto/prysm/v1alpha1:go_default_library", - "@com_github_ethereum_go_ethereum//common:go_default_library", - "@com_github_pkg_errors//:go_default_library", - "@com_github_prometheus_client_golang//prometheus:go_default_library", - "@com_github_prometheus_client_golang//prometheus/promauto:go_default_library", - "@com_github_sirupsen_logrus//:go_default_library", - "@io_opencensus_go//trace:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "deposits_cache_test.go", - "pending_deposits_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//beacon-chain/cache:go_default_library", - "//config/params:go_default_library", - "//container/trie:go_default_library", - "//encoding/bytesutil:go_default_library", - "//proto/prysm/v1alpha1:go_default_library", - "//testing/assert:go_default_library", - "//testing/require:go_default_library", - "@com_github_sirupsen_logrus//hooks/test:go_default_library", - "@org_golang_google_protobuf//proto:go_default_library", - ], -) diff --git a/beacon-chain/cache/depositcache/deposits_cache.go b/beacon-chain/cache/depositcache/deposits_cache.go deleted file mode 100644 index 81355110fcc7..000000000000 --- a/beacon-chain/cache/depositcache/deposits_cache.go +++ /dev/null @@ -1,327 +0,0 @@ -// Package depositcache is the source of validator deposits maintained -// in-memory by the beacon node – deposits processed from the -// eth1 powchain are then stored in this cache to be accessed by -// any other service during a beacon node's runtime. -package depositcache - -import ( - "context" - "encoding/hex" - "math/big" - "sort" - "sync" - - "github.com/ethereum/go-ethereum/common" - "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" - "github.com/prysmaticlabs/prysm/v5/config/params" - "github.com/prysmaticlabs/prysm/v5/container/trie" - "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" - ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" - "github.com/sirupsen/logrus" - "go.opencensus.io/trace" -) - -var ( - historicalDepositsCount = promauto.NewCounter(prometheus.CounterOpts{ - Name: "beacondb_all_deposits", - Help: "The number of total deposits in the beaconDB in-memory database", - }) -) - -// FinalizedDeposits stores the trie of deposits that have been included -// in the beacon state up to the latest finalized checkpoint. -type FinalizedDeposits struct { - deposits *trie.SparseMerkleTrie - merkleTrieIndex int64 -} - -// DepositCache stores all in-memory deposit objects. This -// stores all the deposit related data that is required by the beacon-node. -type DepositCache struct { - // Beacon chain deposits in memory. - pendingDeposits []*ethpb.DepositContainer - deposits []*ethpb.DepositContainer - finalizedDeposits FinalizedDeposits - depositsByKey map[[fieldparams.BLSPubkeyLength]byte][]*ethpb.DepositContainer - depositsLock sync.RWMutex -} - -// New instantiates a new deposit cache -func New() (*DepositCache, error) { - finalizedDepositsTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) - if err != nil { - return nil, err - } - - // finalizedDeposits.merkleTrieIndex is initialized to -1 because it represents the index of the last trie item. - // Inserting the first item into the trie will set the value of the index to 0. - return &DepositCache{ - pendingDeposits: []*ethpb.DepositContainer{}, - deposits: []*ethpb.DepositContainer{}, - depositsByKey: map[[fieldparams.BLSPubkeyLength]byte][]*ethpb.DepositContainer{}, - finalizedDeposits: FinalizedDeposits{deposits: finalizedDepositsTrie, merkleTrieIndex: -1}, - }, nil -} - -// InsertDeposit into the database. If deposit or block number are nil -// then this method does nothing. -func (dc *DepositCache) InsertDeposit(ctx context.Context, d *ethpb.Deposit, blockNum uint64, index int64, depositRoot [32]byte) error { - _, span := trace.StartSpan(ctx, "DepositsCache.InsertDeposit") - defer span.End() - if d == nil { - log.WithFields(logrus.Fields{ - "block": blockNum, - "deposit": d, - "index": index, - "depositRoot": hex.EncodeToString(depositRoot[:]), - }).Warn("Ignoring nil deposit insertion") - return errors.New("nil deposit inserted into the cache") - } - dc.depositsLock.Lock() - defer dc.depositsLock.Unlock() - - if int(index) != len(dc.deposits) { - return errors.Errorf("wanted deposit with index %d to be inserted but received %d", len(dc.deposits), index) - } - // Keep the slice sorted on insertion in order to avoid costly sorting on retrieval. - heightIdx := sort.Search(len(dc.deposits), func(i int) bool { return dc.deposits[i].Index >= index }) - depCtr := ðpb.DepositContainer{Deposit: d, Eth1BlockHeight: blockNum, DepositRoot: depositRoot[:], Index: index} - newDeposits := append( - []*ethpb.DepositContainer{depCtr}, - dc.deposits[heightIdx:]...) - dc.deposits = append(dc.deposits[:heightIdx], newDeposits...) - // Append the deposit to our map, in the event no deposits - // exist for the pubkey , it is simply added to the map. - pubkey := bytesutil.ToBytes48(d.Data.PublicKey) - dc.depositsByKey[pubkey] = append(dc.depositsByKey[pubkey], depCtr) - historicalDepositsCount.Inc() - return nil -} - -// InsertDepositContainers inserts a set of deposit containers into our deposit cache. -func (dc *DepositCache) InsertDepositContainers(ctx context.Context, ctrs []*ethpb.DepositContainer) { - _, span := trace.StartSpan(ctx, "DepositsCache.InsertDepositContainers") - defer span.End() - dc.depositsLock.Lock() - defer dc.depositsLock.Unlock() - - sort.SliceStable(ctrs, func(i int, j int) bool { return ctrs[i].Index < ctrs[j].Index }) - dc.deposits = ctrs - for _, c := range ctrs { - // Use a new value, as the reference - // of c changes in the next iteration. - newPtr := c - pKey := bytesutil.ToBytes48(newPtr.Deposit.Data.PublicKey) - dc.depositsByKey[pKey] = append(dc.depositsByKey[pKey], newPtr) - } - historicalDepositsCount.Add(float64(len(ctrs))) -} - -// InsertFinalizedDeposits inserts deposits up to eth1DepositIndex (inclusive) into the finalized deposits cache. -func (dc *DepositCache) InsertFinalizedDeposits(ctx context.Context, - eth1DepositIndex int64, _ common.Hash, _ uint64) error { - _, span := trace.StartSpan(ctx, "DepositsCache.InsertFinalizedDeposits") - defer span.End() - dc.depositsLock.Lock() - defer dc.depositsLock.Unlock() - - depositTrie := dc.finalizedDeposits.Deposits() - insertIndex := int(dc.finalizedDeposits.merkleTrieIndex + 1) - - // Don't insert into finalized trie if there is no deposit to - // insert. - if len(dc.deposits) == 0 { - return nil - } - // In the event we have less deposits than we need to - // finalize we finalize till the index on which we do have it. - if len(dc.deposits) <= int(eth1DepositIndex) { - eth1DepositIndex = int64(len(dc.deposits)) - 1 - } - // If we finalize to some lower deposit index, we - // ignore it. - if int(eth1DepositIndex) < insertIndex { - return nil - } - for _, d := range dc.deposits { - if d.Index <= dc.finalizedDeposits.merkleTrieIndex { - continue - } - if d.Index > eth1DepositIndex { - break - } - depHash, err := d.Deposit.Data.HashTreeRoot() - if err != nil { - return errors.Wrap(err, "could not hash deposit data") - } - if err = depositTrie.Insert(depHash[:], insertIndex); err != nil { - return errors.Wrap(err, "could not insert deposit hash") - } - insertIndex++ - } - tree, ok := depositTrie.(*trie.SparseMerkleTrie) - if !ok { - return errors.New("not a sparse merkle tree") - } - dc.finalizedDeposits = FinalizedDeposits{ - deposits: tree, - merkleTrieIndex: eth1DepositIndex, - } - return nil -} - -// AllDepositContainers returns all historical deposit containers. -func (dc *DepositCache) AllDepositContainers(ctx context.Context) []*ethpb.DepositContainer { - _, span := trace.StartSpan(ctx, "DepositsCache.AllDepositContainers") - defer span.End() - dc.depositsLock.RLock() - defer dc.depositsLock.RUnlock() - - // Make a shallow copy of the deposits and return that. This way, the - // caller can safely iterate over the returned list of deposits without - // the possibility of new deposits showing up. If we were to return the - // list without a copy, when a new deposit is added to the cache, it - // would also be present in the returned value. This could result in a - // race condition if the list is being iterated over. - // - // It's not necessary to make a deep copy of this list because the - // deposits in the cache should never be modified. It is still possible - // for the caller to modify one of the underlying deposits and modify - // the cache, but that's not a race condition. Also, a deep copy would - // take too long and use too much memory. - deposits := make([]*ethpb.DepositContainer, len(dc.deposits)) - copy(deposits, dc.deposits) - return deposits -} - -// AllDeposits returns a list of historical deposits until the given block number -// (inclusive). If no block is specified then this method returns all historical deposits. -func (dc *DepositCache) AllDeposits(ctx context.Context, untilBlk *big.Int) []*ethpb.Deposit { - dc.depositsLock.RLock() - defer dc.depositsLock.RUnlock() - - return dc.allDeposits(untilBlk) -} - -func (dc *DepositCache) allDeposits(untilBlk *big.Int) []*ethpb.Deposit { - var deposits []*ethpb.Deposit - for _, ctnr := range dc.deposits { - if untilBlk == nil || untilBlk.Uint64() >= ctnr.Eth1BlockHeight { - deposits = append(deposits, ctnr.Deposit) - } - } - return deposits -} - -// DepositsNumberAndRootAtHeight returns number of deposits made up to blockheight and the -// root that corresponds to the latest deposit at that blockheight. -func (dc *DepositCache) DepositsNumberAndRootAtHeight(ctx context.Context, blockHeight *big.Int) (uint64, [32]byte) { - _, span := trace.StartSpan(ctx, "DepositsCache.DepositsNumberAndRootAtHeight") - defer span.End() - dc.depositsLock.RLock() - defer dc.depositsLock.RUnlock() - heightIdx := sort.Search(len(dc.deposits), func(i int) bool { return dc.deposits[i].Eth1BlockHeight > blockHeight.Uint64() }) - // send the deposit root of the empty trie, if eth1follow distance is greater than the time of the earliest - // deposit. - if heightIdx == 0 { - return 0, [32]byte{} - } - return uint64(heightIdx), bytesutil.ToBytes32(dc.deposits[heightIdx-1].DepositRoot) -} - -// DepositByPubkey looks through historical deposits and finds one which contains -// a certain public key within its deposit data. -func (dc *DepositCache) DepositByPubkey(ctx context.Context, pubKey []byte) (*ethpb.Deposit, *big.Int) { - _, span := trace.StartSpan(ctx, "DepositsCache.DepositByPubkey") - defer span.End() - dc.depositsLock.RLock() - defer dc.depositsLock.RUnlock() - - var deposit *ethpb.Deposit - var blockNum *big.Int - deps, ok := dc.depositsByKey[bytesutil.ToBytes48(pubKey)] - if !ok || len(deps) == 0 { - return deposit, blockNum - } - // We always return the first deposit if a particular - // validator key has multiple deposits assigned to - // it. - deposit = deps[0].Deposit - blockNum = big.NewInt(int64(deps[0].Eth1BlockHeight)) - return deposit, blockNum -} - -// FinalizedDeposits returns the finalized deposits trie. -func (dc *DepositCache) FinalizedDeposits(ctx context.Context) (cache.FinalizedDeposits, error) { - _, span := trace.StartSpan(ctx, "DepositsCache.FinalizedDeposits") - defer span.End() - dc.depositsLock.RLock() - defer dc.depositsLock.RUnlock() - - return &FinalizedDeposits{ - deposits: dc.finalizedDeposits.deposits.Copy(), - merkleTrieIndex: dc.finalizedDeposits.merkleTrieIndex, - }, nil -} - -// NonFinalizedDeposits returns the list of non-finalized deposits until the given block number (inclusive). -// If no block is specified then this method returns all non-finalized deposits. -func (dc *DepositCache) NonFinalizedDeposits(ctx context.Context, lastFinalizedIndex int64, untilBlk *big.Int) []*ethpb.Deposit { - _, span := trace.StartSpan(ctx, "DepositsCache.NonFinalizedDeposits") - defer span.End() - dc.depositsLock.RLock() - defer dc.depositsLock.RUnlock() - - if dc.finalizedDeposits.Deposits() == nil { - return dc.allDeposits(untilBlk) - } - - var deposits []*ethpb.Deposit - for _, d := range dc.deposits { - if (d.Index > lastFinalizedIndex) && (untilBlk == nil || untilBlk.Uint64() >= d.Eth1BlockHeight) { - deposits = append(deposits, d.Deposit) - } - } - - return deposits -} - -// PruneProofs removes proofs from all deposits whose index is equal or less than untilDepositIndex. -func (dc *DepositCache) PruneProofs(ctx context.Context, untilDepositIndex int64) error { - _, span := trace.StartSpan(ctx, "DepositsCache.PruneProofs") - defer span.End() - dc.depositsLock.Lock() - defer dc.depositsLock.Unlock() - - if untilDepositIndex >= int64(len(dc.deposits)) { - untilDepositIndex = int64(len(dc.deposits) - 1) - } - - for i := untilDepositIndex; i >= 0; i-- { - // Finding a nil proof means that all proofs up to this deposit have been already pruned. - if dc.deposits[i].Deposit.Proof == nil { - break - } - dc.deposits[i].Deposit.Proof = nil - } - - return nil -} - -// Deposits returns the cached internal deposit tree. -func (fd *FinalizedDeposits) Deposits() cache.MerkleTree { - if fd.deposits != nil { - return fd.deposits - } - return nil -} - -// MerkleTrieIndex represents the last finalized index in -// the finalized deposit container. -func (fd *FinalizedDeposits) MerkleTrieIndex() int64 { - return fd.merkleTrieIndex -} diff --git a/beacon-chain/cache/depositcache/deposits_cache_test.go b/beacon-chain/cache/depositcache/deposits_cache_test.go deleted file mode 100644 index a5d0a7b068ee..000000000000 --- a/beacon-chain/cache/depositcache/deposits_cache_test.go +++ /dev/null @@ -1,1074 +0,0 @@ -package depositcache - -import ( - "bytes" - "context" - "fmt" - "math/big" - "testing" - - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/config/params" - "github.com/prysmaticlabs/prysm/v5/container/trie" - "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" - ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" - "github.com/prysmaticlabs/prysm/v5/testing/assert" - "github.com/prysmaticlabs/prysm/v5/testing/require" - logTest "github.com/sirupsen/logrus/hooks/test" -) - -const nilDepositErr = "Ignoring nil deposit insertion" - -var _ cache.DepositFetcher = (*DepositCache)(nil) - -func TestInsertDeposit_LogsOnNilDepositInsertion(t *testing.T) { - hook := logTest.NewGlobal() - dc, err := New() - require.NoError(t, err) - - assert.ErrorContains(t, "nil deposit inserted into the cache", dc.InsertDeposit(context.Background(), nil, 1, 0, [32]byte{})) - - require.Equal(t, 0, len(dc.deposits), "Number of deposits changed") - assert.Equal(t, nilDepositErr, hook.LastEntry().Message) -} - -func TestInsertDeposit_MaintainsSortedOrderByIndex(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - insertions := []struct { - blkNum uint64 - deposit *ethpb.Deposit - index int64 - expectedErr string - }{ - { - blkNum: 0, - deposit: ðpb.Deposit{Data: ðpb.Deposit_Data{PublicKey: []byte{'A'}}}, - index: 0, - expectedErr: "", - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Data: ðpb.Deposit_Data{PublicKey: []byte{'B'}}}, - index: 3, - expectedErr: "wanted deposit with index 1 to be inserted but received 3", - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Data: ðpb.Deposit_Data{PublicKey: []byte{'C'}}}, - index: 1, - expectedErr: "", - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Data: ðpb.Deposit_Data{PublicKey: []byte{'D'}}}, - index: 4, - expectedErr: "wanted deposit with index 2 to be inserted but received 4", - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Data: ðpb.Deposit_Data{PublicKey: []byte{'E'}}}, - index: 2, - expectedErr: "", - }, - } - - for _, ins := range insertions { - if ins.expectedErr != "" { - assert.ErrorContains(t, ins.expectedErr, dc.InsertDeposit(context.Background(), ins.deposit, ins.blkNum, ins.index, [32]byte{})) - } else { - assert.NoError(t, dc.InsertDeposit(context.Background(), ins.deposit, ins.blkNum, ins.index, [32]byte{})) - } - } - - expectedIndices := []int64{0, 1, 2} - for i, ei := range expectedIndices { - assert.Equal(t, ei, dc.deposits[i].Index, - fmt.Sprintf("dc.deposits[%d].Index = %d, wanted %d", i, dc.deposits[i].Index, ei)) - } -} - -func TestAllDeposits_ReturnsAllDeposits(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - deposits := []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 11, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 11, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 12, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 12, - Deposit: ðpb.Deposit{}, - }, - } - dc.deposits = deposits - - d := dc.AllDeposits(context.Background(), nil) - assert.Equal(t, len(deposits), len(d)) -} - -func TestAllDeposits_FiltersDepositUpToAndIncludingBlockNumber(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - deposits := []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 11, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 11, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 12, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 12, - Deposit: ðpb.Deposit{}, - }, - } - dc.deposits = deposits - - d := dc.AllDeposits(context.Background(), big.NewInt(11)) - assert.Equal(t, 5, len(d)) -} - -func TestDepositsNumberAndRootAtHeight(t *testing.T) { - wantedRoot := bytesutil.PadTo([]byte("root"), 32) - t.Run("requesting_last_item_works", func(t *testing.T) { - dc, err := New() - require.NoError(t, err) - dc.deposits = []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 10, - Index: 0, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 10, - Index: 1, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 11, - Index: 2, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 13, - Index: 3, - Deposit: ðpb.Deposit{}, - DepositRoot: wantedRoot, - }, - } - n, root := dc.DepositsNumberAndRootAtHeight(context.Background(), big.NewInt(13)) - assert.Equal(t, 4, int(n)) - require.DeepEqual(t, wantedRoot, root[:]) - }) - t.Run("only_one_item", func(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - dc.deposits = []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 10, - Index: 0, - Deposit: ðpb.Deposit{}, - DepositRoot: wantedRoot, - }, - } - n, root := dc.DepositsNumberAndRootAtHeight(context.Background(), big.NewInt(10)) - assert.Equal(t, 1, int(n)) - require.DeepEqual(t, wantedRoot, root[:]) - }) - t.Run("none_at_height_some_below", func(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - dc.deposits = []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 8, - Index: 0, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 9, - Index: 1, - Deposit: ðpb.Deposit{}, - DepositRoot: wantedRoot, - }, - { - Eth1BlockHeight: 11, - Index: 2, - Deposit: ðpb.Deposit{}, - }, - } - n, root := dc.DepositsNumberAndRootAtHeight(context.Background(), big.NewInt(10)) - assert.Equal(t, 2, int(n)) - require.DeepEqual(t, wantedRoot, root[:]) - }) - t.Run("none_at_height_none_below", func(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - dc.deposits = []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 8, - Index: 0, - Deposit: ðpb.Deposit{}, - DepositRoot: wantedRoot, - }, - } - n, root := dc.DepositsNumberAndRootAtHeight(context.Background(), big.NewInt(7)) - assert.Equal(t, 0, int(n)) - require.DeepEqual(t, params.BeaconConfig().ZeroHash, root) - }) - t.Run("none_at_height_one_below", func(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - dc.deposits = []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 8, - Index: 0, - Deposit: ðpb.Deposit{}, - DepositRoot: wantedRoot, - }, - } - n, root := dc.DepositsNumberAndRootAtHeight(context.Background(), big.NewInt(10)) - assert.Equal(t, 1, int(n)) - require.DeepEqual(t, wantedRoot, root[:]) - }) - t.Run("some_greater_some_lower", func(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - dc.deposits = []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 8, - Index: 0, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 8, - Index: 1, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 9, - Index: 2, - Deposit: ðpb.Deposit{}, - DepositRoot: wantedRoot, - }, - { - Eth1BlockHeight: 10, - Index: 3, - Deposit: ðpb.Deposit{}, - }, - { - Eth1BlockHeight: 10, - Index: 4, - Deposit: ðpb.Deposit{}, - }, - } - n, root := dc.DepositsNumberAndRootAtHeight(context.Background(), big.NewInt(9)) - assert.Equal(t, 3, int(n)) - require.DeepEqual(t, wantedRoot, root[:]) - }) -} - -func TestDepositByPubkey_ReturnsFirstMatchingDeposit(t *testing.T) { - dc, err := New() - require.NoError(t, err) - ctrs := []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 9, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte("pk0"), 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - }, - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte("pk1"), 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - }, - { - Eth1BlockHeight: 11, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte("pk1"), 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - }, - { - Eth1BlockHeight: 12, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte("pk2"), 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - }, - } - dc.InsertDepositContainers(context.Background(), ctrs) - - pk1 := bytesutil.PadTo([]byte("pk1"), 48) - dep, blkNum := dc.DepositByPubkey(context.Background(), pk1) - - if dep == nil || !bytes.Equal(dep.Data.PublicKey, pk1) { - t.Error("Returned wrong deposit") - } - assert.Equal(t, 0, blkNum.Cmp(big.NewInt(10)), - fmt.Sprintf("Returned wrong block number %v", blkNum)) -} - -func TestFinalizedDeposits_DepositsCachedCorrectly(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - finalizedDeposits := []*ethpb.DepositContainer{ - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{0}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 0, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{1}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 1, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{2}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 2, - }, - } - dc.deposits = append(finalizedDeposits, ðpb.DepositContainer{ - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{3}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 3, - }) - - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 2, [32]byte{}, 0)) - - cachedDeposits, err := dc.FinalizedDeposits(context.Background()) - require.NoError(t, err) - require.NotNil(t, cachedDeposits, "Deposits not cached") - assert.Equal(t, int64(2), cachedDeposits.MerkleTrieIndex()) - - var deps [][]byte - for _, d := range finalizedDeposits { - hash, err := d.Deposit.Data.HashTreeRoot() - require.NoError(t, err, "Could not hash deposit data") - deps = append(deps, hash[:]) - } - generatedTrie, err := trie.GenerateTrieFromItems(deps, params.BeaconConfig().DepositContractTreeDepth) - require.NoError(t, err, "Could not generate deposit trie") - rootA, err := generatedTrie.HashTreeRoot() - require.NoError(t, err) - rootB, err := cachedDeposits.Deposits().HashTreeRoot() - require.NoError(t, err) - assert.Equal(t, rootA, rootB) -} - -func TestFinalizedDeposits_UtilizesPreviouslyCachedDeposits(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - oldFinalizedDeposits := []*ethpb.DepositContainer{ - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{0}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 0, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{1}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 1, - }, - } - newFinalizedDeposit := ðpb.DepositContainer{ - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{2}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 2, - } - dc.deposits = oldFinalizedDeposits - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 1, [32]byte{}, 0)) - - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 2, [32]byte{}, 0)) - - dc.deposits = append(dc.deposits, []*ethpb.DepositContainer{newFinalizedDeposit}...) - - cachedDeposits, err := dc.FinalizedDeposits(context.Background()) - require.NoError(t, err) - require.NotNil(t, cachedDeposits, "Deposits not cached") - assert.Equal(t, int64(1), cachedDeposits.MerkleTrieIndex()) - - var deps [][]byte - for _, d := range oldFinalizedDeposits { - hash, err := d.Deposit.Data.HashTreeRoot() - require.NoError(t, err, "Could not hash deposit data") - deps = append(deps, hash[:]) - } - generatedTrie, err := trie.GenerateTrieFromItems(deps, params.BeaconConfig().DepositContractTreeDepth) - require.NoError(t, err, "Could not generate deposit trie") - rootA, err := generatedTrie.HashTreeRoot() - require.NoError(t, err) - rootB, err := cachedDeposits.Deposits().HashTreeRoot() - require.NoError(t, err) - assert.Equal(t, rootA, rootB) -} - -func TestFinalizedDeposits_HandleZeroDeposits(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 2, [32]byte{}, 0)) - - cachedDeposits, err := dc.FinalizedDeposits(context.Background()) - require.NoError(t, err) - require.NotNil(t, cachedDeposits, "Deposits not cached") - assert.Equal(t, int64(-1), cachedDeposits.MerkleTrieIndex()) -} - -func TestFinalizedDeposits_HandleSmallerThanExpectedDeposits(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - finalizedDeposits := []*ethpb.DepositContainer{ - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{0}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 0, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{1}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 1, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{2}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 2, - }, - } - dc.deposits = finalizedDeposits - - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 5, [32]byte{}, 0)) - - cachedDeposits, err := dc.FinalizedDeposits(context.Background()) - require.NoError(t, err) - require.NotNil(t, cachedDeposits, "Deposits not cached") - assert.Equal(t, int64(2), cachedDeposits.MerkleTrieIndex()) -} - -func TestFinalizedDeposits_HandleLowerEth1DepositIndex(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - finalizedDeposits := []*ethpb.DepositContainer{ - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{0}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 0, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{1}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 1, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{2}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 2, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{3}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 3, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{4}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 4, - }, - { - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{5}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 5, - }, - } - dc.deposits = finalizedDeposits - - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 5, [32]byte{}, 0)) - - // Reinsert finalized deposits with a lower index. - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 2, [32]byte{}, 0)) - - cachedDeposits, err := dc.FinalizedDeposits(context.Background()) - require.NoError(t, err) - require.NotNil(t, cachedDeposits, "Deposits not cached") - assert.Equal(t, int64(5), cachedDeposits.MerkleTrieIndex()) -} - -func TestFinalizedDeposits_InitializedCorrectly(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - finalizedDeposits := dc.finalizedDeposits - assert.NotNil(t, finalizedDeposits) - assert.NotNil(t, finalizedDeposits.Deposits) - assert.Equal(t, int64(-1), finalizedDeposits.merkleTrieIndex) -} - -func TestNonFinalizedDeposits_ReturnsAllNonFinalizedDeposits(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - finalizedDeposits := []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{0}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 0, - }, - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{1}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 1, - }, - } - dc.deposits = append(finalizedDeposits, - ðpb.DepositContainer{ - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{2}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 2, - }, - ðpb.DepositContainer{ - Eth1BlockHeight: 11, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{3}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 3, - }) - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 1, [32]byte{}, 0)) - - deps := dc.NonFinalizedDeposits(context.Background(), 1, nil) - assert.Equal(t, 2, len(deps)) -} - -func TestNonFinalizedDeposits_ReturnsNonFinalizedDepositsUpToBlockNumber(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - finalizedDeposits := []*ethpb.DepositContainer{ - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{0}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 0, - }, - { - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{1}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 1, - }, - } - dc.deposits = append(finalizedDeposits, - ðpb.DepositContainer{ - Eth1BlockHeight: 10, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{2}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 2, - }, - ðpb.DepositContainer{ - Eth1BlockHeight: 11, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{3}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: 3, - }) - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 1, [32]byte{}, 0)) - - deps := dc.NonFinalizedDeposits(context.Background(), 1, big.NewInt(10)) - assert.Equal(t, 1, len(deps)) -} - -func TestFinalizedDeposits_ReturnsTrieCorrectly(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - generateCtr := func(height uint64, index int64) *ethpb.DepositContainer { - return ðpb.DepositContainer{ - Eth1BlockHeight: height, - Deposit: ðpb.Deposit{ - Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte{uint8(index)}, 48), - WithdrawalCredentials: make([]byte, 32), - Signature: make([]byte, 96), - }, - }, - Index: index, - } - } - - finalizedDeposits := []*ethpb.DepositContainer{ - generateCtr(10, 0), - generateCtr(11, 1), - generateCtr(12, 2), - generateCtr(12, 3), - generateCtr(13, 4), - generateCtr(13, 5), - generateCtr(13, 6), - generateCtr(14, 7), - } - dc.deposits = append(finalizedDeposits, - generateCtr(15, 8), - generateCtr(15, 9), - generateCtr(30, 10)) - trieItems := make([][]byte, 0, len(dc.deposits)) - for _, dep := range dc.allDeposits(big.NewInt(30)) { - depHash, err := dep.Data.HashTreeRoot() - assert.NoError(t, err) - trieItems = append(trieItems, depHash[:]) - } - depositTrie, err := trie.GenerateTrieFromItems(trieItems, params.BeaconConfig().DepositContractTreeDepth) - assert.NoError(t, err) - - // Perform this in a nonsensical ordering - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 10, [32]byte{}, 0)) - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 2, [32]byte{}, 0)) - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 3, [32]byte{}, 0)) - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 4, [32]byte{}, 0)) - - // Mimic finalized deposit trie fetch. - fd, err := dc.FinalizedDeposits(context.Background()) - require.NoError(t, err) - deps := dc.NonFinalizedDeposits(context.Background(), fd.MerkleTrieIndex(), big.NewInt(14)) - insertIndex := fd.MerkleTrieIndex() + 1 - - for _, dep := range deps { - depHash, err := dep.Data.HashTreeRoot() - assert.NoError(t, err) - if err = fd.Deposits().Insert(depHash[:], int(insertIndex)); err != nil { - assert.NoError(t, err) - } - insertIndex++ - } - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 15, [32]byte{}, 0)) - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 15, [32]byte{}, 0)) - require.NoError(t, dc.InsertFinalizedDeposits(context.Background(), 14, [32]byte{}, 0)) - - fd, err = dc.FinalizedDeposits(context.Background()) - require.NoError(t, err) - deps = dc.NonFinalizedDeposits(context.Background(), fd.MerkleTrieIndex(), big.NewInt(30)) - insertIndex = fd.MerkleTrieIndex() + 1 - - for _, dep := range deps { - depHash, err := dep.Data.HashTreeRoot() - assert.NoError(t, err) - if err = fd.Deposits().Insert(depHash[:], int(insertIndex)); err != nil { - assert.NoError(t, err) - } - insertIndex++ - } - assert.Equal(t, fd.Deposits().NumOfItems(), depositTrie.NumOfItems()) -} - -func TestPruneProofs_Ok(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - deposits := []struct { - blkNum uint64 - deposit *ethpb.Deposit - index int64 - }{ - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk0"), 48)}}, - index: 0, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk1"), 48)}}, - index: 1, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk2"), 48)}}, - index: 2, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk3"), 48)}}, - index: 3, - }, - } - - for _, ins := range deposits { - assert.NoError(t, dc.InsertDeposit(context.Background(), ins.deposit, ins.blkNum, ins.index, [32]byte{})) - } - - require.NoError(t, dc.PruneProofs(context.Background(), 1)) - - assert.DeepEqual(t, [][]byte(nil), dc.deposits[0].Deposit.Proof) - assert.DeepEqual(t, [][]byte(nil), dc.deposits[1].Deposit.Proof) - assert.NotNil(t, dc.deposits[2].Deposit.Proof) - assert.NotNil(t, dc.deposits[3].Deposit.Proof) -} - -func TestPruneProofs_SomeAlreadyPruned(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - deposits := []struct { - blkNum uint64 - deposit *ethpb.Deposit - index int64 - }{ - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: nil, Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte("pk0"), 48)}}, - index: 0, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: nil, Data: ðpb.Deposit_Data{ - PublicKey: bytesutil.PadTo([]byte("pk1"), 48)}}, index: 1, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk2"), 48)}}, - index: 2, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk3"), 48)}}, - index: 3, - }, - } - - for _, ins := range deposits { - assert.NoError(t, dc.InsertDeposit(context.Background(), ins.deposit, ins.blkNum, ins.index, [32]byte{})) - } - - require.NoError(t, dc.PruneProofs(context.Background(), 2)) - - assert.DeepEqual(t, [][]byte(nil), dc.deposits[2].Deposit.Proof) -} - -func TestPruneProofs_PruneAllWhenDepositIndexTooBig(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - deposits := []struct { - blkNum uint64 - deposit *ethpb.Deposit - index int64 - }{ - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk0"), 48)}}, - index: 0, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk1"), 48)}}, - index: 1, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk2"), 48)}}, - index: 2, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk3"), 48)}}, - index: 3, - }, - } - - for _, ins := range deposits { - assert.NoError(t, dc.InsertDeposit(context.Background(), ins.deposit, ins.blkNum, ins.index, [32]byte{})) - } - - require.NoError(t, dc.PruneProofs(context.Background(), 99)) - - assert.DeepEqual(t, [][]byte(nil), dc.deposits[0].Deposit.Proof) - assert.DeepEqual(t, [][]byte(nil), dc.deposits[1].Deposit.Proof) - assert.DeepEqual(t, [][]byte(nil), dc.deposits[2].Deposit.Proof) - assert.DeepEqual(t, [][]byte(nil), dc.deposits[3].Deposit.Proof) -} - -func TestPruneProofs_CorrectlyHandleLastIndex(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - deposits := []struct { - blkNum uint64 - deposit *ethpb.Deposit - index int64 - }{ - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk0"), 48)}}, - index: 0, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk1"), 48)}}, - index: 1, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk2"), 48)}}, - index: 2, - }, - { - blkNum: 0, - deposit: ðpb.Deposit{Proof: makeDepositProof(), - Data: ðpb.Deposit_Data{PublicKey: bytesutil.PadTo([]byte("pk3"), 48)}}, - index: 3, - }, - } - - for _, ins := range deposits { - assert.NoError(t, dc.InsertDeposit(context.Background(), ins.deposit, ins.blkNum, ins.index, [32]byte{})) - } - - require.NoError(t, dc.PruneProofs(context.Background(), 4)) - - assert.DeepEqual(t, [][]byte(nil), dc.deposits[0].Deposit.Proof) - assert.DeepEqual(t, [][]byte(nil), dc.deposits[1].Deposit.Proof) - assert.DeepEqual(t, [][]byte(nil), dc.deposits[2].Deposit.Proof) - assert.DeepEqual(t, [][]byte(nil), dc.deposits[3].Deposit.Proof) -} - -func TestDepositMap_WorksCorrectly(t *testing.T) { - dc, err := New() - require.NoError(t, err) - - pk0 := bytesutil.PadTo([]byte("pk0"), 48) - dep, _ := dc.DepositByPubkey(context.Background(), pk0) - var nilDep *ethpb.Deposit - assert.DeepEqual(t, nilDep, dep) - - dep = ðpb.Deposit{Proof: makeDepositProof(), Data: ðpb.Deposit_Data{PublicKey: pk0, Amount: 1000}} - assert.NoError(t, dc.InsertDeposit(context.Background(), dep, 1000, 0, [32]byte{})) - - dep, _ = dc.DepositByPubkey(context.Background(), pk0) - assert.NotEqual(t, nilDep, dep) - assert.Equal(t, uint64(1000), dep.Data.Amount) - - dep = ðpb.Deposit{Proof: makeDepositProof(), Data: ðpb.Deposit_Data{PublicKey: pk0, Amount: 10000}} - assert.NoError(t, dc.InsertDeposit(context.Background(), dep, 1000, 1, [32]byte{})) - - // Make sure we have the same deposit returned over here. - dep, _ = dc.DepositByPubkey(context.Background(), pk0) - assert.NotEqual(t, nilDep, dep) - assert.Equal(t, uint64(1000), dep.Data.Amount) - - // Make sure another key doesn't work. - pk1 := bytesutil.PadTo([]byte("pk1"), 48) - dep, _ = dc.DepositByPubkey(context.Background(), pk1) - assert.DeepEqual(t, nilDep, dep) -} - -func makeDepositProof() [][]byte { - proof := make([][]byte, int(params.BeaconConfig().DepositContractTreeDepth)+1) - for i := range proof { - proof[i] = make([]byte, 32) - } - return proof -} - -func TestEmptyTree(t *testing.T) { - finalizedDepositsTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) - require.NoError(t, err) - v, err := finalizedDepositsTrie.HashTreeRoot() - require.NoError(t, err) - fmt.Printf("%x", v) -} diff --git a/beacon-chain/cache/depositcache/log.go b/beacon-chain/cache/depositcache/log.go deleted file mode 100644 index 6cf0f78a5ab2..000000000000 --- a/beacon-chain/cache/depositcache/log.go +++ /dev/null @@ -1,5 +0,0 @@ -package depositcache - -import "github.com/sirupsen/logrus" - -var log = logrus.WithField("prefix", "depositcache") diff --git a/beacon-chain/cache/depositcache/pending_deposits.go b/beacon-chain/cache/depositcache/pending_deposits.go deleted file mode 100644 index e95c5c1ca3e3..000000000000 --- a/beacon-chain/cache/depositcache/pending_deposits.go +++ /dev/null @@ -1,151 +0,0 @@ -package depositcache - -import ( - "context" - "math/big" - "sort" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/v5/crypto/hash" - ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" - "github.com/sirupsen/logrus" - "go.opencensus.io/trace" -) - -var ( - pendingDepositsCount = promauto.NewGauge(prometheus.GaugeOpts{ - Name: "beacondb_pending_deposits", - Help: "The number of pending deposits in the beaconDB in-memory database", - }) -) - -// PendingDepositsFetcher specifically outlines a struct that can retrieve deposits -// which have not yet been included in the chain. -type PendingDepositsFetcher interface { - PendingContainers(ctx context.Context, untilBlk *big.Int) []*ethpb.DepositContainer -} - -// InsertPendingDeposit into the database. If deposit or block number are nil -// then this method does nothing. -func (dc *DepositCache) InsertPendingDeposit(ctx context.Context, d *ethpb.Deposit, blockNum uint64, index int64, depositRoot [32]byte) { - _, span := trace.StartSpan(ctx, "DepositsCache.InsertPendingDeposit") - defer span.End() - if d == nil { - log.WithFields(logrus.Fields{ - "block": blockNum, - "deposit": d, - }).Debug("Ignoring nil deposit insertion") - return - } - dc.depositsLock.Lock() - defer dc.depositsLock.Unlock() - dc.pendingDeposits = append(dc.pendingDeposits, - ðpb.DepositContainer{Deposit: d, Eth1BlockHeight: blockNum, Index: index, DepositRoot: depositRoot[:]}) - pendingDepositsCount.Inc() - span.AddAttributes(trace.Int64Attribute("count", int64(len(dc.pendingDeposits)))) -} - -// PendingDeposits returns a list of deposits until the given block number -// (inclusive). If no block is specified then this method returns all pending -// deposits. -func (dc *DepositCache) PendingDeposits(ctx context.Context, untilBlk *big.Int) []*ethpb.Deposit { - ctx, span := trace.StartSpan(ctx, "DepositsCache.PendingDeposits") - defer span.End() - - depositCntrs := dc.PendingContainers(ctx, untilBlk) - - deposits := make([]*ethpb.Deposit, 0, len(depositCntrs)) - for _, dep := range depositCntrs { - deposits = append(deposits, dep.Deposit) - } - - return deposits -} - -// PendingContainers returns a list of deposit containers until the given block number -// (inclusive). -func (dc *DepositCache) PendingContainers(ctx context.Context, untilBlk *big.Int) []*ethpb.DepositContainer { - _, span := trace.StartSpan(ctx, "DepositsCache.PendingDeposits") - defer span.End() - dc.depositsLock.RLock() - defer dc.depositsLock.RUnlock() - - depositCntrs := make([]*ethpb.DepositContainer, 0, len(dc.pendingDeposits)) - for _, ctnr := range dc.pendingDeposits { - if untilBlk == nil || untilBlk.Uint64() >= ctnr.Eth1BlockHeight { - depositCntrs = append(depositCntrs, ctnr) - } - } - // Sort the deposits by Merkle index. - sort.SliceStable(depositCntrs, func(i, j int) bool { - return depositCntrs[i].Index < depositCntrs[j].Index - }) - - span.AddAttributes(trace.Int64Attribute("count", int64(len(depositCntrs)))) - - return depositCntrs -} - -// RemovePendingDeposit from the database. The deposit is indexed by the -// Index. This method does nothing if deposit ptr is nil. -func (dc *DepositCache) RemovePendingDeposit(ctx context.Context, d *ethpb.Deposit) { - _, span := trace.StartSpan(ctx, "DepositsCache.RemovePendingDeposit") - defer span.End() - - if d == nil { - log.Debug("Ignoring nil deposit removal") - return - } - - depRoot, err := hash.Proto(d) - if err != nil { - log.WithError(err).Error("Could not remove deposit") - return - } - - dc.depositsLock.Lock() - defer dc.depositsLock.Unlock() - - idx := -1 - for i, ctnr := range dc.pendingDeposits { - h, err := hash.Proto(ctnr.Deposit) - if err != nil { - log.WithError(err).Error("Could not hash deposit") - continue - } - if h == depRoot { - idx = i - break - } - } - - if idx >= 0 { - dc.pendingDeposits = append(dc.pendingDeposits[:idx], dc.pendingDeposits[idx+1:]...) - pendingDepositsCount.Dec() - } -} - -// PrunePendingDeposits removes any deposit which is older than the given deposit merkle tree index. -func (dc *DepositCache) PrunePendingDeposits(ctx context.Context, merkleTreeIndex int64) { - _, span := trace.StartSpan(ctx, "DepositsCache.PrunePendingDeposits") - defer span.End() - - if merkleTreeIndex == 0 { - log.Debug("Ignoring 0 deposit removal") - return - } - - dc.depositsLock.Lock() - defer dc.depositsLock.Unlock() - - cleanDeposits := make([]*ethpb.DepositContainer, 0, len(dc.pendingDeposits)) - for _, dp := range dc.pendingDeposits { - if dp.Index >= merkleTreeIndex { - cleanDeposits = append(cleanDeposits, dp) - } - } - - dc.pendingDeposits = cleanDeposits - pendingDepositsCount.Set(float64(len(dc.pendingDeposits))) -} diff --git a/beacon-chain/cache/depositcache/pending_deposits_test.go b/beacon-chain/cache/depositcache/pending_deposits_test.go deleted file mode 100644 index a1747882c7ea..000000000000 --- a/beacon-chain/cache/depositcache/pending_deposits_test.go +++ /dev/null @@ -1,160 +0,0 @@ -package depositcache - -import ( - "context" - "math/big" - "testing" - - "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" - ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" - "github.com/prysmaticlabs/prysm/v5/testing/assert" - "google.golang.org/protobuf/proto" -) - -var _ PendingDepositsFetcher = (*DepositCache)(nil) - -func TestInsertPendingDeposit_OK(t *testing.T) { - dc := DepositCache{} - dc.InsertPendingDeposit(context.Background(), ðpb.Deposit{}, 111, 100, [32]byte{}) - - assert.Equal(t, 1, len(dc.pendingDeposits), "deposit not inserted") -} - -func TestInsertPendingDeposit_ignoresNilDeposit(t *testing.T) { - dc := DepositCache{} - dc.InsertPendingDeposit(context.Background(), nil /*deposit*/, 0 /*blockNum*/, 0, [32]byte{}) - - assert.Equal(t, 0, len(dc.pendingDeposits)) -} - -func TestRemovePendingDeposit_OK(t *testing.T) { - db := DepositCache{} - proof1 := makeDepositProof() - proof1[0] = bytesutil.PadTo([]byte{'A'}, 32) - proof2 := makeDepositProof() - proof2[0] = bytesutil.PadTo([]byte{'A'}, 32) - data := ðpb.Deposit_Data{ - PublicKey: make([]byte, 48), - WithdrawalCredentials: make([]byte, 32), - Amount: 0, - Signature: make([]byte, 96), - } - depToRemove := ðpb.Deposit{Proof: proof1, Data: data} - otherDep := ðpb.Deposit{Proof: proof2, Data: data} - db.pendingDeposits = []*ethpb.DepositContainer{ - {Deposit: depToRemove, Index: 1}, - {Deposit: otherDep, Index: 5}, - } - db.RemovePendingDeposit(context.Background(), depToRemove) - - if len(db.pendingDeposits) != 1 || !proto.Equal(db.pendingDeposits[0].Deposit, otherDep) { - t.Error("Failed to remove deposit") - } -} - -func TestRemovePendingDeposit_IgnoresNilDeposit(t *testing.T) { - dc := DepositCache{} - dc.pendingDeposits = []*ethpb.DepositContainer{{Deposit: ðpb.Deposit{}}} - dc.RemovePendingDeposit(context.Background(), nil /*deposit*/) - assert.Equal(t, 1, len(dc.pendingDeposits), "deposit unexpectedly removed") -} - -func TestPendingDeposit_RoundTrip(t *testing.T) { - dc := DepositCache{} - proof := makeDepositProof() - proof[0] = bytesutil.PadTo([]byte{'A'}, 32) - data := ðpb.Deposit_Data{ - PublicKey: make([]byte, 48), - WithdrawalCredentials: make([]byte, 32), - Amount: 0, - Signature: make([]byte, 96), - } - dep := ðpb.Deposit{Proof: proof, Data: data} - dc.InsertPendingDeposit(context.Background(), dep, 111, 100, [32]byte{}) - dc.RemovePendingDeposit(context.Background(), dep) - assert.Equal(t, 0, len(dc.pendingDeposits), "Failed to insert & delete a pending deposit") -} - -func TestPendingDeposits_OK(t *testing.T) { - dc := DepositCache{} - - dc.pendingDeposits = []*ethpb.DepositContainer{ - {Eth1BlockHeight: 2, Deposit: ðpb.Deposit{Proof: [][]byte{[]byte("A")}}}, - {Eth1BlockHeight: 4, Deposit: ðpb.Deposit{Proof: [][]byte{[]byte("B")}}}, - {Eth1BlockHeight: 6, Deposit: ðpb.Deposit{Proof: [][]byte{[]byte("c")}}}, - } - - deposits := dc.PendingDeposits(context.Background(), big.NewInt(4)) - expected := []*ethpb.Deposit{ - {Proof: [][]byte{[]byte("A")}}, - {Proof: [][]byte{[]byte("B")}}, - } - assert.DeepSSZEqual(t, expected, deposits) - - all := dc.PendingDeposits(context.Background(), nil) - assert.Equal(t, len(dc.pendingDeposits), len(all), "PendingDeposits(ctx, nil) did not return all deposits") -} - -func TestPrunePendingDeposits_ZeroMerkleIndex(t *testing.T) { - dc := DepositCache{} - - dc.pendingDeposits = []*ethpb.DepositContainer{ - {Eth1BlockHeight: 2, Index: 2}, - {Eth1BlockHeight: 4, Index: 4}, - {Eth1BlockHeight: 6, Index: 6}, - {Eth1BlockHeight: 8, Index: 8}, - {Eth1BlockHeight: 10, Index: 10}, - {Eth1BlockHeight: 12, Index: 12}, - } - - dc.PrunePendingDeposits(context.Background(), 0) - expected := []*ethpb.DepositContainer{ - {Eth1BlockHeight: 2, Index: 2}, - {Eth1BlockHeight: 4, Index: 4}, - {Eth1BlockHeight: 6, Index: 6}, - {Eth1BlockHeight: 8, Index: 8}, - {Eth1BlockHeight: 10, Index: 10}, - {Eth1BlockHeight: 12, Index: 12}, - } - assert.DeepEqual(t, expected, dc.pendingDeposits) -} - -func TestPrunePendingDeposits_OK(t *testing.T) { - dc := DepositCache{} - - dc.pendingDeposits = []*ethpb.DepositContainer{ - {Eth1BlockHeight: 2, Index: 2}, - {Eth1BlockHeight: 4, Index: 4}, - {Eth1BlockHeight: 6, Index: 6}, - {Eth1BlockHeight: 8, Index: 8}, - {Eth1BlockHeight: 10, Index: 10}, - {Eth1BlockHeight: 12, Index: 12}, - } - - dc.PrunePendingDeposits(context.Background(), 6) - expected := []*ethpb.DepositContainer{ - {Eth1BlockHeight: 6, Index: 6}, - {Eth1BlockHeight: 8, Index: 8}, - {Eth1BlockHeight: 10, Index: 10}, - {Eth1BlockHeight: 12, Index: 12}, - } - - assert.DeepEqual(t, expected, dc.pendingDeposits) - - dc.pendingDeposits = []*ethpb.DepositContainer{ - {Eth1BlockHeight: 2, Index: 2}, - {Eth1BlockHeight: 4, Index: 4}, - {Eth1BlockHeight: 6, Index: 6}, - {Eth1BlockHeight: 8, Index: 8}, - {Eth1BlockHeight: 10, Index: 10}, - {Eth1BlockHeight: 12, Index: 12}, - } - - dc.PrunePendingDeposits(context.Background(), 10) - expected = []*ethpb.DepositContainer{ - {Eth1BlockHeight: 10, Index: 10}, - {Eth1BlockHeight: 12, Index: 12}, - } - - assert.DeepEqual(t, expected, dc.pendingDeposits) -} diff --git a/beacon-chain/cache/depositsnapshot/deposit_fetcher.go b/beacon-chain/cache/depositsnapshot/deposit_fetcher.go index 0c6406439ee5..f06baf8b6178 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_fetcher.go +++ b/beacon-chain/cache/depositsnapshot/deposit_fetcher.go @@ -10,6 +10,7 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" + "github.com/prysmaticlabs/prysm/v5/crypto/hash" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/sirupsen/logrus" "github.com/wealdtech/go-bytesutil" @@ -262,6 +263,12 @@ func toFinalizedDepositsContainer(deposits *DepositTree, index int64) finalizedD } } +// PendingDepositsFetcher specifically outlines a struct that can retrieve deposits +// which have not yet been included in the chain. +type PendingDepositsFetcher interface { + PendingContainers(ctx context.Context, untilBlk *big.Int) []*ethpb.DepositContainer +} + // PendingDeposits returns a list of deposits until the given block number // (inclusive). If no block is specified then this method returns all pending // deposits. @@ -302,3 +309,42 @@ func (c *Cache) PendingContainers(ctx context.Context, untilBlk *big.Int) []*eth return depositCntrs } + +// RemovePendingDeposit from the database. The deposit is indexed by the +// Index. This method does nothing if deposit ptr is nil. +func (c *Cache) RemovePendingDeposit(ctx context.Context, d *ethpb.Deposit) { + _, span := trace.StartSpan(ctx, "DepositsCache.RemovePendingDeposit") + defer span.End() + + if d == nil { + log.Debug("Ignoring nil deposit removal") + return + } + + depRoot, err := hash.Proto(d) + if err != nil { + log.WithError(err).Error("Could not remove deposit") + return + } + + c.depositsLock.Lock() + defer c.depositsLock.Unlock() + + idx := -1 + for i, ctnr := range c.pendingDeposits { + h, err := hash.Proto(ctnr.Deposit) + if err != nil { + log.WithError(err).Error("Could not hash deposit") + continue + } + if h == depRoot { + idx = i + break + } + } + + if idx >= 0 { + c.pendingDeposits = append(c.pendingDeposits[:idx], c.pendingDeposits[idx+1:]...) + pendingDepositsCount.Dec() + } +} diff --git a/beacon-chain/execution/log_processing_test.go b/beacon-chain/execution/log_processing_test.go index 21973160e930..4120ca136f8e 100644 --- a/beacon-chain/execution/log_processing_test.go +++ b/beacon-chain/execution/log_processing_test.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed" statefeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/v5/beacon-chain/db" @@ -31,7 +31,7 @@ func TestProcessDepositLog_OK(t *testing.T) { require.NoError(t, err, "Unable to set up simulated backend") beaconDB := testDB.SetupDB(t) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) server, endpoint, err := mockExecution.SetupRPCServer() @@ -100,7 +100,7 @@ func TestProcessDepositLog_InsertsPendingDeposit(t *testing.T) { testAcc, err := mock.Setup() require.NoError(t, err, "Unable to set up simulated backend") beaconDB := testDB.SetupDB(t) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) server, endpoint, err := mockExecution.SetupRPCServer() require.NoError(t, err) @@ -216,7 +216,7 @@ func TestProcessETH2GenesisLog_8DuplicatePubkeys(t *testing.T) { testAcc, err := mock.Setup() require.NoError(t, err, "Unable to set up simulated backend") beaconDB := testDB.SetupDB(t) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) server, endpoint, err := mockExecution.SetupRPCServer() require.NoError(t, err) @@ -291,7 +291,7 @@ func TestProcessETH2GenesisLog(t *testing.T) { testAcc, err := mock.Setup() require.NoError(t, err, "Unable to set up simulated backend") beaconDB := testDB.SetupDB(t) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) server, endpoint, err := mockExecution.SetupRPCServer() @@ -384,7 +384,7 @@ func TestProcessETH2GenesisLog_CorrectNumOfDeposits(t *testing.T) { testAcc, err := mock.Setup() require.NoError(t, err, "Unable to set up simulated backend") kvStore := testDB.SetupDB(t) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) server, endpoint, err := mockExecution.SetupRPCServer() require.NoError(t, err) @@ -481,7 +481,7 @@ func TestProcessETH2GenesisLog_LargePeriodOfNoLogs(t *testing.T) { testAcc, err := mock.Setup() require.NoError(t, err, "Unable to set up simulated backend") kvStore := testDB.SetupDB(t) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) server, endpoint, err := mockExecution.SetupRPCServer() require.NoError(t, err) @@ -593,7 +593,7 @@ func TestCheckForChainstart_NoValidator(t *testing.T) { } func newPowchainService(t *testing.T, eth1Backend *mock.TestAccount, beaconDB db.Database) *Service { - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) server, endpoint, err := mockExecution.SetupRPCServer() require.NoError(t, err) diff --git a/beacon-chain/execution/service_test.go b/beacon-chain/execution/service_test.go index a46249dbb3f1..32e8bc56dfa4 100644 --- a/beacon-chain/execution/service_test.go +++ b/beacon-chain/execution/service_test.go @@ -15,7 +15,7 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/v5/async/event" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" dbutil "github.com/prysmaticlabs/prysm/v5/beacon-chain/db/testing" mockExecution "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/types" @@ -348,7 +348,7 @@ func TestInitDepositCache_OK(t *testing.T) { cfg: &config{beaconDB: beaconDB}, } var err error - s.cfg.depositCache, err = depositcache.New() + s.cfg.depositCache, err = depositsnapshot.New() require.NoError(t, err) require.NoError(t, s.initDepositCaches(context.Background(), ctrs)) @@ -409,7 +409,7 @@ func TestInitDepositCacheWithFinalization_OK(t *testing.T) { cfg: &config{beaconDB: beaconDB}, } var err error - s.cfg.depositCache, err = depositcache.New() + s.cfg.depositCache, err = depositsnapshot.New() require.NoError(t, err) require.NoError(t, s.initDepositCaches(context.Background(), ctrs)) @@ -553,7 +553,7 @@ func Test_batchRequestHeaders_UnderflowChecks(t *testing.T) { func TestService_EnsureConsistentPowchainData(t *testing.T) { beaconDB := dbutil.SetupDB(t) - cache, err := depositcache.New() + cache, err := depositsnapshot.New() require.NoError(t, err) srv, endpoint, err := mockExecution.SetupRPCServer() require.NoError(t, err) @@ -583,7 +583,7 @@ func TestService_EnsureConsistentPowchainData(t *testing.T) { func TestService_InitializeCorrectly(t *testing.T) { beaconDB := dbutil.SetupDB(t) - cache, err := depositcache.New() + cache, err := depositsnapshot.New() require.NoError(t, err) srv, endpoint, err := mockExecution.SetupRPCServer() @@ -614,7 +614,7 @@ func TestService_InitializeCorrectly(t *testing.T) { func TestService_EnsureValidPowchainData(t *testing.T) { beaconDB := dbutil.SetupDB(t) - cache, err := depositcache.New() + cache, err := depositsnapshot.New() require.NoError(t, err) srv, endpoint, err := mockExecution.SetupRPCServer() require.NoError(t, err) @@ -809,7 +809,7 @@ func (s *slowRPCClient) CallContext(_ context.Context, _ interface{}, _ string, func TestService_migrateOldDepositTree(t *testing.T) { beaconDB := dbutil.SetupDB(t) - cache, err := depositcache.New() + cache, err := depositsnapshot.New() require.NoError(t, err) srv, endpoint, err := mockExecution.SetupRPCServer() diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/duties_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/duties_test.go index 367ecaf72673..c42bac4d615b 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/duties_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/duties_test.go @@ -8,7 +8,7 @@ import ( mockChain "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/execution" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" @@ -334,7 +334,7 @@ func TestGetAltairDuties_UnknownPubkey(t *testing.T) { chain := &mockChain.ChainService{ State: bs, Root: genesisRoot[:], Genesis: time.Now().Add(time.Duration(-1*int64(slot-1)) * time.Second), } - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) vs := &Server{ diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go index 023d85717e62..37b82a7617a5 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go @@ -14,7 +14,7 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/builder" builderTest "github.com/prysmaticlabs/prysm/v5/beacon-chain/builder/testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" b "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" @@ -1000,7 +1000,7 @@ func TestProposer_PendingDeposits_OutsideEth1FollowWindow(t *testing.T) { }, } - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) @@ -1139,7 +1139,7 @@ func TestProposer_PendingDeposits_FollowsCorrectEth1Block(t *testing.T) { }, } - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) @@ -1244,7 +1244,7 @@ func TestProposer_PendingDeposits_CantReturnBelowStateEth1DepositIndex(t *testin depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) for _, dp := range append(readyDeposits, recentDeposits...) { @@ -1344,7 +1344,7 @@ func TestProposer_PendingDeposits_CantReturnMoreThanMax(t *testing.T) { depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) for _, dp := range append(readyDeposits, recentDeposits...) { @@ -1442,7 +1442,7 @@ func TestProposer_PendingDeposits_CantReturnMoreThanDepositCount(t *testing.T) { depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) for _, dp := range append(readyDeposits, recentDeposits...) { @@ -1553,7 +1553,7 @@ func TestProposer_DepositTrie_UtilizesCachedFinalizedDeposits(t *testing.T) { }, } - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) @@ -1669,7 +1669,7 @@ func TestProposer_DepositTrie_RebuildTrie(t *testing.T) { }, } - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) @@ -1810,7 +1810,7 @@ func TestProposer_Eth1Data_MajorityVote_SpansGenesis(t *testing.T) { InsertBlock(100, latestValidTime, []byte("latest")) headBlockHash := []byte("headb") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) ps := &Server{ ChainStartFetcher: p, @@ -1851,7 +1851,7 @@ func TestProposer_Eth1Data_MajorityVote(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() require.NoError(t, err) @@ -2351,7 +2351,7 @@ func TestProposer_Eth1Data_MajorityVote(t *testing.T) { BlockHash: []byte("eth1data"), } - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) beaconState, err := state_native.InitializeFromProtoPhase0(ðpb.BeaconState{ @@ -2547,7 +2547,7 @@ func TestProposer_Deposits_ReturnsEmptyList_IfLatestEth1DataEqGenesisEth1Block(t depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) for _, dp := range append(readyDeposits, recentDeposits...) { diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/server.go b/beacon-chain/rpc/prysm/v1alpha1/validator/server.go index 867503f788d9..2f2d4aee1acd 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/server.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/server.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain" "github.com/prysmaticlabs/prysm/v5/beacon-chain/builder" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" blockfeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/block" opfeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/operation" statefeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/state" @@ -69,7 +69,7 @@ type Server struct { BlobReceiver blockchain.BlobReceiver MockEth1Votes bool Eth1BlockFetcher execution.POWBlockFetcher - PendingDepositsFetcher depositcache.PendingDepositsFetcher + PendingDepositsFetcher depositsnapshot.PendingDepositsFetcher OperationNotifier opfeed.Notifier StateGen stategen.StateManager ReplayerBuilder stategen.ReplayerBuilder diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/server_mainnet_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/server_mainnet_test.go index d33836d704f9..a49e2b3704b8 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/server_mainnet_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/server_mainnet_test.go @@ -5,7 +5,7 @@ import ( "testing" mockChain "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" mockExecution "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/testing" state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" @@ -65,7 +65,7 @@ func TestWaitForActivation_ValidatorOriginallyExists(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go index e8c5f66e7ae1..58dfb2ea314b 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/v5/async/event" mockChain "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" mockExecution "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/startup" @@ -70,7 +70,7 @@ func TestWaitForActivation_ContextClosed(t *testing.T) { require.NoError(t, err, "Could not get signing root") ctx, cancel := context.WithCancel(context.Background()) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) vs := &Server{ diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/status_mainnet_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/status_mainnet_test.go index 47a10a6da27a..c275d7877462 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/status_mainnet_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/status_mainnet_test.go @@ -7,7 +7,7 @@ import ( "time" mockChain "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" mockExecution "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/testing" state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" @@ -40,7 +40,7 @@ func TestValidatorStatus_Active(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go index c7c98955195e..fec7a0f5bbaa 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go @@ -8,7 +8,7 @@ import ( "github.com/d4l3k/messagediff" mockChain "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" mockExecution "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" @@ -38,7 +38,7 @@ func TestValidatorStatus_DepositedEth1(t *testing.T) { pubKey1 := deposit.Data.PublicKey depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -80,7 +80,7 @@ func TestValidatorStatus_Deposited(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -125,7 +125,7 @@ func TestValidatorStatus_PartiallyDeposited(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -178,7 +178,7 @@ func TestValidatorStatus_Pending_MultipleDeposits(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -255,7 +255,7 @@ func TestValidatorStatus_Pending(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -318,7 +318,7 @@ func TestValidatorStatus_Exiting(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -377,7 +377,7 @@ func TestValidatorStatus_Slashing(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -435,7 +435,7 @@ func TestValidatorStatus_Exited(t *testing.T) { } depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -464,7 +464,7 @@ func TestValidatorStatus_Exited(t *testing.T) { func TestValidatorStatus_UnknownStatus(t *testing.T) { pubKey := pubKey(1) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) stateObj, err := state_native.InitializeFromProtoUnsafePhase0(ðpb.BeaconState{ @@ -520,7 +520,7 @@ func TestActivationStatus_OK(t *testing.T) { dep := deposits[0] depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() @@ -659,7 +659,7 @@ func TestValidatorStatus_CorrectActivationQueue(t *testing.T) { depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) for i := 0; i < 6; i++ { @@ -751,7 +751,7 @@ func TestMultipleValidatorStatus_Pubkeys(t *testing.T) { require.NoError(t, err, "Could not get signing root") depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) dep := deposits[0] @@ -916,7 +916,7 @@ func TestValidatorStatus_Invalid(t *testing.T) { deposit.Data.Signature = deposit.Data.Signature[1:] depositTrie, err := trie.NewTrie(params.BeaconConfig().DepositContractTreeDepth) require.NoError(t, err, "Could not setup deposit trie") - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) root, err := depositTrie.HashTreeRoot() diff --git a/beacon-chain/rpc/service.go b/beacon-chain/rpc/service.go index 49890335a990..39ce4ca2c302 100644 --- a/beacon-chain/rpc/service.go +++ b/beacon-chain/rpc/service.go @@ -20,7 +20,7 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain" "github.com/prysmaticlabs/prysm/v5/beacon-chain/builder" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" blockfeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/block" opfeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/operation" statefeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/state" @@ -127,7 +127,7 @@ type Config struct { PeerManager p2p.PeerManager MetadataProvider p2p.MetadataProvider DepositFetcher cache.DepositFetcher - PendingDepositFetcher depositcache.PendingDepositsFetcher + PendingDepositFetcher depositsnapshot.PendingDepositsFetcher StateNotifier statefeed.Notifier BlockNotifier blockfeed.Notifier OperationNotifier opfeed.Notifier diff --git a/testing/spectest/shared/common/forkchoice/service.go b/testing/spectest/shared/common/forkchoice/service.go index d285f4d85c47..c02814f94e7e 100644 --- a/testing/spectest/shared/common/forkchoice/service.go +++ b/testing/spectest/shared/common/forkchoice/service.go @@ -12,7 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/kzg" mock "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositcache" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache/depositsnapshot" coreTime "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/v5/beacon-chain/db/filesystem" testDB "github.com/prysmaticlabs/prysm/v5/beacon-chain/db/testing" @@ -56,7 +56,7 @@ func startChainService(t testing.TB, }) require.NoError(t, err) - depositCache, err := depositcache.New() + depositCache, err := depositsnapshot.New() require.NoError(t, err) fc := doublylinkedtree.New() From ac35abe7a84560a0f4bdf235cdf158c0d908f4de Mon Sep 17 00:00:00 2001 From: Saolyn Date: Wed, 3 Apr 2024 16:52:47 +0200 Subject: [PATCH 05/15] Gaz --- beacon-chain/blockchain/BUILD.bazel | 2 +- beacon-chain/execution/BUILD.bazel | 2 +- beacon-chain/rpc/BUILD.bazel | 2 +- beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel | 2 -- testing/spectest/shared/common/forkchoice/BUILD.bazel | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/beacon-chain/blockchain/BUILD.bazel b/beacon-chain/blockchain/BUILD.bazel index 3de875446c4f..a078093903e3 100644 --- a/beacon-chain/blockchain/BUILD.bazel +++ b/beacon-chain/blockchain/BUILD.bazel @@ -137,7 +137,7 @@ go_test( "//async/event:go_default_library", "//beacon-chain/blockchain/testing:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", + "//beacon-chain/cache/depositsnapshot:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/feed/state:go_default_library", "//beacon-chain/core/helpers:go_default_library", diff --git a/beacon-chain/execution/BUILD.bazel b/beacon-chain/execution/BUILD.bazel index b1f936a7b138..2ff3ec037916 100644 --- a/beacon-chain/execution/BUILD.bazel +++ b/beacon-chain/execution/BUILD.bazel @@ -93,7 +93,7 @@ go_test( embed = [":go_default_library"], deps = [ "//async/event:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", + "//beacon-chain/cache/depositsnapshot:go_default_library", "//beacon-chain/core/feed:go_default_library", "//beacon-chain/core/feed/state:go_default_library", "//beacon-chain/core/helpers:go_default_library", diff --git a/beacon-chain/rpc/BUILD.bazel b/beacon-chain/rpc/BUILD.bazel index 45bd6e16d053..97e28d2051c5 100644 --- a/beacon-chain/rpc/BUILD.bazel +++ b/beacon-chain/rpc/BUILD.bazel @@ -13,7 +13,7 @@ go_library( "//beacon-chain/blockchain:go_default_library", "//beacon-chain/builder:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", + "//beacon-chain/cache/depositsnapshot:go_default_library", "//beacon-chain/core/feed/block:go_default_library", "//beacon-chain/core/feed/operation:go_default_library", "//beacon-chain/core/feed/state:go_default_library", diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel index 12c85ee66768..9089c687b722 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel @@ -37,7 +37,6 @@ go_library( "//beacon-chain/blockchain:go_default_library", "//beacon-chain/builder:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/feed:go_default_library", "//beacon-chain/core/feed/block:go_default_library", @@ -112,7 +111,6 @@ common_deps = [ "//beacon-chain/builder:go_default_library", "//beacon-chain/builder/testing:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", "//beacon-chain/core/altair:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/execution:go_default_library", diff --git a/testing/spectest/shared/common/forkchoice/BUILD.bazel b/testing/spectest/shared/common/forkchoice/BUILD.bazel index 9cf4c3bd33f7..b1a8743217fc 100644 --- a/testing/spectest/shared/common/forkchoice/BUILD.bazel +++ b/testing/spectest/shared/common/forkchoice/BUILD.bazel @@ -16,7 +16,7 @@ go_library( "//beacon-chain/blockchain/kzg:go_default_library", "//beacon-chain/blockchain/testing:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", + "//beacon-chain/cache/depositsnapshot:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/transition:go_default_library", "//beacon-chain/db/filesystem:go_default_library", From 620ed8bef52973a0fb5976e6ba5fbddc77cc9653 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Wed, 3 Apr 2024 16:59:59 +0200 Subject: [PATCH 06/15] Fix build import --- beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel | 2 ++ 1 file changed, 2 insertions(+) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel index 9089c687b722..1292807866dd 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel @@ -37,6 +37,7 @@ go_library( "//beacon-chain/blockchain:go_default_library", "//beacon-chain/builder:go_default_library", "//beacon-chain/cache:go_default_library", + "//beacon-chain/cache/depositsnapshot:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/feed:go_default_library", "//beacon-chain/core/feed/block:go_default_library", @@ -111,6 +112,7 @@ common_deps = [ "//beacon-chain/builder:go_default_library", "//beacon-chain/builder/testing:go_default_library", "//beacon-chain/cache:go_default_library", + "//beacon-chain/cache/depositcache:go_default_library", "//beacon-chain/core/altair:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/execution:go_default_library", From 9de364df861fc03230b6374550393abb035440df Mon Sep 17 00:00:00 2001 From: Saolyn Date: Wed, 3 Apr 2024 17:06:24 +0200 Subject: [PATCH 07/15] Replace depositcache --- beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel index 1292807866dd..caec5549b905 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel @@ -112,7 +112,7 @@ common_deps = [ "//beacon-chain/builder:go_default_library", "//beacon-chain/builder/testing:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/cache/depositcache:go_default_library", + "//beacon-chain/cache/depositsnapshot:go_default_library", "//beacon-chain/core/altair:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/execution:go_default_library", From 678652d12267a2aae9c572f7504e5502a28cb976 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Wed, 3 Apr 2024 17:11:29 +0200 Subject: [PATCH 08/15] Add pendingDeposit tests --- .../cache/depositsnapshot/BUILD.bazel | 2 + .../depositsnapshot/deposit_fetcher_test.go | 160 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go diff --git a/beacon-chain/cache/depositsnapshot/BUILD.bazel b/beacon-chain/cache/depositsnapshot/BUILD.bazel index 01f593cee0ac..a50c518f89b7 100644 --- a/beacon-chain/cache/depositsnapshot/BUILD.bazel +++ b/beacon-chain/cache/depositsnapshot/BUILD.bazel @@ -34,6 +34,7 @@ go_test( name = "go_default_test", srcs = [ "deposit_cache_test.go", + "deposit_fetcher_test.go", "deposit_tree_snapshot_test.go", "merkle_tree_test.go", "spec_test.go", @@ -56,5 +57,6 @@ go_test( "@com_github_pkg_errors//:go_default_library", "@in_gopkg_yaml_v3//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go b/beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go new file mode 100644 index 000000000000..cdb3209423cb --- /dev/null +++ b/beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go @@ -0,0 +1,160 @@ +package depositsnapshot + +import ( + "context" + "math/big" + "testing" + + "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v5/testing/assert" + "google.golang.org/protobuf/proto" +) + +var _ PendingDepositsFetcher = (*Cache)(nil) + +func TestInsertPendingDeposit_OK(t *testing.T) { + dc := Cache{} + dc.InsertPendingDeposit(context.Background(), ðpb.Deposit{}, 111, 100, [32]byte{}) + + assert.Equal(t, 1, len(dc.pendingDeposits), "deposit not inserted") +} + +func TestInsertPendingDeposit_ignoresNilDeposit(t *testing.T) { + dc := Cache{} + dc.InsertPendingDeposit(context.Background(), nil /*deposit*/, 0 /*blockNum*/, 0, [32]byte{}) + + assert.Equal(t, 0, len(dc.pendingDeposits)) +} + +func TestRemovePendingDeposit_OK(t *testing.T) { + db := Cache{} + proof1 := makeDepositProof() + proof1[0] = bytesutil.PadTo([]byte{'A'}, 32) + proof2 := makeDepositProof() + proof2[0] = bytesutil.PadTo([]byte{'A'}, 32) + data := ðpb.Deposit_Data{ + PublicKey: make([]byte, 48), + WithdrawalCredentials: make([]byte, 32), + Amount: 0, + Signature: make([]byte, 96), + } + depToRemove := ðpb.Deposit{Proof: proof1, Data: data} + otherDep := ðpb.Deposit{Proof: proof2, Data: data} + db.pendingDeposits = []*ethpb.DepositContainer{ + {Deposit: depToRemove, Index: 1}, + {Deposit: otherDep, Index: 5}, + } + db.RemovePendingDeposit(context.Background(), depToRemove) + + if len(db.pendingDeposits) != 1 || !proto.Equal(db.pendingDeposits[0].Deposit, otherDep) { + t.Error("Failed to remove deposit") + } +} + +func TestRemovePendingDeposit_IgnoresNilDeposit(t *testing.T) { + dc := Cache{} + dc.pendingDeposits = []*ethpb.DepositContainer{{Deposit: ðpb.Deposit{}}} + dc.RemovePendingDeposit(context.Background(), nil /*deposit*/) + assert.Equal(t, 1, len(dc.pendingDeposits), "deposit unexpectedly removed") +} + +func TestPendingDeposit_RoundTrip(t *testing.T) { + dc := Cache{} + proof := makeDepositProof() + proof[0] = bytesutil.PadTo([]byte{'A'}, 32) + data := ðpb.Deposit_Data{ + PublicKey: make([]byte, 48), + WithdrawalCredentials: make([]byte, 32), + Amount: 0, + Signature: make([]byte, 96), + } + dep := ðpb.Deposit{Proof: proof, Data: data} + dc.InsertPendingDeposit(context.Background(), dep, 111, 100, [32]byte{}) + dc.RemovePendingDeposit(context.Background(), dep) + assert.Equal(t, 0, len(dc.pendingDeposits), "Failed to insert & delete a pending deposit") +} + +func TestPendingDeposits_OK(t *testing.T) { + dc := Cache{} + + dc.pendingDeposits = []*ethpb.DepositContainer{ + {Eth1BlockHeight: 2, Deposit: ðpb.Deposit{Proof: [][]byte{[]byte("A")}}}, + {Eth1BlockHeight: 4, Deposit: ðpb.Deposit{Proof: [][]byte{[]byte("B")}}}, + {Eth1BlockHeight: 6, Deposit: ðpb.Deposit{Proof: [][]byte{[]byte("c")}}}, + } + + deposits := dc.PendingDeposits(context.Background(), big.NewInt(4)) + expected := []*ethpb.Deposit{ + {Proof: [][]byte{[]byte("A")}}, + {Proof: [][]byte{[]byte("B")}}, + } + assert.DeepSSZEqual(t, expected, deposits) + + all := dc.PendingDeposits(context.Background(), nil) + assert.Equal(t, len(dc.pendingDeposits), len(all), "PendingDeposits(ctx, nil) did not return all deposits") +} + +func TestPrunePendingDeposits_ZeroMerkleIndex(t *testing.T) { + dc := Cache{} + + dc.pendingDeposits = []*ethpb.DepositContainer{ + {Eth1BlockHeight: 2, Index: 2}, + {Eth1BlockHeight: 4, Index: 4}, + {Eth1BlockHeight: 6, Index: 6}, + {Eth1BlockHeight: 8, Index: 8}, + {Eth1BlockHeight: 10, Index: 10}, + {Eth1BlockHeight: 12, Index: 12}, + } + + dc.PrunePendingDeposits(context.Background(), 0) + expected := []*ethpb.DepositContainer{ + {Eth1BlockHeight: 2, Index: 2}, + {Eth1BlockHeight: 4, Index: 4}, + {Eth1BlockHeight: 6, Index: 6}, + {Eth1BlockHeight: 8, Index: 8}, + {Eth1BlockHeight: 10, Index: 10}, + {Eth1BlockHeight: 12, Index: 12}, + } + assert.DeepEqual(t, expected, dc.pendingDeposits) +} + +func TestPrunePendingDeposits_OK(t *testing.T) { + dc := Cache{} + + dc.pendingDeposits = []*ethpb.DepositContainer{ + {Eth1BlockHeight: 2, Index: 2}, + {Eth1BlockHeight: 4, Index: 4}, + {Eth1BlockHeight: 6, Index: 6}, + {Eth1BlockHeight: 8, Index: 8}, + {Eth1BlockHeight: 10, Index: 10}, + {Eth1BlockHeight: 12, Index: 12}, + } + + dc.PrunePendingDeposits(context.Background(), 6) + expected := []*ethpb.DepositContainer{ + {Eth1BlockHeight: 6, Index: 6}, + {Eth1BlockHeight: 8, Index: 8}, + {Eth1BlockHeight: 10, Index: 10}, + {Eth1BlockHeight: 12, Index: 12}, + } + + assert.DeepEqual(t, expected, dc.pendingDeposits) + + dc.pendingDeposits = []*ethpb.DepositContainer{ + {Eth1BlockHeight: 2, Index: 2}, + {Eth1BlockHeight: 4, Index: 4}, + {Eth1BlockHeight: 6, Index: 6}, + {Eth1BlockHeight: 8, Index: 8}, + {Eth1BlockHeight: 10, Index: 10}, + {Eth1BlockHeight: 12, Index: 12}, + } + + dc.PrunePendingDeposits(context.Background(), 10) + expected = []*ethpb.DepositContainer{ + {Eth1BlockHeight: 10, Index: 10}, + {Eth1BlockHeight: 12, Index: 12}, + } + + assert.DeepEqual(t, expected, dc.pendingDeposits) +} From 8c1caef479d67d4b5859c7d3e8c20b3c568eb872 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Thu, 18 Apr 2024 10:14:22 +0200 Subject: [PATCH 09/15] Nishant's fix --- beacon-chain/cache/depositsnapshot/deposit_tree.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/beacon-chain/cache/depositsnapshot/deposit_tree.go b/beacon-chain/cache/depositsnapshot/deposit_tree.go index 0f5e6cc6e5df..94650bceb9b7 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_tree.go +++ b/beacon-chain/cache/depositsnapshot/deposit_tree.go @@ -100,10 +100,11 @@ func (d *DepositTree) getProof(index uint64) ([32]byte, [][32]byte, error) { return [32]byte{}, nil, ErrInvalidDepositCount } finalizedDeposits, _ := d.tree.GetFinalized([][32]byte{}) + finalizedIdx := -1 if finalizedDeposits != 0 { - finalizedDeposits = finalizedDeposits - 1 + finalizedIdx = int(finalizedDeposits) - 1 } - if index <= finalizedDeposits { + if finalizedDeposits > 0 && int(index) <= finalizedIdx { return [32]byte{}, nil, ErrInvalidIndex } leaf, proof := generateProof(d.tree, index, DepositContractDepth) From d16d0f9ccfa8ae18e605001dabe84dadab2990be Mon Sep 17 00:00:00 2001 From: Saolyn Date: Thu, 18 Apr 2024 10:23:36 +0200 Subject: [PATCH 10/15] Fix unsafe uint64 to int --- beacon-chain/cache/depositsnapshot/deposit_tree.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/beacon-chain/cache/depositsnapshot/deposit_tree.go b/beacon-chain/cache/depositsnapshot/deposit_tree.go index 94650bceb9b7..dd2abff936dd 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_tree.go +++ b/beacon-chain/cache/depositsnapshot/deposit_tree.go @@ -104,7 +104,11 @@ func (d *DepositTree) getProof(index uint64) ([32]byte, [][32]byte, error) { if finalizedDeposits != 0 { finalizedIdx = int(finalizedDeposits) - 1 } - if finalizedDeposits > 0 && int(index) <= finalizedIdx { + i, err := math.Int(index) + if err != nil { + return [32]byte{}, nil, err + } + if finalizedDeposits > 0 && i <= finalizedIdx { return [32]byte{}, nil, ErrInvalidIndex } leaf, proof := generateProof(d.tree, index, DepositContractDepth) From a424a0c71e88f913af1ab18f886bcedafcff36b9 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Thu, 18 Apr 2024 10:25:37 +0200 Subject: [PATCH 11/15] Fix other unsafe uint64 to int --- beacon-chain/cache/depositsnapshot/deposit_tree.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/beacon-chain/cache/depositsnapshot/deposit_tree.go b/beacon-chain/cache/depositsnapshot/deposit_tree.go index dd2abff936dd..1f27663d559a 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_tree.go +++ b/beacon-chain/cache/depositsnapshot/deposit_tree.go @@ -102,7 +102,11 @@ func (d *DepositTree) getProof(index uint64) ([32]byte, [][32]byte, error) { finalizedDeposits, _ := d.tree.GetFinalized([][32]byte{}) finalizedIdx := -1 if finalizedDeposits != 0 { - finalizedIdx = int(finalizedDeposits) - 1 + fd, err := math.Int(finalizedDeposits) + if err != nil { + return [32]byte{}, nil, err + } + finalizedIdx = fd - 1 } i, err := math.Int(index) if err != nil { From 8bc6be63ff47acd37131fa282a70ec903d6504f8 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Fri, 19 Apr 2024 14:55:44 +0200 Subject: [PATCH 12/15] Remove: RemovePendingDeposit --- .../cache/depositsnapshot/deposit_fetcher.go | 40 --------------- .../depositsnapshot/deposit_fetcher_test.go | 50 ------------------- 2 files changed, 90 deletions(-) diff --git a/beacon-chain/cache/depositsnapshot/deposit_fetcher.go b/beacon-chain/cache/depositsnapshot/deposit_fetcher.go index f06baf8b6178..2cf862765ea7 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_fetcher.go +++ b/beacon-chain/cache/depositsnapshot/deposit_fetcher.go @@ -10,7 +10,6 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prysmaticlabs/prysm/v5/beacon-chain/cache" fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" - "github.com/prysmaticlabs/prysm/v5/crypto/hash" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/sirupsen/logrus" "github.com/wealdtech/go-bytesutil" @@ -309,42 +308,3 @@ func (c *Cache) PendingContainers(ctx context.Context, untilBlk *big.Int) []*eth return depositCntrs } - -// RemovePendingDeposit from the database. The deposit is indexed by the -// Index. This method does nothing if deposit ptr is nil. -func (c *Cache) RemovePendingDeposit(ctx context.Context, d *ethpb.Deposit) { - _, span := trace.StartSpan(ctx, "DepositsCache.RemovePendingDeposit") - defer span.End() - - if d == nil { - log.Debug("Ignoring nil deposit removal") - return - } - - depRoot, err := hash.Proto(d) - if err != nil { - log.WithError(err).Error("Could not remove deposit") - return - } - - c.depositsLock.Lock() - defer c.depositsLock.Unlock() - - idx := -1 - for i, ctnr := range c.pendingDeposits { - h, err := hash.Proto(ctnr.Deposit) - if err != nil { - log.WithError(err).Error("Could not hash deposit") - continue - } - if h == depRoot { - idx = i - break - } - } - - if idx >= 0 { - c.pendingDeposits = append(c.pendingDeposits[:idx], c.pendingDeposits[idx+1:]...) - pendingDepositsCount.Dec() - } -} diff --git a/beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go b/beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go index cdb3209423cb..04c949355402 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go +++ b/beacon-chain/cache/depositsnapshot/deposit_fetcher_test.go @@ -5,10 +5,8 @@ import ( "math/big" "testing" - "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/assert" - "google.golang.org/protobuf/proto" ) var _ PendingDepositsFetcher = (*Cache)(nil) @@ -27,54 +25,6 @@ func TestInsertPendingDeposit_ignoresNilDeposit(t *testing.T) { assert.Equal(t, 0, len(dc.pendingDeposits)) } -func TestRemovePendingDeposit_OK(t *testing.T) { - db := Cache{} - proof1 := makeDepositProof() - proof1[0] = bytesutil.PadTo([]byte{'A'}, 32) - proof2 := makeDepositProof() - proof2[0] = bytesutil.PadTo([]byte{'A'}, 32) - data := ðpb.Deposit_Data{ - PublicKey: make([]byte, 48), - WithdrawalCredentials: make([]byte, 32), - Amount: 0, - Signature: make([]byte, 96), - } - depToRemove := ðpb.Deposit{Proof: proof1, Data: data} - otherDep := ðpb.Deposit{Proof: proof2, Data: data} - db.pendingDeposits = []*ethpb.DepositContainer{ - {Deposit: depToRemove, Index: 1}, - {Deposit: otherDep, Index: 5}, - } - db.RemovePendingDeposit(context.Background(), depToRemove) - - if len(db.pendingDeposits) != 1 || !proto.Equal(db.pendingDeposits[0].Deposit, otherDep) { - t.Error("Failed to remove deposit") - } -} - -func TestRemovePendingDeposit_IgnoresNilDeposit(t *testing.T) { - dc := Cache{} - dc.pendingDeposits = []*ethpb.DepositContainer{{Deposit: ðpb.Deposit{}}} - dc.RemovePendingDeposit(context.Background(), nil /*deposit*/) - assert.Equal(t, 1, len(dc.pendingDeposits), "deposit unexpectedly removed") -} - -func TestPendingDeposit_RoundTrip(t *testing.T) { - dc := Cache{} - proof := makeDepositProof() - proof[0] = bytesutil.PadTo([]byte{'A'}, 32) - data := ðpb.Deposit_Data{ - PublicKey: make([]byte, 48), - WithdrawalCredentials: make([]byte, 32), - Amount: 0, - Signature: make([]byte, 96), - } - dep := ðpb.Deposit{Proof: proof, Data: data} - dc.InsertPendingDeposit(context.Background(), dep, 111, 100, [32]byte{}) - dc.RemovePendingDeposit(context.Background(), dep) - assert.Equal(t, 0, len(dc.pendingDeposits), "Failed to insert & delete a pending deposit") -} - func TestPendingDeposits_OK(t *testing.T) { dc := Cache{} From 21e578121ddd7b4d2e2cf9aaed208bf321247a53 Mon Sep 17 00:00:00 2001 From: Saolyn Date: Fri, 19 Apr 2024 14:59:25 +0200 Subject: [PATCH 13/15] Deprecate and remove DisableEIP4881 flag --- beacon-chain/cache/depositsnapshot/BUILD.bazel | 1 - config/features/deprecated_flags.go | 6 ++++++ config/features/flags.go | 5 ----- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/beacon-chain/cache/depositsnapshot/BUILD.bazel b/beacon-chain/cache/depositsnapshot/BUILD.bazel index a50c518f89b7..c300f81f31fa 100644 --- a/beacon-chain/cache/depositsnapshot/BUILD.bazel +++ b/beacon-chain/cache/depositsnapshot/BUILD.bazel @@ -57,6 +57,5 @@ go_test( "@com_github_pkg_errors//:go_default_library", "@in_gopkg_yaml_v3//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", - "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/config/features/deprecated_flags.go b/config/features/deprecated_flags.go index 3c4c2e74b9cc..1f31876dcf61 100644 --- a/config/features/deprecated_flags.go +++ b/config/features/deprecated_flags.go @@ -42,6 +42,11 @@ var ( Usage: deprecatedUsage, Hidden: true, } + deprecatedDisableEIP4881 = &cli.BoolFlag{ + Name: "disable-eip-4881", + Usage: deprecatedUsage, + Hidden: true, + } deprecatedVerboseSigVerification = &cli.BoolFlag{ Name: "enable-verbose-sig-verification", Usage: deprecatedUsage, @@ -58,6 +63,7 @@ var deprecatedFlags = []cli.Flag{ deprecatedDisableOptionalEngineMethods, deprecatedDisableAggregateParallel, deprecatedEnableEIP4881, + deprecatedDisableEIP4881, deprecatedVerboseSigVerification, } diff --git a/config/features/flags.go b/config/features/flags.go index 44329b75a63a..af97adaaab8f 100644 --- a/config/features/flags.go +++ b/config/features/flags.go @@ -143,10 +143,6 @@ var ( Name: "prepare-all-payloads", Usage: "Informs the engine to prepare all local payloads. Useful for relayers and builders.", } - DisableEIP4881 = &cli.BoolFlag{ - Name: "disable-eip-4881", - Usage: "Disables the deposit tree specified in EIP-4881.", - } EnableLightClient = &cli.BoolFlag{ Name: "enable-lightclient", Usage: "Enables the light client support in the beacon node", @@ -222,7 +218,6 @@ var BeaconChainFlags = append(deprecatedBeaconFlags, append(deprecatedFlags, []c aggregateFirstInterval, aggregateSecondInterval, aggregateThirdInterval, - DisableEIP4881, disableResourceManager, DisableRegistrationCache, EnableLightClient, From 9f6930ac03e11a9a4bc50759be95428fe67e1cbb Mon Sep 17 00:00:00 2001 From: Saolyn Date: Fri, 19 Apr 2024 15:04:21 +0200 Subject: [PATCH 14/15] Check: index not greater than deposit count --- beacon-chain/cache/depositsnapshot/deposit_tree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beacon-chain/cache/depositsnapshot/deposit_tree.go b/beacon-chain/cache/depositsnapshot/deposit_tree.go index 1f27663d559a..0350cb99068f 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_tree.go +++ b/beacon-chain/cache/depositsnapshot/deposit_tree.go @@ -112,7 +112,7 @@ func (d *DepositTree) getProof(index uint64) ([32]byte, [][32]byte, error) { if err != nil { return [32]byte{}, nil, err } - if finalizedDeposits > 0 && i <= finalizedIdx { + if finalizedDeposits > 0 && i <= finalizedIdx || index >= d.depositCount { return [32]byte{}, nil, ErrInvalidIndex } leaf, proof := generateProof(d.tree, index, DepositContractDepth) From 661882b7a94a930a10b52bdd2fd4c1d37bc0f04a Mon Sep 17 00:00:00 2001 From: Saolyn Date: Wed, 24 Apr 2024 11:25:15 +0200 Subject: [PATCH 15/15] Move index check --- beacon-chain/cache/depositsnapshot/deposit_tree.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/beacon-chain/cache/depositsnapshot/deposit_tree.go b/beacon-chain/cache/depositsnapshot/deposit_tree.go index 0350cb99068f..6e3720885bd6 100644 --- a/beacon-chain/cache/depositsnapshot/deposit_tree.go +++ b/beacon-chain/cache/depositsnapshot/deposit_tree.go @@ -99,6 +99,9 @@ func (d *DepositTree) getProof(index uint64) ([32]byte, [][32]byte, error) { if d.depositCount <= 0 { return [32]byte{}, nil, ErrInvalidDepositCount } + if index >= d.depositCount { + return [32]byte{}, nil, ErrInvalidIndex + } finalizedDeposits, _ := d.tree.GetFinalized([][32]byte{}) finalizedIdx := -1 if finalizedDeposits != 0 { @@ -112,7 +115,7 @@ func (d *DepositTree) getProof(index uint64) ([32]byte, [][32]byte, error) { if err != nil { return [32]byte{}, nil, err } - if finalizedDeposits > 0 && i <= finalizedIdx || index >= d.depositCount { + if finalizedDeposits > 0 && i <= finalizedIdx { return [32]byte{}, nil, ErrInvalidIndex } leaf, proof := generateProof(d.tree, index, DepositContractDepth)