Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Miscellaneous Runtime Fixes & Improvements - Raul #1674

Merged
merged 75 commits into from
Feb 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
b5d7435
fatal if impossible to receive chainstart
rauljordan Feb 20, 2019
d1e9a1b
fix tests
rauljordan Feb 20, 2019
57c0b18
fix
rauljordan Feb 20, 2019
dfc0ee7
custom delay
rauljordan Feb 20, 2019
0b2ed55
completed custom delay
rauljordan Feb 20, 2019
edb20e8
Merge branch 'customdelay' into testrun
rauljordan Feb 20, 2019
5655eba
merge
rauljordan Feb 20, 2019
cfac400
errors
rauljordan Feb 20, 2019
7277779
better logs, nothing at genesis
rauljordan Feb 20, 2019
fb9b803
use demo in val
rauljordan Feb 20, 2019
dc96452
add gazelle
rauljordan Feb 20, 2019
9aa5ad4
log
rauljordan Feb 20, 2019
05b3717
starting to log stuff
terencechain Feb 20, 2019
0d3cc7b
pass in ops
rauljordan Feb 20, 2019
549da08
merged with raul's test run PR
terencechain Feb 21, 2019
f82f2d6
avoid printing the large #s for debug, still working on tests..
terencechain Feb 21, 2019
d7c8141
all around better logging
rauljordan Feb 21, 2019
5a02bd0
fixed build error in epoch process
rauljordan Feb 21, 2019
7c95c42
fixed state transiton tests
terencechain Feb 21, 2019
4051ac3
fixed core tests
terencechain Feb 21, 2019
727adf4
fixed block tests
terencechain Feb 21, 2019
d7b54e5
lint
terencechain Feb 21, 2019
578f0c5
verify sigs in randao
rauljordan Feb 21, 2019
081f5fe
ready for inclusion falg
rauljordan Feb 21, 2019
361b665
only print waiting when slot is not valid
terencechain Feb 21, 2019
824f66b
fix build
rauljordan Feb 21, 2019
df677d4
Merge branch 'master' into testrun
rauljordan Feb 21, 2019
d17f2eb
fixed epoch boundary issue
terencechain Feb 21, 2019
695547b
Merge branch 'testrun' of github.com:prysmaticlabs/prysm into better-…
terencechain Feb 21, 2019
7089825
Merge branch 'master' into testrun
rauljordan Feb 21, 2019
2289d86
mod config
rauljordan Feb 21, 2019
b6864b0
Merge branch 'testrun' of github.com:prysmaticlabs/prysm into testrun
rauljordan Feb 21, 2019
f7fd39a
fixed last justified slot issue
terencechain Feb 21, 2019
7bbf566
fix inclusion
rauljordan Feb 21, 2019
917a106
fixed attestation issue
rauljordan Feb 21, 2019
259f9c2
using zero hash from params instead
rauljordan Feb 21, 2019
7172aec
Merge branch 'testrun' of github.com:prysmaticlabs/prysm into better-…
terencechain Feb 21, 2019
92002a9
fix tests
rauljordan Feb 21, 2019
5782ea9
update balance
terencechain Feb 21, 2019
a9d8fef
Merge branch 'testrun' of github.com:prysmaticlabs/prysm into better-…
terencechain Feb 21, 2019
fc0ba33
removed swp
terencechain Feb 21, 2019
41b0916
more `- genesis_slot` for logs
terencechain Feb 21, 2019
64fe31d
rem unused log
rauljordan Feb 21, 2019
7979a58
Merge branch 'better-logging-1' into testrun
rauljordan Feb 21, 2019
7a17aed
fix broken tests
rauljordan Feb 21, 2019
aad6295
account for skip slots in state root computation
rauljordan Feb 21, 2019
453f5f6
fixes done
rauljordan Feb 21, 2019
d8dd8f2
validator guide bug fixes - 671
terencechain Feb 21, 2019
cf1c39c
epoch boundary at the last slot of the epoch
terencechain Feb 22, 2019
5940fdf
fix epoch issue
rauljordan Feb 22, 2019
2eaa9c1
Merge branch 'testrun' of github.com:prysmaticlabs/prysm into better-…
terencechain Feb 22, 2019
f535fa4
Merge branch 'master' of github.com:prysmaticlabs/prysm into better-l…
terencechain Feb 22, 2019
7ac7b52
more balance cal logs for debugging
terencechain Feb 22, 2019
e0d870d
greater balance
rauljordan Feb 22, 2019
61fa728
fix broken tests
rauljordan Feb 22, 2019
e922e20
attestaton fixes
terencechain Feb 22, 2019
03361c7
fixes
rauljordan Feb 22, 2019
43b9e64
addressed testrun
rauljordan Feb 22, 2019
18fd1c2
fixed ejection balance
rauljordan Feb 22, 2019
4035cdc
sync with terence
rauljordan Feb 22, 2019
5437c4c
sync
rauljordan Feb 22, 2019
63a8932
fix tests with far future epoch
rauljordan Feb 22, 2019
15dac35
Merge branch 'master' into testrun
rauljordan Feb 22, 2019
2109a39
revert sync change
rauljordan Feb 22, 2019
1400fb6
Merge branch 'testrun' of github.com:prysmaticlabs/prysm into testrun
rauljordan Feb 22, 2019
032d4ac
revert initial sync change
rauljordan Feb 22, 2019
4c67deb
fix changes
rauljordan Feb 23, 2019
f08c97a
off by one att fix
rauljordan Feb 23, 2019
72aba38
revert the att fix
rauljordan Feb 24, 2019
f03433e
sync with master
rauljordan Feb 24, 2019
4335008
address comments
rauljordan Feb 25, 2019
35900c8
format
rauljordan Feb 25, 2019
7ee84ed
sync master
rauljordan Feb 25, 2019
c60136d
fix build
rauljordan Feb 25, 2019
0f98ced
rem file
rauljordan Feb 25, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion beacon-chain/attestation/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ func (a *Service) attestationPool() {
log.Errorf("Could not update attestation pool: %v", err)
continue
}
log.Debugf("Updated attestation pool for attestation %#x", h)
log.Infof("Updated attestation pool for attestation %#x", h)
}
}
}
Expand Down
11 changes: 6 additions & 5 deletions beacon-chain/blockchain/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,8 @@ func (c *ChainService) ReceiveBlock(block *pb.BeaconBlock, beaconState *pb.Beaco
}

