-
Notifications
You must be signed in to change notification settings - Fork 661
Expand file tree
/
Copy pathTaikoForkchoiceUpdatedHandler.cs
More file actions
107 lines (97 loc) · 3.59 KB
/
TaikoForkchoiceUpdatedHandler.cs
File metadata and controls
107 lines (97 loc) · 3.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only
using System.Diagnostics.CodeAnalysis;
using Nethermind.Blockchain;
using Nethermind.Consensus;
using Nethermind.Consensus.Processing;
using Nethermind.Consensus.Producers;
using Nethermind.Core;
using Nethermind.Core.Crypto;
using Nethermind.Core.Specs;
using Nethermind.JsonRpc;
using Nethermind.Logging;
using Nethermind.Merge.Plugin;
using Nethermind.Merge.Plugin.BlockProduction;
using Nethermind.Merge.Plugin.Data;
using Nethermind.Merge.Plugin.Handlers;
using Nethermind.Merge.Plugin.InvalidChainTracker;
using Nethermind.Merge.Plugin.Synchronization;
using Nethermind.Synchronization.Peers;
namespace Nethermind.Taiko.Rpc;
internal class TaikoForkchoiceUpdatedHandler(
IBlockTree blockTree,
IManualBlockFinalizationManager manualBlockFinalizationManager,
IPoSSwitcher poSSwitcher,
IPayloadPreparationService payloadPreparationService,
IBlockProcessingQueue processingQueue,
IBlockCacheService blockCacheService,
IInvalidChainTracker invalidChainTracker,
IMergeSyncController mergeSyncController,
IBeaconPivot beaconPivot,
IPeerRefresher peerRefresher,
ISpecProvider specProvider,
ISyncPeerPool syncPeerPool,
IMergeConfig mergeConfig,
ILogManager logManager
) : ForkchoiceUpdatedHandler(
blockTree,
manualBlockFinalizationManager,
poSSwitcher,
payloadPreparationService,
processingQueue,
blockCacheService,
invalidChainTracker,
mergeSyncController,
beaconPivot,
peerRefresher,
specProvider,
syncPeerPool,
mergeConfig,
logManager)
{
protected override bool IsOnMainChainBehindHead(Block newHeadBlock, ForkchoiceStateV1 forkchoiceState,
[NotNullWhen(false)] out ResultWrapper<ForkchoiceUpdatedV1Result>? errorResult)
{
errorResult = null;
return true;
}
protected override BlockHeader? ValidateBlockHash(ref Hash256 blockHash, out string? errorMessage, bool skipZeroHash = true)
{
errorMessage = null;
if (skipZeroHash && blockHash == Keccak.Zero)
{
return null;
}
BlockHeader? blockHeader = _blockTree.FindHeader(blockHash, BlockTreeLookupOptions.DoNotCreateLevelIfMissing);
if (blockHeader is null)
{
blockHash = Keccak.Zero;
return null;
}
return blockHeader;
}
// Taiko Pacaya allows equal timestamps because multiple L2 blocks can be derived
// from a single L1 block, all sharing the same L1 anchor timestamp.
protected override bool ArePayloadAttributesTimestampAndSlotNumberValid(Block newHeadBlock, ForkchoiceStateV1 forkchoiceState, PayloadAttributes payloadAttributes,
[NotNullWhen(false)] out ResultWrapper<ForkchoiceUpdatedV1Result>? errorResult)
{
if (newHeadBlock.Timestamp > payloadAttributes.Timestamp)
{
string error = $"Payload timestamp {payloadAttributes.Timestamp} must be greater than or equal to block timestamp {newHeadBlock.Timestamp}.";
errorResult = ForkchoiceUpdatedV1Result.Error(error, MergeErrorCodes.InvalidPayloadAttributes);
return false;
}
errorResult = null;
return true;
}
protected override bool TryGetBranch(Block newHeadBlock, out Block[] blocks)
{
// Allow resetting to any block already on the main chain (including genesis)
if (_blockTree.IsMainChain(newHeadBlock.Header))
{
blocks = [newHeadBlock];
return true;
}
return base.TryGetBranch(newHeadBlock, out blocks);
}
}