Skip to content

Commit

Permalink
Unified invalid blocks handling in logs (#6749)
Browse files Browse the repository at this point in the history
  • Loading branch information
MarekM25 authored Aug 14, 2024
1 parent a796779 commit 52ecf6d
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ private void ValidateProcessedBlock(Block suggestedBlock, ProcessingOptions opti
{
if (!options.ContainsFlag(ProcessingOptions.NoValidation) && !_blockValidator.ValidateProcessedBlock(block, receipts, suggestedBlock, out string? error))
{
if (_logger.IsWarn) _logger.Warn($"Processed block is not valid {suggestedBlock.ToString(Block.Format.FullHashAndNumber)} - {error}");
if (_logger.IsWarn) _logger.Warn(InvalidBlockHelper.GetMessage(suggestedBlock, "invalid block after processing"));
if (_logger.IsWarn) _logger.Warn($"Suggested block TD: {suggestedBlock.TotalDifficulty}, Suggested block IsPostMerge {suggestedBlock.IsPostMerge}, Block TD: {block.TotalDifficulty}, Block IsPostMerge {block.IsPostMerge}");
throw new InvalidBlockException(suggestedBlock, error);
}
Expand Down
24 changes: 18 additions & 6 deletions src/Nethermind/Nethermind.Core/Block.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using Nethermind.Core.Collections;
using System.Text.Unicode;
using Nethermind.Core.Crypto;
using Nethermind.Core.Extensions;
using Nethermind.Int256;

namespace Nethermind.Core;
Expand Down Expand Up @@ -121,16 +124,24 @@ public Transaction[] Transactions
public string ToString(Format format) => format switch
{
Format.Full => ToFullString(),
Format.FullHashAndNumber => Hash is null ? $"{Number} null" : $"{Number} ({Hash})",
Format.FullHashAndNumber => ToFullHashAndNumber(),
Format.FullHashNumberAndExtraData => $"{ToFullHashAndNumber()}, ExtraData: {ExtraDataToString()}",
Format.HashNumberAndTx => Hash is null
? $"{Number} null, tx count: {Body.Transactions.Length}"
: $"{Number} {TimestampDate:HH:mm:ss} ({Hash?.ToShortString()}), tx count: {Body.Transactions.Length}",
Format.HashNumberDiffAndTx => Hash is null
? $"{Number} null, diff: {Difficulty}, tx count: {Body.Transactions.Length}"
: $"{Number} ({Hash?.ToShortString()}), diff: {Difficulty}, tx count: {Body.Transactions.Length}",
_ => Hash is null ? $"{Number} null" : $"{Number} ({Hash?.ToShortString()})"
Format.HashNumberDiffAndTx => $"{ToShortHashAndNumber()}, diff: {Difficulty}, tx count: {Body.Transactions.Length}",
_ => ToShortHashAndNumber()
};

private string ExtraDataToString()
{
if (ExtraData is null)
return "null";

return Utf8.IsValid(ExtraData) ? Encoding.UTF8.GetString(ExtraData) : ExtraData.ToHexString();
}
private string ToFullHashAndNumber() => Hash is null ? $"{Number} null" : $"{Number} ({Hash})";
private string ToShortHashAndNumber() => Hash is null ? $"{Number} null" : $"{Number} ({Hash?.ToShortString()})";
private string ToFullString()
{
StringBuilder builder = new();
Expand All @@ -152,7 +163,7 @@ private string ToFullString()

builder.AppendLine(" Withdrawals:");

foreach (var w in Body?.Withdrawals ?? Array.Empty<Withdrawal>())
foreach (Withdrawal w in Body?.Withdrawals ?? Array.Empty<Withdrawal>())
{
builder.Append(w.ToString(" "));
}
Expand All @@ -164,6 +175,7 @@ public enum Format
{
Full,
FullHashAndNumber,
FullHashNumberAndExtraData,
HashNumberAndTx,
HashNumberDiffAndTx,
Short
Expand Down
12 changes: 12 additions & 0 deletions src/Nethermind/Nethermind.Core/InvalidBlockHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

namespace Nethermind.Core;

public static class InvalidBlockHelper
{
public static string GetMessage(Block? block, string reason)
{
return $"Rejected invalid block {block?.ToString(Block.Format.FullHashNumberAndExtraData)}, reason: {reason}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public async Task<ResultWrapper<ForkchoiceUpdatedV1Result>> Handle(ForkchoiceSta

if (_invalidChainTracker.IsOnKnownInvalidChain(forkchoiceState.HeadBlockHash, out Hash256? lastValidHash))
{
if (_logger.IsInfo) _logger.Info($"Received Invalid {forkchoiceState} {payloadAttributes} - {forkchoiceState.HeadBlockHash} is known to be a part of an invalid chain.");
if (_logger.IsWarn) _logger.Warn($"Received Invalid {forkchoiceState} {payloadAttributes} - {forkchoiceState.HeadBlockHash} is known to be a part of an invalid chain.");
return ForkchoiceUpdatedV1Result.Invalid(lastValidHash);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,20 +92,20 @@ public async Task<ResultWrapper<PayloadStatusV1>> HandleAsync(ExecutionPayload r

if (!request.TryGetBlock(out Block? block, _poSSwitcher.FinalTotalDifficulty))
{
if (_logger.IsWarn) _logger.Warn($"Invalid block. Result of {requestStr}.");
if (_logger.IsWarn) _logger.Warn($"Invalid request. Result of {requestStr}.");
return NewPayloadV1Result.Invalid(null, $"Block {request} could not be parsed as a block");
}

if (!HeaderValidator.ValidateHash(block!.Header))
{
if (_logger.IsWarn) _logger.Warn($"InvalidBlockHash. Result of {requestStr}.");
if (_logger.IsWarn) _logger.Warn(InvalidBlockHelper.GetMessage(block, "invalid block hash"));
return NewPayloadV1Result.Invalid(null, $"Invalid block hash {request.BlockHash}");
}

_invalidChainTracker.SetChildParent(block.Hash!, block.ParentHash!);
if (_invalidChainTracker.IsOnKnownInvalidChain(block.Hash!, out Hash256? lastValidHash))
{
if (_logger.IsInfo) _logger.Info($"Invalid - block {request} is known to be a part of an invalid chain. The last valid is {lastValidHash}");
if (_logger.IsWarn) _logger.Warn(InvalidBlockHelper.GetMessage(block, $"block is a part of an invalid chain") + $"The last valid is {lastValidHash}");
return NewPayloadV1Result.Invalid(lastValidHash, $"Block {request} is known to be a part of an invalid chain.");
}

Expand All @@ -128,7 +128,7 @@ public async Task<ResultWrapper<PayloadStatusV1>> HandleAsync(ExecutionPayload r
{
if (!_blockValidator.ValidateOrphanedBlock(block!, out string? error))
{
if (_logger.IsWarn) _logger.Info($"Invalid block without parent. Result of {requestStr}.");
if (_logger.IsWarn) _logger.Warn(InvalidBlockHelper.GetMessage(block, "orphaned block is invalid"));
return NewPayloadV1Result.Invalid(null, $"Invalid block without parent: {error}.");
}

Expand Down Expand Up @@ -156,7 +156,7 @@ public async Task<ResultWrapper<PayloadStatusV1>> HandleAsync(ExecutionPayload r
{
if (!_blockValidator.ValidateSuggestedBlock(block, out string? error, validateHashes: false))
{
if (_logger.IsInfo) _logger.Info($"Rejecting invalid block received during the sync, block: {block}");
if (_logger.IsWarn) _logger.Warn(InvalidBlockHelper.GetMessage(block, "suggested block is invalid"));
return NewPayloadV1Result.Invalid(error);
}

Expand Down Expand Up @@ -205,7 +205,7 @@ public async Task<ResultWrapper<PayloadStatusV1>> HandleAsync(ExecutionPayload r

if (result == ValidationResult.Invalid)
{
if (_logger.IsInfo) _logger.Info($"Invalid block found. Validation message: {message}. Result of {requestStr}.");
if (_logger.IsWarn) _logger.Warn(InvalidBlockHelper.GetMessage(block, $"{message}"));
_invalidChainTracker.OnInvalidBlock(block.Hash!, block.ParentHash);
return ResultWrapper<PayloadStatusV1>.Success(BuildInvalidPayloadStatusV1(request, message));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,8 @@ bool HasMoreToSync(out BlockHeader[]? headers, out int headersToRequest)
// can move this to block tree now?
if (!_blockValidator.ValidateSuggestedBlock(currentBlock, out _))
{
string message = $"{bestPeer} sent an invalid block {currentBlock.ToString(Block.Format.Short)}.";
string message = InvalidBlockHelper.GetMessage(currentBlock, "invalid block sent by peer") +
$" PeerInfo {bestPeer}";
if (_logger.IsWarn) _logger.Warn(message);
throw new EthSyncException(message);
}
Expand Down

0 comments on commit 52ecf6d

Please sign in to comment.