mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-28 14:48:13 -05:00
Compare commits
6 Commits
docs/docum
...
attestatio
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3773ad796 | ||
|
|
ce37952217 | ||
|
|
2119b0ec28 | ||
|
|
06dcc5396c | ||
|
|
06115705ac | ||
|
|
617996fec9 |
@@ -54,7 +54,7 @@ func (s *Service) Broadcast(ctx context.Context, msg proto.Message) error {
|
|||||||
|
|
||||||
// BroadcastAttestation broadcasts an attestation to the p2p network, the message is assumed to be
|
// BroadcastAttestation broadcasts an attestation to the p2p network, the message is assumed to be
|
||||||
// broadcasted to the current fork.
|
// broadcasted to the current fork.
|
||||||
func (s *Service) BroadcastAttestation(ctx context.Context, subnet uint64, att *ethpb.Attestation) error {
|
func (s *Service) BroadcastAttestation(ctx context.Context, subnet uint64, att *ethpb.Attestation, localAttestation bool) error {
|
||||||
if att == nil {
|
if att == nil {
|
||||||
return errors.New("attempted to broadcast nil attestation")
|
return errors.New("attempted to broadcast nil attestation")
|
||||||
}
|
}
|
||||||
@@ -68,7 +68,7 @@ func (s *Service) BroadcastAttestation(ctx context.Context, subnet uint64, att *
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Non-blocking broadcast, with attempts to discover a subnet peer if none available.
|
// Non-blocking broadcast, with attempts to discover a subnet peer if none available.
|
||||||
go s.broadcastAttestation(ctx, subnet, att, forkDigest)
|
go s.broadcastAttestation(ctx, subnet, att, forkDigest, localAttestation)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ func (s *Service) BroadcastSyncCommitteeMessage(ctx context.Context, subnet uint
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) broadcastAttestation(ctx context.Context, subnet uint64, att *ethpb.Attestation, forkDigest [4]byte) {
|
func (s *Service) broadcastAttestation(ctx context.Context, subnet uint64, att *ethpb.Attestation, forkDigest [4]byte, localAttestation bool) {
|
||||||
ctx, span := trace.StartSpan(ctx, "p2p.broadcastAttestation")
|
ctx, span := trace.StartSpan(ctx, "p2p.broadcastAttestation")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
ctx = trace.NewContext(context.Background(), span) // clear parent context / deadline.
|
ctx = trace.NewContext(context.Background(), span) // clear parent context / deadline.
|
||||||
@@ -141,6 +141,18 @@ func (s *Service) broadcastAttestation(ctx context.Context, subnet uint64, att *
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if localAttestation {
|
||||||
|
peers := s.pubsub.ListPeers(attestationToTopic(subnet, forkDigest) + s.Encoding().ProtocolSuffix())
|
||||||
|
for _, p := range peers {
|
||||||
|
rawAgent, err := s.host.Peerstore().Get(p, "AgentVersion")
|
||||||
|
agent, ok := rawAgent.(string)
|
||||||
|
if err != nil || !ok {
|
||||||
|
agent = "unknown"
|
||||||
|
}
|
||||||
|
log.Infof("Broadcasting attestation to peer with id %s and agent %s", p.String(), agent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := s.broadcastObject(ctx, att, attestationToTopic(subnet, forkDigest)); err != nil {
|
if err := s.broadcastObject(ctx, att, attestationToTopic(subnet, forkDigest)); err != nil {
|
||||||
log.WithError(err).Error("Failed to broadcast attestation")
|
log.WithError(err).Error("Failed to broadcast attestation")
|
||||||
tracing.AnnotateError(span, err)
|
tracing.AnnotateError(span, err)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ type P2P interface {
|
|||||||
// Broadcaster broadcasts messages to peers over the p2p pubsub protocol.
|
// Broadcaster broadcasts messages to peers over the p2p pubsub protocol.
|
||||||
type Broadcaster interface {
|
type Broadcaster interface {
|
||||||
Broadcast(context.Context, proto.Message) error
|
Broadcast(context.Context, proto.Message) error
|
||||||
BroadcastAttestation(ctx context.Context, subnet uint64, att *ethpb.Attestation) error
|
BroadcastAttestation(ctx context.Context, subnet uint64, att *ethpb.Attestation, localAttestation bool) error
|
||||||
BroadcastSyncCommitteeMessage(ctx context.Context, subnet uint64, sMsg *ethpb.SyncCommitteeMessage) error
|
BroadcastSyncCommitteeMessage(ctx context.Context, subnet uint64, sMsg *ethpb.SyncCommitteeMessage) error
|
||||||
BroadcastBlob(ctx context.Context, subnet uint64, blob *ethpb.BlobSidecar) error
|
BroadcastBlob(ctx context.Context, subnet uint64, blob *ethpb.BlobSidecar) error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ func (s *Server) SubmitAttestations(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
subnet := corehelpers.ComputeSubnetFromCommitteeAndSlot(uint64(len(vals)), att.Data.CommitteeIndex, att.Data.Slot)
|
subnet := corehelpers.ComputeSubnetFromCommitteeAndSlot(uint64(len(vals)), att.Data.CommitteeIndex, att.Data.Slot)
|
||||||
|
|
||||||
if err = s.Broadcaster.BroadcastAttestation(ctx, subnet, att); err != nil {
|
if err = s.Broadcaster.BroadcastAttestation(ctx, subnet, att, true); err != nil {
|
||||||
log.WithError(err).Errorf("could not broadcast attestation at index %d", i)
|
log.WithError(err).Errorf("could not broadcast attestation at index %d", i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ func (vs *Server) ProposeAttestation(ctx context.Context, att *ethpb.Attestation
|
|||||||
subnet := helpers.ComputeSubnetFromCommitteeAndSlot(uint64(len(vals)), att.Data.CommitteeIndex, att.Data.Slot)
|
subnet := helpers.ComputeSubnetFromCommitteeAndSlot(uint64(len(vals)), att.Data.CommitteeIndex, att.Data.Slot)
|
||||||
|
|
||||||
// Broadcast the new attestation to the network.
|
// Broadcast the new attestation to the network.
|
||||||
if err := vs.P2P.BroadcastAttestation(ctx, subnet, att); err != nil {
|
if err := vs.P2P.BroadcastAttestation(ctx, subnet, att, true); err != nil {
|
||||||
return nil, status.Errorf(codes.Internal, "Could not broadcast attestation: %v", err)
|
return nil, status.Errorf(codes.Internal, "Could not broadcast attestation: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
load("@prysm//tools/go:def.bzl", "go_library", "go_test")
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = [
|
|
||||||
"field_trie.go",
|
|
||||||
"field_trie_helpers.go",
|
|
||||||
],
|
|
||||||
importpath = "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/fieldtrie",
|
|
||||||
visibility = ["//visibility:public"],
|
|
||||||
deps = [
|
|
||||||
"//beacon-chain/state/state-native/custom-types:go_default_library",
|
|
||||||
"//beacon-chain/state/state-native/types:go_default_library",
|
|
||||||
"//beacon-chain/state/stateutil:go_default_library",
|
|
||||||
"//math:go_default_library",
|
|
||||||
"//proto/prysm/v1alpha1:go_default_library",
|
|
||||||
"@com_github_pkg_errors//:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_test(
|
|
||||||
name = "go_default_test",
|
|
||||||
srcs = [
|
|
||||||
"field_trie_test.go",
|
|
||||||
"helpers_test.go",
|
|
||||||
],
|
|
||||||
data = glob(["testdata/**"]),
|
|
||||||
embed = [":go_default_library"],
|
|
||||||
deps = [
|
|
||||||
"//beacon-chain/state/state-native/custom-types:go_default_library",
|
|
||||||
"//beacon-chain/state/state-native/types:go_default_library",
|
|
||||||
"//beacon-chain/state/stateutil:go_default_library",
|
|
||||||
"//config/fieldparams:go_default_library",
|
|
||||||
"//config/params:go_default_library",
|
|
||||||
"//consensus-types/primitives:go_default_library",
|
|
||||||
"//proto/prysm/v1alpha1:go_default_library",
|
|
||||||
"//testing/assert:go_default_library",
|
|
||||||
"//testing/require:go_default_library",
|
|
||||||
"//testing/util:go_default_library",
|
|
||||||
"@com_github_ethereum_go_ethereum//common/hexutil:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ go_library(
|
|||||||
"spec_parameters.go",
|
"spec_parameters.go",
|
||||||
"ssz.go",
|
"ssz.go",
|
||||||
"state_trie.go",
|
"state_trie.go",
|
||||||
|
"field_trie.go",
|
||||||
|
"field_trie_helpers.go",
|
||||||
"types.go",
|
"types.go",
|
||||||
] + select({
|
] + select({
|
||||||
"//config:mainnet": ["beacon_state_mainnet.go"],
|
"//config:mainnet": ["beacon_state_mainnet.go"],
|
||||||
@@ -46,7 +48,6 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//beacon-chain/core/time:go_default_library",
|
"//beacon-chain/core/time:go_default_library",
|
||||||
"//beacon-chain/state:go_default_library",
|
"//beacon-chain/state:go_default_library",
|
||||||
"//beacon-chain/state/fieldtrie:go_default_library",
|
|
||||||
"//beacon-chain/state/state-native/custom-types:go_default_library",
|
"//beacon-chain/state/state-native/custom-types:go_default_library",
|
||||||
"//beacon-chain/state/state-native/types:go_default_library",
|
"//beacon-chain/state/state-native/types:go_default_library",
|
||||||
"//beacon-chain/state/stateutil:go_default_library",
|
"//beacon-chain/state/stateutil:go_default_library",
|
||||||
@@ -80,6 +81,7 @@ go_library(
|
|||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = [
|
srcs = [
|
||||||
|
"field_trie_test.go",
|
||||||
"getters_attestation_test.go",
|
"getters_attestation_test.go",
|
||||||
"getters_block_test.go",
|
"getters_block_test.go",
|
||||||
"getters_checkpoint_test.go",
|
"getters_checkpoint_test.go",
|
||||||
@@ -88,6 +90,7 @@ go_test(
|
|||||||
"getters_validator_test.go",
|
"getters_validator_test.go",
|
||||||
"getters_withdrawal_test.go",
|
"getters_withdrawal_test.go",
|
||||||
"hasher_test.go",
|
"hasher_test.go",
|
||||||
|
"helpers_test.go",
|
||||||
"mvslice_fuzz_test.go",
|
"mvslice_fuzz_test.go",
|
||||||
"proofs_test.go",
|
"proofs_test.go",
|
||||||
"readonly_validator_test.go",
|
"readonly_validator_test.go",
|
||||||
@@ -108,6 +111,7 @@ go_test(
|
|||||||
deps = [
|
deps = [
|
||||||
"//beacon-chain/core/transition:go_default_library",
|
"//beacon-chain/core/transition:go_default_library",
|
||||||
"//beacon-chain/state:go_default_library",
|
"//beacon-chain/state:go_default_library",
|
||||||
|
"//beacon-chain/state/state-native/custom-types:go_default_library",
|
||||||
"//beacon-chain/state/state-native/types:go_default_library",
|
"//beacon-chain/state/state-native/types:go_default_library",
|
||||||
"//beacon-chain/state/stateutil:go_default_library",
|
"//beacon-chain/state/stateutil:go_default_library",
|
||||||
"//beacon-chain/state/testing:go_default_library",
|
"//beacon-chain/state/testing:go_default_library",
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/prysmaticlabs/go-bitfield"
|
"github.com/prysmaticlabs/go-bitfield"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/fieldtrie"
|
|
||||||
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
||||||
@@ -64,7 +63,7 @@ type BeaconState struct {
|
|||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
dirtyFields map[types.FieldIndex]bool
|
dirtyFields map[types.FieldIndex]bool
|
||||||
dirtyIndices map[types.FieldIndex][]uint64
|
dirtyIndices map[types.FieldIndex][]uint64
|
||||||
stateFieldLeaves map[types.FieldIndex]*fieldtrie.FieldTrie
|
stateFieldLeaves map[types.FieldIndex]*FieldTrie
|
||||||
rebuildTrie map[types.FieldIndex]bool
|
rebuildTrie map[types.FieldIndex]bool
|
||||||
valMapHandler *stateutil.ValidatorMapHandler
|
valMapHandler *stateutil.ValidatorMapHandler
|
||||||
merkleLayers [][][]byte
|
merkleLayers [][][]byte
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/prysmaticlabs/go-bitfield"
|
"github.com/prysmaticlabs/go-bitfield"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/fieldtrie"
|
|
||||||
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
||||||
@@ -64,7 +63,7 @@ type BeaconState struct {
|
|||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
dirtyFields map[types.FieldIndex]bool
|
dirtyFields map[types.FieldIndex]bool
|
||||||
dirtyIndices map[types.FieldIndex][]uint64
|
dirtyIndices map[types.FieldIndex][]uint64
|
||||||
stateFieldLeaves map[types.FieldIndex]*fieldtrie.FieldTrie
|
stateFieldLeaves map[types.FieldIndex]*FieldTrie
|
||||||
rebuildTrie map[types.FieldIndex]bool
|
rebuildTrie map[types.FieldIndex]bool
|
||||||
valMapHandler *stateutil.ValidatorMapHandler
|
valMapHandler *stateutil.ValidatorMapHandler
|
||||||
merkleLayers [][][]byte
|
merkleLayers [][][]byte
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package fieldtrie
|
package state_native
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
||||||
|
multi_value_slice "github.com/prysmaticlabs/prysm/v4/container/multi-value-slice"
|
||||||
pmath "github.com/prysmaticlabs/prysm/v4/math"
|
pmath "github.com/prysmaticlabs/prysm/v4/math"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -51,12 +52,22 @@ func NewFieldTrie(field types.FieldIndex, fieldInfo types.DataType, elements int
|
|||||||
if err := validateElements(field, fieldInfo, elements, length); err != nil {
|
if err := validateElements(field, fieldInfo, elements, length); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
type temp[O multi_value_slice.Identifiable] interface {
|
||||||
|
Len(obj O) int
|
||||||
|
State() *BeaconState
|
||||||
|
}
|
||||||
switch fieldInfo {
|
switch fieldInfo {
|
||||||
case types.BasicArray:
|
case types.BasicArray:
|
||||||
fl, err := stateutil.ReturnTrieLayer(fieldRoots, length)
|
fl, err := stateutil.ReturnTrieLayer(fieldRoots, length)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
numOfElems := 0
|
||||||
|
if val, ok := elements.(temp[*BeaconState]); ok {
|
||||||
|
numOfElems = val.Len(val.State())
|
||||||
|
} else {
|
||||||
|
numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
||||||
|
}
|
||||||
return &FieldTrie{
|
return &FieldTrie{
|
||||||
fieldLayers: fl,
|
fieldLayers: fl,
|
||||||
field: field,
|
field: field,
|
||||||
@@ -64,9 +75,15 @@ func NewFieldTrie(field types.FieldIndex, fieldInfo types.DataType, elements int
|
|||||||
reference: stateutil.NewRef(1),
|
reference: stateutil.NewRef(1),
|
||||||
RWMutex: new(sync.RWMutex),
|
RWMutex: new(sync.RWMutex),
|
||||||
length: length,
|
length: length,
|
||||||
numOfElems: reflect.Indirect(reflect.ValueOf(elements)).Len(),
|
numOfElems: numOfElems,
|
||||||
}, nil
|
}, nil
|
||||||
case types.CompositeArray, types.CompressedArray:
|
case types.CompositeArray, types.CompressedArray:
|
||||||
|
numOfElems := 0
|
||||||
|
if val, ok := elements.(temp[*BeaconState]); ok {
|
||||||
|
numOfElems = val.Len(val.State())
|
||||||
|
} else {
|
||||||
|
numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
||||||
|
}
|
||||||
return &FieldTrie{
|
return &FieldTrie{
|
||||||
fieldLayers: stateutil.ReturnTrieLayerVariable(fieldRoots, length),
|
fieldLayers: stateutil.ReturnTrieLayerVariable(fieldRoots, length),
|
||||||
field: field,
|
field: field,
|
||||||
@@ -74,7 +91,7 @@ func NewFieldTrie(field types.FieldIndex, fieldInfo types.DataType, elements int
|
|||||||
reference: stateutil.NewRef(1),
|
reference: stateutil.NewRef(1),
|
||||||
RWMutex: new(sync.RWMutex),
|
RWMutex: new(sync.RWMutex),
|
||||||
length: length,
|
length: length,
|
||||||
numOfElems: reflect.Indirect(reflect.ValueOf(elements)).Len(),
|
numOfElems: numOfElems,
|
||||||
}, nil
|
}, nil
|
||||||
default:
|
default:
|
||||||
return nil, errors.Errorf("unrecognized data type in field map: %v", reflect.TypeOf(fieldInfo).Name())
|
return nil, errors.Errorf("unrecognized data type in field map: %v", reflect.TypeOf(fieldInfo).Name())
|
||||||
@@ -100,20 +117,32 @@ func (f *FieldTrie) RecomputeTrie(indices []uint64, elements interface{}) ([32]b
|
|||||||
if err := f.validateIndices(indices); err != nil {
|
if err := f.validateIndices(indices); err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
|
type temp[O multi_value_slice.Identifiable] interface {
|
||||||
|
Len(obj O) int
|
||||||
|
State() *BeaconState
|
||||||
|
}
|
||||||
switch f.dataType {
|
switch f.dataType {
|
||||||
case types.BasicArray:
|
case types.BasicArray:
|
||||||
fieldRoot, f.fieldLayers, err = stateutil.RecomputeFromLayer(fieldRoots, indices, f.fieldLayers)
|
fieldRoot, f.fieldLayers, err = stateutil.RecomputeFromLayer(fieldRoots, indices, f.fieldLayers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
f.numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
if val, ok := elements.(temp[*BeaconState]); ok {
|
||||||
|
f.numOfElems = val.Len(val.State())
|
||||||
|
} else {
|
||||||
|
f.numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
||||||
|
}
|
||||||
return fieldRoot, nil
|
return fieldRoot, nil
|
||||||
case types.CompositeArray:
|
case types.CompositeArray:
|
||||||
fieldRoot, f.fieldLayers, err = stateutil.RecomputeFromLayerVariable(fieldRoots, indices, f.fieldLayers)
|
fieldRoot, f.fieldLayers, err = stateutil.RecomputeFromLayerVariable(fieldRoots, indices, f.fieldLayers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
f.numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
if val, ok := elements.(temp[*BeaconState]); ok {
|
||||||
|
f.numOfElems = val.Len(val.State())
|
||||||
|
} else {
|
||||||
|
f.numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
||||||
|
}
|
||||||
return stateutil.AddInMixin(fieldRoot, uint64(len(f.fieldLayers[0])))
|
return stateutil.AddInMixin(fieldRoot, uint64(len(f.fieldLayers[0])))
|
||||||
case types.CompressedArray:
|
case types.CompressedArray:
|
||||||
numOfElems, err := f.field.ElemsInChunk()
|
numOfElems, err := f.field.ElemsInChunk()
|
||||||
@@ -142,7 +171,11 @@ func (f *FieldTrie) RecomputeTrie(indices []uint64, elements interface{}) ([32]b
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
f.numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
if val, ok := elements.(temp[*BeaconState]); ok {
|
||||||
|
f.numOfElems = val.Len(val.State())
|
||||||
|
} else {
|
||||||
|
f.numOfElems = reflect.Indirect(reflect.ValueOf(elements)).Len()
|
||||||
|
}
|
||||||
return stateutil.AddInMixin(fieldRoot, uint64(f.numOfElems))
|
return stateutil.AddInMixin(fieldRoot, uint64(f.numOfElems))
|
||||||
default:
|
default:
|
||||||
return [32]byte{}, errors.Errorf("unrecognized data type in field map: %v", reflect.TypeOf(f.dataType).Name())
|
return [32]byte{}, errors.Errorf("unrecognized data type in field map: %v", reflect.TypeOf(f.dataType).Name())
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package fieldtrie
|
package state_native
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
||||||
|
multi_value_slice "github.com/prysmaticlabs/prysm/v4/container/multi-value-slice"
|
||||||
pmath "github.com/prysmaticlabs/prysm/v4/math"
|
pmath "github.com/prysmaticlabs/prysm/v4/math"
|
||||||
ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1"
|
ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1"
|
||||||
)
|
)
|
||||||
@@ -53,6 +54,17 @@ func validateElements(field types.FieldIndex, fieldInfo types.DataType, elements
|
|||||||
}
|
}
|
||||||
length *= comLength
|
length *= comLength
|
||||||
}
|
}
|
||||||
|
type temp[O multi_value_slice.Identifiable] interface {
|
||||||
|
Len(obj O) int
|
||||||
|
State() *BeaconState
|
||||||
|
}
|
||||||
|
if val, ok := elements.(temp[*BeaconState]); ok {
|
||||||
|
totalLen := val.Len(val.State())
|
||||||
|
if uint64(totalLen) > length {
|
||||||
|
return errors.Errorf("elements length is larger than expected for field %s: %d > %d", field.String(), totalLen, length)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
val := reflect.Indirect(reflect.ValueOf(elements))
|
val := reflect.Indirect(reflect.ValueOf(elements))
|
||||||
if uint64(val.Len()) > length {
|
if uint64(val.Len()) > length {
|
||||||
return errors.Errorf("elements length is larger than expected for field %s: %d > %d", field.String(), val.Len(), length)
|
return errors.Errorf("elements length is larger than expected for field %s: %d > %d", field.String(), val.Len(), length)
|
||||||
@@ -63,12 +75,8 @@ func validateElements(field types.FieldIndex, fieldInfo types.DataType, elements
|
|||||||
// fieldConverters converts the corresponding field and the provided elements to the appropriate roots.
|
// fieldConverters converts the corresponding field and the provided elements to the appropriate roots.
|
||||||
func fieldConverters(field types.FieldIndex, indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) {
|
func fieldConverters(field types.FieldIndex, indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) {
|
||||||
switch field {
|
switch field {
|
||||||
case types.BlockRoots:
|
case types.BlockRoots, types.StateRoots, types.RandaoMixes:
|
||||||
return convert32ByteArrays[customtypes.BlockRoots](indices, elements, convertAll)
|
return convertRoots(indices, elements, convertAll)
|
||||||
case types.StateRoots:
|
|
||||||
return convert32ByteArrays[customtypes.StateRoots](indices, elements, convertAll)
|
|
||||||
case types.RandaoMixes:
|
|
||||||
return convert32ByteArrays[customtypes.RandaoMixes](indices, elements, convertAll)
|
|
||||||
case types.Eth1DataVotes:
|
case types.Eth1DataVotes:
|
||||||
return convertEth1DataVotes(indices, elements, convertAll)
|
return convertEth1DataVotes(indices, elements, convertAll)
|
||||||
case types.Validators:
|
case types.Validators:
|
||||||
@@ -82,6 +90,21 @@ func fieldConverters(field types.FieldIndex, indices []uint64, elements interfac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertRoots(indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) {
|
||||||
|
switch castedType := elements.(type) {
|
||||||
|
case customtypes.BlockRoots:
|
||||||
|
return handle32ByteArrays(castedType, indices, convertAll)
|
||||||
|
case customtypes.StateRoots:
|
||||||
|
return handle32ByteArrays(castedType, indices, convertAll)
|
||||||
|
case customtypes.RandaoMixes:
|
||||||
|
return handle32ByteArrays(castedType, indices, convertAll)
|
||||||
|
case MultiValueSliceComposite[[32]byte, *BeaconState]:
|
||||||
|
return handle32ByteMVslice(castedType, indices, convertAll)
|
||||||
|
default:
|
||||||
|
return nil, errors.Errorf("non-existnet type provided %T", castedType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func convert32ByteArrays[T ~[][32]byte](indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) {
|
func convert32ByteArrays[T ~[][32]byte](indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) {
|
||||||
val, ok := elements.(T)
|
val, ok := elements.(T)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -116,11 +139,14 @@ func convertAttestations(indices []uint64, elements interface{}, convertAll bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
func convertBalances(indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) {
|
func convertBalances(indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) {
|
||||||
val, ok := elements.([]uint64)
|
switch casted := elements.(type) {
|
||||||
if !ok {
|
case []uint64:
|
||||||
|
return handleBalanceSlice(casted, indices, convertAll)
|
||||||
|
case MultiValueSliceComposite[uint64, *BeaconState]:
|
||||||
|
return handleBalanceMVSlice(casted, indices, convertAll)
|
||||||
|
default:
|
||||||
return nil, errors.Errorf("Wanted type of %T but got %T", []uint64{}, elements)
|
return nil, errors.Errorf("Wanted type of %T but got %T", []uint64{}, elements)
|
||||||
}
|
}
|
||||||
return handleBalanceSlice(val, indices, convertAll)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle32ByteArrays computes and returns 32 byte arrays in a slice of root format.
|
// handle32ByteArrays computes and returns 32 byte arrays in a slice of root format.
|
||||||
@@ -150,6 +176,39 @@ func handle32ByteArrays(val [][32]byte, indices []uint64, convertAll bool) ([][3
|
|||||||
return roots, nil
|
return roots, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handle32ByteMVslice(mv MultiValueSliceComposite[[32]byte, *BeaconState],
|
||||||
|
indices []uint64, convertAll bool) ([][32]byte, error) {
|
||||||
|
length := len(indices)
|
||||||
|
if convertAll {
|
||||||
|
length = mv.Len(mv.State())
|
||||||
|
}
|
||||||
|
roots := make([][32]byte, 0, length)
|
||||||
|
rootCreator := func(input [32]byte) {
|
||||||
|
roots = append(roots, input)
|
||||||
|
}
|
||||||
|
if convertAll {
|
||||||
|
val := mv.Value(mv.State())
|
||||||
|
for i := range val {
|
||||||
|
rootCreator(val[i])
|
||||||
|
}
|
||||||
|
return roots, nil
|
||||||
|
}
|
||||||
|
totalLen := mv.Len(mv.State())
|
||||||
|
if totalLen > 0 {
|
||||||
|
for _, idx := range indices {
|
||||||
|
if idx > uint64(totalLen)-1 {
|
||||||
|
return nil, fmt.Errorf("index %d greater than number of byte arrays %d", idx, totalLen)
|
||||||
|
}
|
||||||
|
val, err := mv.At(mv.State(), idx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
rootCreator(val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return roots, nil
|
||||||
|
}
|
||||||
|
|
||||||
// handleValidatorSlice returns the validator indices in a slice of root format.
|
// handleValidatorSlice returns the validator indices in a slice of root format.
|
||||||
func handleValidatorSlice(val []*ethpb.Validator, indices []uint64, convertAll bool) ([][32]byte, error) {
|
func handleValidatorSlice(val []*ethpb.Validator, indices []uint64, convertAll bool) ([][32]byte, error) {
|
||||||
length := len(indices)
|
length := len(indices)
|
||||||
@@ -294,3 +353,48 @@ func handleBalanceSlice(val, indices []uint64, convertAll bool) ([][32]byte, err
|
|||||||
}
|
}
|
||||||
return [][32]byte{}, nil
|
return [][32]byte{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleBalanceMVSlice(mv MultiValueSliceComposite[uint64, *BeaconState], indices []uint64, convertAll bool) ([][32]byte, error) {
|
||||||
|
if convertAll {
|
||||||
|
val := mv.Value(mv.State())
|
||||||
|
return stateutil.PackUint64IntoChunks(val)
|
||||||
|
}
|
||||||
|
totalLen := mv.Len(mv.State())
|
||||||
|
if totalLen > 0 {
|
||||||
|
numOfElems, err := types.Balances.ElemsInChunk()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
iNumOfElems, err := pmath.Int(numOfElems)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var roots [][32]byte
|
||||||
|
for _, idx := range indices {
|
||||||
|
// We split the indexes into their relevant groups. Balances
|
||||||
|
// are compressed according to 4 values -> 1 chunk.
|
||||||
|
startIdx := idx / numOfElems
|
||||||
|
startGroup := startIdx * numOfElems
|
||||||
|
var chunk [32]byte
|
||||||
|
sizeOfElem := len(chunk) / iNumOfElems
|
||||||
|
for i, j := 0, startGroup; j < startGroup+numOfElems; i, j = i+sizeOfElem, j+1 {
|
||||||
|
wantedVal := uint64(0)
|
||||||
|
// We are adding chunks in sets of 4, if the set is at the edge of the array
|
||||||
|
// then you will need to zero out the rest of the chunk. Ex : 41 indexes,
|
||||||
|
// so 41 % 4 = 1 . There are 3 indexes, which do not exist yet but we
|
||||||
|
// have to add in as a root. These 3 indexes are then given a 'zero' value.
|
||||||
|
if j < uint64(totalLen) {
|
||||||
|
val, err := mv.At(mv.State(), j)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
wantedVal = val
|
||||||
|
}
|
||||||
|
binary.LittleEndian.PutUint64(chunk[i:i+sizeOfElem], wantedVal)
|
||||||
|
}
|
||||||
|
roots = append(roots, chunk)
|
||||||
|
}
|
||||||
|
return roots, nil
|
||||||
|
}
|
||||||
|
return [][32]byte{}, nil
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package fieldtrie_test
|
package state_native_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/fieldtrie"
|
state_native "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native"
|
||||||
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
||||||
@@ -23,7 +23,7 @@ func TestFieldTrie_NewTrie(t *testing.T) {
|
|||||||
blockRoots[i] = [32]byte(r)
|
blockRoots[i] = [32]byte(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.BlockRoots, types.BasicArray, customtypes.BlockRoots(blockRoots), uint64(params.BeaconConfig().SlotsPerHistoricalRoot))
|
trie, err := state_native.NewFieldTrie(types.BlockRoots, types.BasicArray, customtypes.BlockRoots(blockRoots), uint64(params.BeaconConfig().SlotsPerHistoricalRoot))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
root, err := stateutil.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot))
|
root, err := stateutil.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -33,15 +33,15 @@ func TestFieldTrie_NewTrie(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFieldTrie_NewTrie_NilElements(t *testing.T) {
|
func TestFieldTrie_NewTrie_NilElements(t *testing.T) {
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.BlockRoots, types.BasicArray, nil, 8234)
|
trie, err := state_native.NewFieldTrie(types.BlockRoots, types.BasicArray, nil, 8234)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = trie.TrieRoot()
|
_, err = trie.TrieRoot()
|
||||||
require.ErrorIs(t, err, fieldtrie.ErrEmptyFieldTrie)
|
require.ErrorIs(t, err, state_native.ErrEmptyFieldTrie)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFieldTrie_RecomputeTrie(t *testing.T) {
|
func TestFieldTrie_RecomputeTrie(t *testing.T) {
|
||||||
newState, _ := util.DeterministicGenesisState(t, 32)
|
newState, _ := util.DeterministicGenesisState(t, 32)
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.Validators, types.CompositeArray, newState.Validators(), params.BeaconConfig().ValidatorRegistryLimit)
|
trie, err := state_native.NewFieldTrie(types.Validators, types.CompositeArray, newState.Validators(), params.BeaconConfig().ValidatorRegistryLimit)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
oldroot, err := trie.TrieRoot()
|
oldroot, err := trie.TrieRoot()
|
||||||
@@ -72,7 +72,7 @@ func TestFieldTrie_RecomputeTrie(t *testing.T) {
|
|||||||
|
|
||||||
func TestFieldTrie_RecomputeTrie_CompressedArray(t *testing.T) {
|
func TestFieldTrie_RecomputeTrie_CompressedArray(t *testing.T) {
|
||||||
newState, _ := util.DeterministicGenesisState(t, 32)
|
newState, _ := util.DeterministicGenesisState(t, 32)
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.Balances, types.CompressedArray, newState.Balances(), stateutil.ValidatorLimitForBalancesChunks())
|
trie, err := state_native.NewFieldTrie(types.Balances, types.CompressedArray, newState.Balances(), stateutil.ValidatorLimitForBalancesChunks())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, trie.Length(), stateutil.ValidatorLimitForBalancesChunks())
|
require.Equal(t, trie.Length(), stateutil.ValidatorLimitForBalancesChunks())
|
||||||
changedIdx := []uint64{4, 8}
|
changedIdx := []uint64{4, 8}
|
||||||
@@ -89,7 +89,7 @@ func TestFieldTrie_RecomputeTrie_CompressedArray(t *testing.T) {
|
|||||||
|
|
||||||
func TestNewFieldTrie_UnknownType(t *testing.T) {
|
func TestNewFieldTrie_UnknownType(t *testing.T) {
|
||||||
newState, _ := util.DeterministicGenesisState(t, 32)
|
newState, _ := util.DeterministicGenesisState(t, 32)
|
||||||
_, err := fieldtrie.NewFieldTrie(types.Balances, 4, newState.Balances(), 32)
|
_, err := state_native.NewFieldTrie(types.Balances, 4, newState.Balances(), 32)
|
||||||
require.ErrorContains(t, "unrecognized data type", err)
|
require.ErrorContains(t, "unrecognized data type", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@ func TestFieldTrie_CopyTrieImmutable(t *testing.T) {
|
|||||||
randaoMixes[i] = [32]byte(r)
|
randaoMixes[i] = [32]byte(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.RandaoMixes, types.BasicArray, customtypes.RandaoMixes(randaoMixes), uint64(params.BeaconConfig().EpochsPerHistoricalVector))
|
trie, err := state_native.NewFieldTrie(types.RandaoMixes, types.BasicArray, customtypes.RandaoMixes(randaoMixes), uint64(params.BeaconConfig().EpochsPerHistoricalVector))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
newTrie := trie.CopyTrie()
|
newTrie := trie.CopyTrie()
|
||||||
@@ -127,7 +127,7 @@ func TestFieldTrie_CopyTrieImmutable(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFieldTrie_CopyAndTransferEmpty(t *testing.T) {
|
func TestFieldTrie_CopyAndTransferEmpty(t *testing.T) {
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.RandaoMixes, types.BasicArray, nil, uint64(params.BeaconConfig().EpochsPerHistoricalVector))
|
trie, err := state_native.NewFieldTrie(types.RandaoMixes, types.BasicArray, nil, uint64(params.BeaconConfig().EpochsPerHistoricalVector))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.DeepEqual(t, trie, trie.CopyTrie())
|
require.DeepEqual(t, trie, trie.CopyTrie())
|
||||||
@@ -137,14 +137,14 @@ func TestFieldTrie_CopyAndTransferEmpty(t *testing.T) {
|
|||||||
func TestFieldTrie_TransferTrie(t *testing.T) {
|
func TestFieldTrie_TransferTrie(t *testing.T) {
|
||||||
newState, _ := util.DeterministicGenesisState(t, 32)
|
newState, _ := util.DeterministicGenesisState(t, 32)
|
||||||
maxLength := (params.BeaconConfig().ValidatorRegistryLimit*8 + 31) / 32
|
maxLength := (params.BeaconConfig().ValidatorRegistryLimit*8 + 31) / 32
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.Balances, types.CompressedArray, newState.Balances(), maxLength)
|
trie, err := state_native.NewFieldTrie(types.Balances, types.CompressedArray, newState.Balances(), maxLength)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
oldRoot, err := trie.TrieRoot()
|
oldRoot, err := trie.TrieRoot()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
newTrie := trie.TransferTrie()
|
newTrie := trie.TransferTrie()
|
||||||
root, err := trie.TrieRoot()
|
root, err := trie.TrieRoot()
|
||||||
require.ErrorIs(t, err, fieldtrie.ErrEmptyFieldTrie)
|
require.ErrorIs(t, err, state_native.ErrEmptyFieldTrie)
|
||||||
require.Equal(t, root, [32]byte{})
|
require.Equal(t, root, [32]byte{})
|
||||||
require.NotNil(t, newTrie)
|
require.NotNil(t, newTrie)
|
||||||
newRoot, err := newTrie.TrieRoot()
|
newRoot, err := newTrie.TrieRoot()
|
||||||
@@ -165,7 +165,7 @@ func FuzzFieldTrie(f *testing.F) {
|
|||||||
for i := 32; i < len(data); i += 32 {
|
for i := 32; i < len(data); i += 32 {
|
||||||
roots = append(roots, data[i-32:i])
|
roots = append(roots, data[i-32:i])
|
||||||
}
|
}
|
||||||
trie, err := fieldtrie.NewFieldTrie(types.FieldIndex(idx), types.DataType(typ), roots, slotsPerHistRoot)
|
trie, err := state_native.NewFieldTrie(types.FieldIndex(idx), types.DataType(typ), roots, slotsPerHistRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return // invalid inputs
|
return // invalid inputs
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package fieldtrie
|
package state_native
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/fieldtrie"
|
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
||||||
"github.com/prysmaticlabs/prysm/v4/runtime/version"
|
"github.com/prysmaticlabs/prysm/v4/runtime/version"
|
||||||
@@ -56,7 +55,7 @@ func (b *BeaconState) CurrentSyncCommitteeProof(ctx context.Context) ([][]byte,
|
|||||||
if err := b.recomputeDirtyFields(ctx); err != nil {
|
if err := b.recomputeDirtyFields(ctx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return fieldtrie.ProofFromMerkleLayers(b.merkleLayers, types.CurrentSyncCommittee.RealPosition()), nil
|
return ProofFromMerkleLayers(b.merkleLayers, types.CurrentSyncCommittee.RealPosition()), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NextSyncCommitteeProof from the state's Merkle trie representation.
|
// NextSyncCommitteeProof from the state's Merkle trie representation.
|
||||||
@@ -74,7 +73,7 @@ func (b *BeaconState) NextSyncCommitteeProof(ctx context.Context) ([][]byte, err
|
|||||||
if err := b.recomputeDirtyFields(ctx); err != nil {
|
if err := b.recomputeDirtyFields(ctx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return fieldtrie.ProofFromMerkleLayers(b.merkleLayers, types.NextSyncCommittee.RealPosition()), nil
|
return ProofFromMerkleLayers(b.merkleLayers, types.NextSyncCommittee.RealPosition()), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FinalizedRootProof crafts a Merkle proof for the finalized root
|
// FinalizedRootProof crafts a Merkle proof for the finalized root
|
||||||
@@ -102,7 +101,7 @@ func (b *BeaconState) FinalizedRootProof(ctx context.Context) ([][]byte, error)
|
|||||||
epochRoot := bytesutil.ToBytes32(epochBuf)
|
epochRoot := bytesutil.ToBytes32(epochBuf)
|
||||||
proof := make([][]byte, 0)
|
proof := make([][]byte, 0)
|
||||||
proof = append(proof, epochRoot[:])
|
proof = append(proof, epochRoot[:])
|
||||||
branch := fieldtrie.ProofFromMerkleLayers(b.merkleLayers, types.FinalizedCheckpoint.RealPosition())
|
branch := ProofFromMerkleLayers(b.merkleLayers, types.FinalizedCheckpoint.RealPosition())
|
||||||
proof = append(proof, branch...)
|
proof = append(proof, branch...)
|
||||||
return proof, nil
|
return proof, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ import (
|
|||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/fieldtrie"
|
|
||||||
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
customtypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/custom-types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/state-native/types"
|
||||||
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stateutil"
|
||||||
"github.com/prysmaticlabs/prysm/v4/config/features"
|
"github.com/prysmaticlabs/prysm/v4/config/features"
|
||||||
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
||||||
"github.com/prysmaticlabs/prysm/v4/config/params"
|
"github.com/prysmaticlabs/prysm/v4/config/params"
|
||||||
|
multi_value_slice "github.com/prysmaticlabs/prysm/v4/container/multi-value-slice"
|
||||||
"github.com/prysmaticlabs/prysm/v4/container/slice"
|
"github.com/prysmaticlabs/prysm/v4/container/slice"
|
||||||
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
||||||
"github.com/prysmaticlabs/prysm/v4/encoding/ssz"
|
"github.com/prysmaticlabs/prysm/v4/encoding/ssz"
|
||||||
@@ -166,7 +166,7 @@ func InitializeFromProtoUnsafePhase0(st *ethpb.BeaconState) (state.BeaconState,
|
|||||||
|
|
||||||
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
||||||
stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount),
|
stateFieldLeaves: make(map[types.FieldIndex]*FieldTrie, fieldCount),
|
||||||
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
||||||
}
|
}
|
||||||
@@ -207,7 +207,7 @@ func InitializeFromProtoUnsafePhase0(st *ethpb.BeaconState) (state.BeaconState,
|
|||||||
b.dirtyFields[f] = true
|
b.dirtyFields[f] = true
|
||||||
b.rebuildTrie[f] = true
|
b.rebuildTrie[f] = true
|
||||||
b.dirtyIndices[f] = []uint64{}
|
b.dirtyIndices[f] = []uint64{}
|
||||||
trie, err := fieldtrie.NewFieldTrie(f, types.BasicArray, nil, 0)
|
trie, err := NewFieldTrie(f, types.BasicArray, nil, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -272,7 +272,7 @@ func InitializeFromProtoUnsafeAltair(st *ethpb.BeaconStateAltair) (state.BeaconS
|
|||||||
|
|
||||||
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
||||||
stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount),
|
stateFieldLeaves: make(map[types.FieldIndex]*FieldTrie, fieldCount),
|
||||||
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
||||||
}
|
}
|
||||||
@@ -315,7 +315,7 @@ func InitializeFromProtoUnsafeAltair(st *ethpb.BeaconStateAltair) (state.BeaconS
|
|||||||
b.dirtyFields[f] = true
|
b.dirtyFields[f] = true
|
||||||
b.rebuildTrie[f] = true
|
b.rebuildTrie[f] = true
|
||||||
b.dirtyIndices[f] = []uint64{}
|
b.dirtyIndices[f] = []uint64{}
|
||||||
trie, err := fieldtrie.NewFieldTrie(f, types.BasicArray, nil, 0)
|
trie, err := NewFieldTrie(f, types.BasicArray, nil, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -382,7 +382,7 @@ func InitializeFromProtoUnsafeBellatrix(st *ethpb.BeaconStateBellatrix) (state.B
|
|||||||
|
|
||||||
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
||||||
stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount),
|
stateFieldLeaves: make(map[types.FieldIndex]*FieldTrie, fieldCount),
|
||||||
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
||||||
}
|
}
|
||||||
@@ -425,7 +425,7 @@ func InitializeFromProtoUnsafeBellatrix(st *ethpb.BeaconStateBellatrix) (state.B
|
|||||||
b.dirtyFields[f] = true
|
b.dirtyFields[f] = true
|
||||||
b.rebuildTrie[f] = true
|
b.rebuildTrie[f] = true
|
||||||
b.dirtyIndices[f] = []uint64{}
|
b.dirtyIndices[f] = []uint64{}
|
||||||
trie, err := fieldtrie.NewFieldTrie(f, types.BasicArray, nil, 0)
|
trie, err := NewFieldTrie(f, types.BasicArray, nil, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -496,7 +496,7 @@ func InitializeFromProtoUnsafeCapella(st *ethpb.BeaconStateCapella) (state.Beaco
|
|||||||
|
|
||||||
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
||||||
stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount),
|
stateFieldLeaves: make(map[types.FieldIndex]*FieldTrie, fieldCount),
|
||||||
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
||||||
}
|
}
|
||||||
@@ -539,7 +539,7 @@ func InitializeFromProtoUnsafeCapella(st *ethpb.BeaconStateCapella) (state.Beaco
|
|||||||
b.dirtyFields[f] = true
|
b.dirtyFields[f] = true
|
||||||
b.rebuildTrie[f] = true
|
b.rebuildTrie[f] = true
|
||||||
b.dirtyIndices[f] = []uint64{}
|
b.dirtyIndices[f] = []uint64{}
|
||||||
trie, err := fieldtrie.NewFieldTrie(f, types.BasicArray, nil, 0)
|
trie, err := NewFieldTrie(f, types.BasicArray, nil, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -609,7 +609,7 @@ func InitializeFromProtoUnsafeDeneb(st *ethpb.BeaconStateDeneb) (state.BeaconSta
|
|||||||
|
|
||||||
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
||||||
stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount),
|
stateFieldLeaves: make(map[types.FieldIndex]*FieldTrie, fieldCount),
|
||||||
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
valMapHandler: stateutil.NewValMapHandler(st.Validators),
|
||||||
}
|
}
|
||||||
@@ -652,7 +652,7 @@ func InitializeFromProtoUnsafeDeneb(st *ethpb.BeaconStateDeneb) (state.BeaconSta
|
|||||||
b.dirtyFields[f] = true
|
b.dirtyFields[f] = true
|
||||||
b.rebuildTrie[f] = true
|
b.rebuildTrie[f] = true
|
||||||
b.dirtyIndices[f] = []uint64{}
|
b.dirtyIndices[f] = []uint64{}
|
||||||
trie, err := fieldtrie.NewFieldTrie(f, types.BasicArray, nil, 0)
|
trie, err := NewFieldTrie(f, types.BasicArray, nil, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -755,7 +755,7 @@ func (b *BeaconState) Copy() state.BeaconState {
|
|||||||
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
dirtyFields: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount),
|
||||||
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
rebuildTrie: make(map[types.FieldIndex]bool, fieldCount),
|
||||||
stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount),
|
stateFieldLeaves: make(map[types.FieldIndex]*FieldTrie, fieldCount),
|
||||||
|
|
||||||
// Share the reference to validator index map.
|
// Share the reference to validator index map.
|
||||||
valMapHandler: b.valMapHandler,
|
valMapHandler: b.valMapHandler,
|
||||||
@@ -1117,7 +1117,7 @@ func (b *BeaconState) recomputeFieldTrie(index types.FieldIndex, elements interf
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *BeaconState) resetFieldTrie(index types.FieldIndex, elements interface{}, length uint64) error {
|
func (b *BeaconState) resetFieldTrie(index types.FieldIndex, elements interface{}, length uint64) error {
|
||||||
fTrie, err := fieldtrie.NewFieldTrie(index, fieldMap[index], elements, length)
|
fTrie, err := NewFieldTrie(index, fieldMap[index], elements, length)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -1178,7 +1178,10 @@ func finalizerCleanup(b *BeaconState) {
|
|||||||
func (b *BeaconState) blockRootsRootSelector(field types.FieldIndex) ([32]byte, error) {
|
func (b *BeaconState) blockRootsRootSelector(field types.FieldIndex) ([32]byte, error) {
|
||||||
if b.rebuildTrie[field] {
|
if b.rebuildTrie[field] {
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
err := b.resetFieldTrie(field, customtypes.BlockRoots(b.blockRootsMultiValue.Value(b)), fieldparams.BlockRootsLength)
|
err := b.resetFieldTrie(field, mv32Byte[[32]byte, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.blockRootsMultiValue,
|
||||||
|
}, fieldparams.BlockRootsLength)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
@@ -1192,7 +1195,10 @@ func (b *BeaconState) blockRootsRootSelector(field types.FieldIndex) ([32]byte,
|
|||||||
return b.stateFieldLeaves[field].TrieRoot()
|
return b.stateFieldLeaves[field].TrieRoot()
|
||||||
}
|
}
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
return b.recomputeFieldTrie(field, customtypes.BlockRoots(b.blockRootsMultiValue.Value(b)))
|
return b.recomputeFieldTrie(field, mv32Byte[[32]byte, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.blockRootsMultiValue,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
return b.recomputeFieldTrie(field, b.blockRoots)
|
return b.recomputeFieldTrie(field, b.blockRoots)
|
||||||
}
|
}
|
||||||
@@ -1201,7 +1207,10 @@ func (b *BeaconState) blockRootsRootSelector(field types.FieldIndex) ([32]byte,
|
|||||||
func (b *BeaconState) stateRootsRootSelector(field types.FieldIndex) ([32]byte, error) {
|
func (b *BeaconState) stateRootsRootSelector(field types.FieldIndex) ([32]byte, error) {
|
||||||
if b.rebuildTrie[field] {
|
if b.rebuildTrie[field] {
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
err := b.resetFieldTrie(field, customtypes.StateRoots(b.stateRootsMultiValue.Value(b)), fieldparams.StateRootsLength)
|
err := b.resetFieldTrie(field, mv32Byte[[32]byte, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.stateRootsMultiValue,
|
||||||
|
}, fieldparams.StateRootsLength)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
@@ -1215,7 +1224,10 @@ func (b *BeaconState) stateRootsRootSelector(field types.FieldIndex) ([32]byte,
|
|||||||
return b.stateFieldLeaves[field].TrieRoot()
|
return b.stateFieldLeaves[field].TrieRoot()
|
||||||
}
|
}
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
return b.recomputeFieldTrie(field, customtypes.StateRoots(b.stateRootsMultiValue.Value(b)))
|
return b.recomputeFieldTrie(field, mv32Byte[[32]byte, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.stateRootsMultiValue,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
return b.recomputeFieldTrie(field, b.stateRoots)
|
return b.recomputeFieldTrie(field, b.stateRoots)
|
||||||
}
|
}
|
||||||
@@ -1247,7 +1259,10 @@ func (b *BeaconState) validatorsRootSelector(field types.FieldIndex) ([32]byte,
|
|||||||
func (b *BeaconState) balancesRootSelector(field types.FieldIndex) ([32]byte, error) {
|
func (b *BeaconState) balancesRootSelector(field types.FieldIndex) ([32]byte, error) {
|
||||||
if b.rebuildTrie[field] {
|
if b.rebuildTrie[field] {
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
err := b.resetFieldTrie(field, b.balancesMultiValue.Value(b), stateutil.ValidatorLimitForBalancesChunks())
|
err := b.resetFieldTrie(field, mv32Byte[uint64, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.balancesMultiValue,
|
||||||
|
}, stateutil.ValidatorLimitForBalancesChunks())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
@@ -1261,7 +1276,10 @@ func (b *BeaconState) balancesRootSelector(field types.FieldIndex) ([32]byte, er
|
|||||||
return b.stateFieldLeaves[field].TrieRoot()
|
return b.stateFieldLeaves[field].TrieRoot()
|
||||||
}
|
}
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
return b.recomputeFieldTrie(field, b.balancesMultiValue.Value(b))
|
return b.recomputeFieldTrie(field, mv32Byte[uint64, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.balancesMultiValue,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
return b.recomputeFieldTrie(field, b.balances)
|
return b.recomputeFieldTrie(field, b.balances)
|
||||||
}
|
}
|
||||||
@@ -1270,7 +1288,10 @@ func (b *BeaconState) balancesRootSelector(field types.FieldIndex) ([32]byte, er
|
|||||||
func (b *BeaconState) randaoMixesRootSelector(field types.FieldIndex) ([32]byte, error) {
|
func (b *BeaconState) randaoMixesRootSelector(field types.FieldIndex) ([32]byte, error) {
|
||||||
if b.rebuildTrie[field] {
|
if b.rebuildTrie[field] {
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
err := b.resetFieldTrie(field, customtypes.RandaoMixes(b.randaoMixesMultiValue.Value(b)), fieldparams.RandaoMixesLength)
|
err := b.resetFieldTrie(field, mv32Byte[[32]byte, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.randaoMixesMultiValue,
|
||||||
|
}, fieldparams.RandaoMixesLength)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, err
|
return [32]byte{}, err
|
||||||
}
|
}
|
||||||
@@ -1284,8 +1305,25 @@ func (b *BeaconState) randaoMixesRootSelector(field types.FieldIndex) ([32]byte,
|
|||||||
return b.stateFieldLeaves[field].TrieRoot()
|
return b.stateFieldLeaves[field].TrieRoot()
|
||||||
}
|
}
|
||||||
if features.Get().EnableExperimentalState {
|
if features.Get().EnableExperimentalState {
|
||||||
return b.recomputeFieldTrie(field, customtypes.RandaoMixes(b.randaoMixesMultiValue.Value(b)))
|
return b.recomputeFieldTrie(field, mv32Byte[[32]byte, *BeaconState]{
|
||||||
|
b,
|
||||||
|
b.randaoMixesMultiValue,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
return b.recomputeFieldTrie(field, b.randaoMixes)
|
return b.recomputeFieldTrie(field, b.randaoMixes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MultiValueSliceComposite[V comparable, O multi_value_slice.Identifiable] interface {
|
||||||
|
State() *BeaconState
|
||||||
|
multi_value_slice.MultiValueSlice[V, O]
|
||||||
|
}
|
||||||
|
|
||||||
|
type mv32Byte[V comparable, O multi_value_slice.Identifiable] struct {
|
||||||
|
*BeaconState
|
||||||
|
multi_value_slice.MultiValueSlice[V, O]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m mv32Byte[V, O]) State() *BeaconState {
|
||||||
|
return m.BeaconState
|
||||||
|
}
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ func (s *Service) processAttestations(ctx context.Context, attestations []*ethpb
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Broadcasting the signed attestation again once a node is able to process it.
|
// Broadcasting the signed attestation again once a node is able to process it.
|
||||||
if err := s.cfg.p2p.BroadcastAttestation(ctx, helpers.ComputeSubnetForAttestation(valCount, signedAtt.Message.Aggregate), signedAtt.Message.Aggregate); err != nil {
|
if err := s.cfg.p2p.BroadcastAttestation(ctx, helpers.ComputeSubnetForAttestation(valCount, signedAtt.Message.Aggregate), signedAtt.Message.Aggregate, false); err != nil {
|
||||||
log.WithError(err).Debug("Could not broadcast")
|
log.WithError(err).Debug("Could not broadcast")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import (
|
|||||||
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/execution"
|
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/execution"
|
||||||
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/flags"
|
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/flags"
|
||||||
jwtcommands "github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/jwt"
|
jwtcommands "github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/jwt"
|
||||||
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/storage"
|
|
||||||
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/sync/checkpoint"
|
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/sync/checkpoint"
|
||||||
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/sync/genesis"
|
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/sync/genesis"
|
||||||
"github.com/prysmaticlabs/prysm/v4/config/features"
|
"github.com/prysmaticlabs/prysm/v4/config/features"
|
||||||
@@ -279,7 +278,7 @@ func startNode(ctx *cli.Context) error {
|
|||||||
optFuncs := []func(*cli.Context) (node.Option, error){
|
optFuncs := []func(*cli.Context) (node.Option, error){
|
||||||
genesis.BeaconNodeOptions,
|
genesis.BeaconNodeOptions,
|
||||||
checkpoint.BeaconNodeOptions,
|
checkpoint.BeaconNodeOptions,
|
||||||
storage.BeaconNodeOptions,
|
//storage.BeaconNodeOptions,
|
||||||
}
|
}
|
||||||
for _, of := range optFuncs {
|
for _, of := range optFuncs {
|
||||||
ofo, err := of(ctx)
|
ofo, err := of(ctx)
|
||||||
|
|||||||
@@ -103,8 +103,10 @@ type Identifiable interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MultiValueSlice defines an abstraction over all concrete implementations of the generic Slice.
|
// MultiValueSlice defines an abstraction over all concrete implementations of the generic Slice.
|
||||||
type MultiValueSlice[O Identifiable] interface {
|
type MultiValueSlice[V comparable, O Identifiable] interface {
|
||||||
Len(obj O) int
|
Len(obj O) int
|
||||||
|
At(obj O, index uint64) (V, error)
|
||||||
|
Value(obj O) []V
|
||||||
}
|
}
|
||||||
|
|
||||||
// Value defines a single value along with one or more IDs that share this value.
|
// Value defines a single value along with one or more IDs that share this value.
|
||||||
|
|||||||
Reference in New Issue
Block a user