From 5a1a5b5ae5749cbc5c4ea1886f9a9c4724b1fea2 Mon Sep 17 00:00:00 2001 From: rocksload Date: Wed, 29 Oct 2025 22:40:33 +0800 Subject: [PATCH] refactor: use slices.Contains to simplify code (#15646) Signed-off-by: rocksload --- .../blockchain/weak_subjectivity_checks.go | 11 +++++------ beacon-chain/node/node.go | 7 +++---- beacon-chain/p2p/peers/status.go | 8 +++----- beacon-chain/rpc/eth/rewards/handlers.go | 10 ++++------ beacon-chain/sync/pending_attestations_queue.go | 7 +++---- beacon-chain/sync/validate_aggregate_proof.go | 8 +++----- beacon-chain/sync/validate_beacon_attestation.go | 9 ++------- changelog/rocksload_use_slices_contains.md | 3 +++ cmd/beacon-chain/storage/options.go | 7 +++---- cmd/flags/enum.go | 9 ++++----- container/multi-value-slice/multi_value_slice.go | 12 ++++-------- testing/util/logging_test.go | 9 ++------- tools/analyzers/logcapitalization/analyzer.go | 14 ++++---------- 13 files changed, 43 insertions(+), 71 deletions(-) create mode 100644 changelog/rocksload_use_slices_contains.md diff --git a/beacon-chain/blockchain/weak_subjectivity_checks.go b/beacon-chain/blockchain/weak_subjectivity_checks.go index 20df2ead67..dd55279771 100644 --- a/beacon-chain/blockchain/weak_subjectivity_checks.go +++ b/beacon-chain/blockchain/weak_subjectivity_checks.go @@ -3,6 +3,7 @@ package blockchain import ( "context" "fmt" + "slices" "github.com/OffchainLabs/prysm/v6/beacon-chain/db/filters" "github.com/OffchainLabs/prysm/v6/config/params" @@ -81,12 +82,10 @@ func (v *WeakSubjectivityVerifier) VerifyWeakSubjectivity(ctx context.Context, f if err != nil { return errors.Wrap(err, "error while retrieving block roots to verify weak subjectivity") } - for _, root := range roots { - if v.root == root { - log.Info("Weak subjectivity check has passed!!") - v.verified = true - return nil - } + if slices.Contains(roots, v.root) { + log.Info("Weak subjectivity check has passed!!") + v.verified = true + return nil } return errors.Wrap(errWSBlockNotFoundInEpoch, fmt.Sprintf("root=%#x, epoch=%d", v.root, v.epoch)) } diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 6b305d8d49..045c61e9dd 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -12,6 +12,7 @@ import ( "os" "os/signal" "path/filepath" + "slices" "strconv" "strings" "sync" @@ -1135,10 +1136,8 @@ func (b *BeaconNode) registerLightClientStore() { func hasNetworkFlag(cliCtx *cli.Context) bool { for _, flag := range features.NetworkFlags { - for _, name := range flag.Names() { - if cliCtx.IsSet(name) { - return true - } + if slices.ContainsFunc(flag.Names(), cliCtx.IsSet) { + return true } } return false diff --git a/beacon-chain/p2p/peers/status.go b/beacon-chain/p2p/peers/status.go index 5b0e9977f9..048f8e3251 100644 --- a/beacon-chain/p2p/peers/status.go +++ b/beacon-chain/p2p/peers/status.go @@ -25,6 +25,7 @@ package peers import ( "context" "net" + "slices" "sort" "strings" "time" @@ -306,11 +307,8 @@ func (p *Status) SubscribedToSubnet(index uint64) []peer.ID { connectedStatus := peerData.ConnState == Connecting || peerData.ConnState == Connected if connectedStatus && peerData.MetaData != nil && !peerData.MetaData.IsNil() && peerData.MetaData.AttnetsBitfield() != nil { indices := indicesFromBitfield(peerData.MetaData.AttnetsBitfield()) - for _, idx := range indices { - if idx == index { - peers = append(peers, pid) - break - } + if slices.Contains(indices, index) { + peers = append(peers, pid) } } } diff --git a/beacon-chain/rpc/eth/rewards/handlers.go b/beacon-chain/rpc/eth/rewards/handlers.go index a95e7f9bdd..56a87c5b6f 100644 --- a/beacon-chain/rpc/eth/rewards/handlers.go +++ b/beacon-chain/rpc/eth/rewards/handlers.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "slices" "strconv" "strings" @@ -388,12 +389,9 @@ func syncRewardsVals( scIndices := make([]primitives.ValidatorIndex, 0, len(allScIndices)) scVals := make([]*precompute.Validator, 0, len(allScIndices)) for _, valIdx := range valIndices { - for _, scIdx := range allScIndices { - if valIdx == scIdx { - scVals = append(scVals, allVals[valIdx]) - scIndices = append(scIndices, valIdx) - break - } + if slices.Contains(allScIndices, valIdx) { + scVals = append(scVals, allVals[valIdx]) + scIndices = append(scIndices, valIdx) } } diff --git a/beacon-chain/sync/pending_attestations_queue.go b/beacon-chain/sync/pending_attestations_queue.go index 7073a058aa..64c0033ad1 100644 --- a/beacon-chain/sync/pending_attestations_queue.go +++ b/beacon-chain/sync/pending_attestations_queue.go @@ -5,6 +5,7 @@ import ( "context" "encoding/hex" "fmt" + "slices" "github.com/OffchainLabs/prysm/v6/beacon-chain/blockchain" "github.com/OffchainLabs/prysm/v6/beacon-chain/core/blocks" @@ -382,10 +383,8 @@ func (s *Service) savePending(root [32]byte, pending any, isEqual func(other any // Skip if the attestation/aggregate from the same validator already exists in // the pending queue. - for _, a := range s.blkRootToPendingAtts[root] { - if isEqual(a) { - return - } + if slices.ContainsFunc(s.blkRootToPendingAtts[root], isEqual) { + return } pendingAttCount.Inc() diff --git a/beacon-chain/sync/validate_aggregate_proof.go b/beacon-chain/sync/validate_aggregate_proof.go index 4ecfd9d123..0f64ab462d 100644 --- a/beacon-chain/sync/validate_aggregate_proof.go +++ b/beacon-chain/sync/validate_aggregate_proof.go @@ -3,6 +3,7 @@ package sync import ( "context" "fmt" + "slices" "github.com/OffchainLabs/prysm/v6/beacon-chain/blockchain" "github.com/OffchainLabs/prysm/v6/beacon-chain/core/blocks" @@ -290,11 +291,8 @@ func (s *Service) validateIndexInCommittee(ctx context.Context, a ethpb.Att, val } var withinCommittee bool - for _, i := range committee { - if validatorIndex == i { - withinCommittee = true - break - } + if slices.Contains(committee, validatorIndex) { + withinCommittee = true } if !withinCommittee { return pubsub.ValidationReject, fmt.Errorf("validator index %d is not within the committee: %v", diff --git a/beacon-chain/sync/validate_beacon_attestation.go b/beacon-chain/sync/validate_beacon_attestation.go index 6a603aabd2..0d6237d81d 100644 --- a/beacon-chain/sync/validate_beacon_attestation.go +++ b/beacon-chain/sync/validate_beacon_attestation.go @@ -5,6 +5,7 @@ import ( "encoding/binary" "fmt" "reflect" + "slices" "strings" "github.com/OffchainLabs/prysm/v6/beacon-chain/blockchain" @@ -336,13 +337,7 @@ func validateAttestingIndex( // _[REJECT]_ The attester is a member of the committee -- i.e. // `attestation.attester_index in get_beacon_committee(state, attestation.data.slot, index)`. - inCommittee := false - for _, ix := range committee { - if attestingIndex == ix { - inCommittee = true - break - } - } + inCommittee := slices.Contains(committee, attestingIndex) if !inCommittee { return pubsub.ValidationReject, errors.New("attester is not a member of the committee") } diff --git a/changelog/rocksload_use_slices_contains.md b/changelog/rocksload_use_slices_contains.md new file mode 100644 index 0000000000..74c4d3210b --- /dev/null +++ b/changelog/rocksload_use_slices_contains.md @@ -0,0 +1,3 @@ +### Ignored + +- Use slices.Contains to simplify code \ No newline at end of file diff --git a/cmd/beacon-chain/storage/options.go b/cmd/beacon-chain/storage/options.go index e930c30aae..af2071d178 100644 --- a/cmd/beacon-chain/storage/options.go +++ b/cmd/beacon-chain/storage/options.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path" + "slices" "strings" "github.com/OffchainLabs/prysm/v6/beacon-chain/db/filesystem" @@ -55,10 +56,8 @@ func layoutFlagUsage() string { } func validateLayoutFlag(_ *cli.Context, v string) error { - for _, l := range filesystem.LayoutNames { - if v == l { - return nil - } + if slices.Contains(filesystem.LayoutNames, v) { + return nil } return errors.Errorf("invalid value '%s' for flag --%s, %s", v, BlobStorageLayout.Name, layoutOptions()) } diff --git a/cmd/flags/enum.go b/cmd/flags/enum.go index c7706c43fb..bf17670f0f 100644 --- a/cmd/flags/enum.go +++ b/cmd/flags/enum.go @@ -4,6 +4,7 @@ package flags import ( "fmt" + "slices" "strings" "github.com/urfave/cli/v2" @@ -19,11 +20,9 @@ type EnumValue struct { } func (e *EnumValue) Set(value string) error { - for _, enum := range e.Enum { - if enum == value { - *e.Destination = value - return nil - } + if slices.Contains(e.Enum, value) { + *e.Destination = value + return nil } return fmt.Errorf("allowed values are %s", strings.Join(e.Enum, ", ")) diff --git a/container/multi-value-slice/multi_value_slice.go b/container/multi-value-slice/multi_value_slice.go index 5c33535713..43df61ad1d 100644 --- a/container/multi-value-slice/multi_value_slice.go +++ b/container/multi-value-slice/multi_value_slice.go @@ -268,20 +268,16 @@ func (s *Slice[V]) At(obj Identifiable, index uint64) (V, error) { return s.sharedItems[index], nil } for _, v := range ind.Values { - for _, id := range v.ids { - if id == obj.Id() { - return v.val, nil - } + if slices.Contains(v.ids, obj.Id()) { + return v.val, nil } } return s.sharedItems[index], nil } else { item := s.appendedItems[index-uint64(len(s.sharedItems))] for _, v := range item.Values { - for _, id := range v.ids { - if id == obj.Id() { - return v.val, nil - } + if slices.Contains(v.ids, obj.Id()) { + return v.val, nil } } var def V diff --git a/testing/util/logging_test.go b/testing/util/logging_test.go index fe13716295..53894487cd 100644 --- a/testing/util/logging_test.go +++ b/testing/util/logging_test.go @@ -1,6 +1,7 @@ package util import ( + "slices" "testing" "time" @@ -66,13 +67,7 @@ func assertNoHooks(t *testing.T, logger *logrus.Logger) { func assertRegistered(t *testing.T, logger *logrus.Logger, hook ComparableHook) { for _, lvl := range hook.Levels() { registered := logger.Hooks[lvl] - found := false - for _, h := range registered { - if hook.Equal(h) { - found = true - break - } - } + found := slices.ContainsFunc(registered, hook.Equal) require.Equal(t, true, found, "Expected hook %v to be registered at level %s, but it was not", hook, lvl.String()) } } diff --git a/tools/analyzers/logcapitalization/analyzer.go b/tools/analyzers/logcapitalization/analyzer.go index 6f128a2255..f344296eea 100644 --- a/tools/analyzers/logcapitalization/analyzer.go +++ b/tools/analyzers/logcapitalization/analyzer.go @@ -6,6 +6,7 @@ import ( "errors" "go/ast" "go/token" + "slices" "strconv" "strings" "unicode" @@ -178,12 +179,7 @@ func isLoggingCall(call *ast.CallExpr, logFunctions []string, aliases map[string // isCommonLogPackage checks for common logging package names func isCommonLogPackage(pkg string) bool { common := []string{"log", "logrus", "zerolog", "zap", "glog", "klog"} - for _, c := range common { - if pkg == c { - return true - } - } - return false + return slices.Contains(common, pkg) } // isFormatFunction checks if this is a format function (ending with 'f') @@ -274,10 +270,8 @@ func isAcceptableStart(firstRune rune, s string) bool { // Special characters that are OK to start with acceptableChars := []rune{'%', '$', '/', '\\', '[', '(', '{', '"', '\'', '`', '-'} - for _, char := range acceptableChars { - if firstRune == char { - return true - } + if slices.Contains(acceptableChars, firstRune) { + return true } // URLs/paths are OK