if block.Slot == params.BeaconConfig().GenesisSlot {
return nil, fmt.Errorf("cannot process a genesis block: received block with slot %d", params.BeaconConfig().GenesisSlot)
return nil, fmt.Errorf("cannot process a genesis block: received block with slot %d",
block.Slot-params.BeaconConfig().GenesisSlot)
}

// Save blocks with higher slot numbers in cache.
Expand All @@ -300,16 +301,16 @@ func (c *ChainService) ReceiveBlock(block *pb.BeaconBlock, beaconState *pb.Beaco
return nil, fmt.Errorf("could not retrieve chain head root: %v", err)
}

log.WithField("slotNumber", block.Slot).Info("Executing state transition")
log.WithField("slotNumber", block.Slot-params.BeaconConfig().GenesisSlot).Info(
"Executing state transition")

// Check for skipped slots and update the corresponding proposers
// randao layer.
// Check for skipped slots.
for beaconState.Slot < block.Slot-1 {
beaconState, err = state.ExecuteStateTransition(
beaconState,
nil,
headRoot,
true, /* no sig verify */
true, /* sig verify */
)
if err != nil {
return nil, fmt.Errorf("could not execute state transition %v", err)
Expand Down
3 changes: 2 additions & 1 deletion beacon-chain/core/balances/rewards_penalties.go
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,8 @@ func Crosslinks(
for i := startSlot; i < endSlot; i++ {
crosslinkCommittees, err := helpers.CrosslinkCommitteesAtSlot(state, i, false)
if err != nil {
return nil, fmt.Errorf("could not get shard committees for slot %d: %v", i, err)
return nil, fmt.Errorf("could not get shard committees for slot %d: %v",
i-params.BeaconConfig().GenesisSlot, err)
}
for _, crosslinkCommittee := range crosslinkCommittees {
shard := crosslinkCommittee.Shard
Expand Down
1 change: 1 addition & 0 deletions beacon-chain/core/blocks/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ go_library(
"@com_github_ethereum_go_ethereum//common:go_default_library",
"@com_github_ethereum_go_ethereum//core/types:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
"@com_github_sirupsen_logrus//:go_default_library",
],
)

Expand Down
9 changes: 6 additions & 3 deletions beacon-chain/core/blocks/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,13 @@ func BlockRoot(state *pb.BeaconState, slot uint64) ([]byte, error) {
earliestSlot := state.Slot - params.BeaconConfig().LatestBlockRootsLength

if slot < earliestSlot || slot >= state.Slot {
if earliestSlot < params.BeaconConfig().GenesisSlot {
earliestSlot = params.BeaconConfig().GenesisSlot
}
return []byte{}, fmt.Errorf("slot %d is not within expected range of %d to %d",
slot,
earliestSlot,
state.Slot,
slot-params.BeaconConfig().GenesisSlot,
earliestSlot-params.BeaconConfig().GenesisSlot,
state.Slot-params.BeaconConfig().GenesisSlot,
)
}

Expand Down
52 changes: 32 additions & 20 deletions beacon-chain/core/blocks/block_operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"fmt"
"reflect"

"github.com/sirupsen/logrus"

"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/forkutils"
"github.com/prysmaticlabs/prysm/shared/ssz"
Expand All @@ -30,11 +32,8 @@ import (
//
// WIP - this is stubbed out until BLS is integrated into Prysm.
func VerifyProposerSignature(
block *pb.BeaconBlock,
_ *pb.BeaconBlock,
) error {
if block == nil {
return errors.New("received nil block")
}
return nil
}

Expand Down Expand Up @@ -80,14 +79,16 @@ func ProcessEth1Data(beaconState *pb.BeaconState, block *pb.BeaconBlock) *pb.Bea
// signature=block.randao_reveal, domain=get_domain(state.fork, get_current_epoch(state), DOMAIN_RANDAO)).
// Set state.latest_randao_mixes[get_current_epoch(state) % LATEST_RANDAO_MIXES_LENGTH] =
// xor(get_randao_mix(state, get_current_epoch(state)), hash(block.randao_reveal))
func ProcessBlockRandao(beaconState *pb.BeaconState, block *pb.BeaconBlock) (*pb.BeaconState, error) {
func ProcessBlockRandao(beaconState *pb.BeaconState, block *pb.BeaconBlock, verifySignatures bool) (*pb.BeaconState, error) {
proposerIdx, err := helpers.BeaconProposerIndex(beaconState, beaconState.Slot)
if err != nil {
return nil, fmt.Errorf("could not get beacon proposer index: %v", err)
}
proposer := beaconState.ValidatorRegistry[proposerIdx]
if err := verifyBlockRandao(beaconState, block, proposer); err != nil {
return nil, fmt.Errorf("could not verify block randao: %v", err)
if verifySignatures {
if err := verifyBlockRandao(beaconState, block, proposer); err != nil {
return nil, fmt.Errorf("could not verify block randao: %v", err)
}
}
// If block randao passed verification, we XOR the state's latest randao mix with the block's
// randao and update the state's corresponding latest randao mix value.
Expand Down Expand Up @@ -118,6 +119,11 @@ func verifyBlockRandao(beaconState *pb.BeaconState, block *pb.BeaconBlock, propo
if err != nil {
return fmt.Errorf("could not deserialize block randao reveal: %v", err)
}
log.WithFields(logrus.Fields{
"epoch": helpers.CurrentEpoch(beaconState),
"pubkey": fmt.Sprintf("%#x", proposer.Pubkey),
"epochSig": fmt.Sprintf("%#x", sig.Marshal()),
}).Info("Verifying randao")
if !sig.Verify(hashTreeRoot[:], pub, domain) {
return fmt.Errorf("block randao reveal signature did not verify")
}
Expand Down Expand Up @@ -187,7 +193,14 @@ func verifyProposerSlashing(
root1 := slashing.ProposalData_1.BlockRootHash32
root2 := slashing.ProposalData_2.BlockRootHash32
if slot1 != slot2 {
return fmt.Errorf("slashing proposal data slots do not match: %d, %d", slot1, slot2)
if slot1 > params.BeaconConfig().GenesisSlot {
slot1 -= params.BeaconConfig().GenesisSlot
}
if slot2 > params.BeaconConfig().GenesisSlot {
slot2 -= params.BeaconConfig().GenesisSlot
}
return fmt.Errorf("slashing proposal data slots do not match: %d, %d",
slot1, slot2)
}
if shard1 != shard2 {
return fmt.Errorf("slashing proposal data shards do not match: %d, %d", shard1, shard2)
Expand Down Expand Up @@ -388,19 +401,19 @@ func ProcessBlockAttestations(
params.BeaconConfig().MaxAttestations,
)
}
var pendingAttestations []*pb.PendingAttestation

for idx, attestation := range atts {
if err := verifyAttestation(beaconState, attestation, verifySignatures); err != nil {
return nil, fmt.Errorf("could not verify attestation at index %d in block: %v", idx, err)
}
pendingAttestations = append(pendingAttestations, &pb.PendingAttestation{
beaconState.LatestAttestations = append(beaconState.LatestAttestations, &pb.PendingAttestation{
Data: attestation.Data,
AggregationBitfield: attestation.AggregationBitfield,
CustodyBitfield: attestation.CustodyBitfield,
InclusionSlot: beaconState.Slot,
})
}
beaconState.LatestAttestations = pendingAttestations

return beaconState, nil
}

Expand All @@ -409,23 +422,23 @@ func verifyAttestation(beaconState *pb.BeaconState, att *pb.Attestation, verifyS
if att.Data.Slot+inclusionDelay > beaconState.Slot {
return fmt.Errorf(
"attestation slot (slot %d) + inclusion delay (%d) beyond current beacon state slot (%d)",
att.Data.Slot,
att.Data.Slot-params.BeaconConfig().GenesisSlot,
inclusionDelay,
beaconState.Slot,
beaconState.Slot-params.BeaconConfig().GenesisSlot,
)
}
if att.Data.Slot+params.BeaconConfig().SlotsPerEpoch < beaconState.Slot {
return fmt.Errorf(
"attestation slot (slot %d) + epoch length (%d) less than current beacon state slot (%d)",
att.Data.Slot,
att.Data.Slot-params.BeaconConfig().GenesisSlot,
params.BeaconConfig().SlotsPerEpoch,
beaconState.Slot,
beaconState.Slot-params.BeaconConfig().GenesisSlot,
)
}
// Verify that `attestation.data.justified_epoch` is equal to `state.justified_epoch
// if slot_to_epoch(attestation.data.slot + 1) >= get_current_epoch(state)
// if slot_to_epoch(attestation.data.slot) >= get_current_epoch(state)
// else state.previous_justified_epoch`.
if helpers.SlotToEpoch(att.Data.Slot+1) >= helpers.CurrentEpoch(beaconState) {
if helpers.SlotToEpoch(att.Data.Slot) >= helpers.CurrentEpoch(beaconState) {
if att.Data.JustifiedEpoch != beaconState.JustifiedEpoch {
return fmt.Errorf(
"expected attestation.JustifiedEpoch == state.JustifiedEpoch, received %d == %d",
Expand Down Expand Up @@ -472,7 +485,6 @@ func verifyAttestation(beaconState *pb.BeaconState, att *pb.Attestation, verifyS
}
crosslinkFromAttestation := att.Data.LatestCrosslink
crosslinkFromState := beaconState.LatestCrosslinks[shard]

if !(reflect.DeepEqual(crosslinkFromState, crosslink) ||
reflect.DeepEqual(crosslinkFromState, crosslinkFromAttestation)) {
return fmt.Errorf(
Expand All @@ -482,10 +494,10 @@ func verifyAttestation(beaconState *pb.BeaconState, att *pb.Attestation, verifyS
}

// Verify attestation.shard_block_root == ZERO_HASH [TO BE REMOVED IN PHASE 1].
if !bytes.Equal(att.Data.ShardBlockRootHash32, []byte{}) {
if !bytes.Equal(att.Data.ShardBlockRootHash32, params.BeaconConfig().ZeroHash[:]) {
return fmt.Errorf(
"expected attestation.ShardBlockRoot == %#x, received %#x instead",
[]byte{},
params.BeaconConfig().ZeroHash[:],
att.Data.ShardBlockRootHash32,
)
}
Expand Down
16 changes: 9 additions & 7 deletions beacon-chain/core/blocks/block_operations_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ func TestProcessBlockRandao_IncorrectProposerFailsVerification(t *testing.T) {
if _, err := blocks.ProcessBlockRandao(
beaconState,
block,
true,
); !strings.Contains(err.Error(), want) {
t.Errorf("Expected %v, received %v", want, err)
}
Expand Down Expand Up @@ -98,6 +99,7 @@ func TestProcessBlockRandao_SignatureVerifiesAndUpdatesLatestStateMixes(t *testi
newState, err := blocks.ProcessBlockRandao(
beaconState,
block,
true,
)
if err != nil {
t.Errorf("Unexpected error processing block randao: %v", err)
Expand Down Expand Up @@ -702,7 +704,7 @@ func TestProcessBlockAttestations_InclusionDelayFailure(t *testing.T) {
attestations := []*pb.Attestation{
{
Data: &pb.AttestationData{
Slot: 5,
Slot: params.BeaconConfig().GenesisSlot + 5,
},
},
}
Expand All @@ -712,7 +714,7 @@ func TestProcessBlockAttestations_InclusionDelayFailure(t *testing.T) {
},
}
state := &pb.BeaconState{
Slot: 5,
Slot: params.BeaconConfig().GenesisSlot + 5,
}

want := fmt.Sprintf(
Expand All @@ -734,7 +736,7 @@ func TestProcessBlockAttestations_EpochDistanceFailure(t *testing.T) {
attestations := []*pb.Attestation{
{
Data: &pb.AttestationData{
Slot: 5,
Slot: params.BeaconConfig().GenesisSlot + 5,
},
},
}
Expand All @@ -744,7 +746,7 @@ func TestProcessBlockAttestations_EpochDistanceFailure(t *testing.T) {
},
}
state := &pb.BeaconState{
Slot: 5 + 2*params.BeaconConfig().SlotsPerEpoch,
Slot: params.BeaconConfig().GenesisSlot + 5 + 2*params.BeaconConfig().SlotsPerEpoch,
}

want := fmt.Sprintf(
Expand Down Expand Up @@ -932,7 +934,7 @@ func TestProcessBlockAttestations_CrosslinkRootFailure(t *testing.T) {
Slot: params.BeaconConfig().GenesisSlot + 20,
JustifiedBlockRootHash32: blockRoots[0],
LatestCrosslink: &pb.Crosslink{ShardBlockRootHash32: []byte{2}},
ShardBlockRootHash32: []byte{2},
ShardBlockRootHash32: params.BeaconConfig().ZeroHash[:],
JustifiedEpoch: params.BeaconConfig().GenesisEpoch,
},
},
Expand Down Expand Up @@ -990,7 +992,7 @@ func TestProcessBlockAttestations_ShardBlockRootEqualZeroHashFailure(t *testing.
}
want := fmt.Sprintf(
"expected attestation.ShardBlockRoot == %#x, received %#x instead",
[]byte{},
params.BeaconConfig().ZeroHash[:],
[]byte{1},
)
if _, err := blocks.ProcessBlockAttestations(
Expand Down Expand Up @@ -1024,7 +1026,7 @@ func TestProcessBlockAttestations_CreatePendingAttestations(t *testing.T) {
Slot: params.BeaconConfig().GenesisSlot + 20,
JustifiedBlockRootHash32: blockRoots[0],
LatestCrosslink: &pb.Crosslink{ShardBlockRootHash32: []byte{1}},
ShardBlockRootHash32: []byte{},
ShardBlockRootHash32: params.BeaconConfig().ZeroHash[:],
JustifiedEpoch: params.BeaconConfig().GenesisEpoch,
},
AggregationBitfield: []byte{1},
Expand Down
6 changes: 3 additions & 3 deletions beacon-chain/core/blocks/block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ func TestBlockRootAtSlot_OutOfBounds(t *testing.T) {
slot: params.BeaconConfig().GenesisSlot + 1000,
stateSlot: params.BeaconConfig().GenesisSlot + 500,
expectedErr: fmt.Sprintf("slot %d is not within expected range of %d to %d",
params.BeaconConfig().GenesisSlot+1000,
params.BeaconConfig().GenesisSlot+500-params.BeaconConfig().LatestBlockRootsLength,
params.BeaconConfig().GenesisSlot+500),
1000,
0,
500),
},
{
slot: params.BeaconConfig().GenesisSlot + 129,
Expand Down
12 changes: 10 additions & 2 deletions beacon-chain/core/blocks/validity_conditions.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ import (
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/sirupsen/logrus"
)

var log = logrus.WithField("prefix", "core/blocks")

// IsValidBlock ensures that the block is compliant with the block processing validity conditions.
// Spec:
// For a beacon chain block, block, to be processed by a node, the following conditions must be met:
Expand Down Expand Up @@ -58,7 +61,7 @@ func IsValidBlock(
// The node's local time is greater than or equal to
// state.genesis_time + (block.slot-GENESIS_SLOT)* SECONDS_PER_SLOT.
if !IsSlotValid(block.Slot, genesisTime) {
return fmt.Errorf("slot of block is too high: %d", block.Slot)
return fmt.Errorf("slot of block is too high: %d", block.Slot-params.BeaconConfig().GenesisSlot)
}

return nil
Expand All @@ -68,5 +71,10 @@ func IsValidBlock(
func IsSlotValid(slot uint64, genesisTime time.Time) bool {
slotDuration := time.Duration((slot-params.BeaconConfig().GenesisSlot)*params.BeaconConfig().SecondsPerSlot) * time.Second
validTimeThreshold := genesisTime.Add(slotDuration)
return clock.Now().After(validTimeThreshold)
now := clock.Now()
if !now.After(validTimeThreshold) {
log.Infof("Waiting for slot to be valid. local clock: %v, genesis+slot: %v",
now, validTimeThreshold)
}
return now.After(validTimeThreshold)
}
1 change: 1 addition & 0 deletions beacon-chain/core/epoch/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ go_library(
"//shared/mathutil:go_default_library",
"//shared/params:go_default_library",
"//shared/ssz:go_default_library",
"@com_github_sirupsen_logrus//:go_default_library",
],
)

Expand Down
2 changes: 2 additions & 0 deletions beacon-chain/core/epoch/epoch_operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ func CurrentBoundaryAttestations(

attestationData := attestation.Data
sameRoot := bytes.Equal(attestationData.JustifiedBlockRootHash32, boundaryBlockRoot)
log.Infof("Boundary attestation: att justified root: %v, state justified root: %d", attestationData.JustifiedBlockRootHash32, boundaryBlockRoot)
log.Infof("Boundary attestation: att justified epoch: %v, state justified epoch: %d", attestation.Data.JustifiedEpoch, state.JustifiedEpoch)
sameEpoch := attestation.Data.JustifiedEpoch == state.JustifiedEpoch

if sameRoot && sameEpoch {
Expand Down
Loading