From 3a8098981cf52827911ad518d20967f7bb27d730 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Mon, 14 Dec 2020 09:29:34 +0000 Subject: [PATCH] Avoid crash on nil beacon block. Situation reported where a node returns nil for a beacon block when scoring attestation data. Although this should not happen (the provider told us about the block via the attestation, it should know it) this patch covers the situation where the returned block is empty or malformed. Fixes #9 --- strategies/attestationdata/best/score.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/strategies/attestationdata/best/score.go b/strategies/attestationdata/best/score.go index 0f3ac67..9a0a324 100644 --- a/strategies/attestationdata/best/score.go +++ b/strategies/attestationdata/best/score.go @@ -36,14 +36,22 @@ func (s *Service) scoreAttestationData(ctx context.Context, if headerProvider, isProvider := provider.(eth2client.BeaconBlockHeadersProvider); isProvider { block, err := headerProvider.BeaconBlockHeader(ctx, fmt.Sprintf("%#x", attestationData.BeaconBlockRoot)) if err != nil { - log.Error().Err(err).Msg("failed to obtain block header") + log.Error().Err(err).Msg("Failed to obtain block header") return float64(attestationData.Source.Epoch + attestationData.Target.Epoch) } slot = block.Header.Message.Slot } else if blockProvider, isProvider := provider.(eth2client.SignedBeaconBlockProvider); isProvider { block, err := blockProvider.SignedBeaconBlock(ctx, fmt.Sprintf("%#x", attestationData.BeaconBlockRoot)) if err != nil { - log.Error().Err(err).Msg("failed to obtain block") + log.Error().Err(err).Msg("Failed to obtain block") + return float64(attestationData.Source.Epoch + attestationData.Target.Epoch) + } + if block == nil { + log.Warn().Str("block_root", fmt.Sprintf("%#x", attestationData.BeaconBlockRoot)).Msg("No block returned by provider") + return float64(attestationData.Source.Epoch + attestationData.Target.Epoch) + } + if block.Message == nil { + log.Warn().Str("block_root", fmt.Sprintf("%#x", attestationData.BeaconBlockRoot)).Msg("Empty block returned by provider") return float64(attestationData.Source.Epoch + attestationData.Target.Epoch) } slot = block.Message.Slot