Skip to content

Commit f2afa1b

Browse files
authored
Feature/disable nodedata on halfpath (#7906)
1 parent 7f32990 commit f2afa1b

File tree

10 files changed

+44
-15
lines changed

10 files changed

+44
-15
lines changed

src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs

+4
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,10 @@ private async Task InitPeer()
404404
{
405405
_api.ProtocolsManager!.AddSupportedCapability(new Capability(Protocol.Snap, 1));
406406
}
407+
if (!_api.WorldStateManager!.SupportHashLookup)
408+
{
409+
_api.ProtocolsManager!.RemoveSupportedCapability(new Capability(Protocol.NodeData, 1));
410+
}
407411

408412
_api.ProtocolValidator = protocolValidator;
409413

src/Nethermind/Nethermind.Network.Test/P2P/P2PProtocolHandlerTests.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,16 @@ public void On_init_sends_a_hello_message()
8484
public void On_init_sends_a_hello_message_with_capabilities()
8585
{
8686
P2PProtocolHandler p2PProtocolHandler = CreateSession();
87+
string[] expectedCapabilities = ["eth66", "eth67", "eth68", "nodedata1"];
88+
89+
// These are called by ProtocolsManager.
90+
p2PProtocolHandler.AddSupportedCapability(new Capability(Protocol.Eth, 66));
91+
p2PProtocolHandler.AddSupportedCapability(new Capability(Protocol.Eth, 67));
92+
p2PProtocolHandler.AddSupportedCapability(new Capability(Protocol.Eth, 68));
93+
p2PProtocolHandler.AddSupportedCapability(new Capability(Protocol.NodeData, 1));
94+
8795
p2PProtocolHandler.Init();
8896

89-
string[] expectedCapabilities = ["eth66", "eth67", "eth68", "nodedata1"];
9097
_session.Received(1).DeliverMessage(
9198
Arg.Is<HelloMessage>(m => m.Capabilities.Select(c => c.ToString()).SequenceEqual(expectedCapabilities)));
9299
}

src/Nethermind/Nethermind.Network/P2P/P2PProtocolInfoProvider.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public static class P2PProtocolInfoProvider
1414
public static int GetHighestVersionOfEthProtocol()
1515
{
1616
int highestVersion = 0;
17-
foreach (Capability ethProtocol in P2PProtocolHandler.DefaultCapabilities)
17+
foreach (Capability ethProtocol in ProtocolsManager.DefaultCapabilities)
1818
{
1919
if (ethProtocol.ProtocolCode == Protocol.Eth && highestVersion < ethProtocol.Version)
2020
highestVersion = ethProtocol.Version;
@@ -25,7 +25,7 @@ public static int GetHighestVersionOfEthProtocol()
2525

2626
public static string DefaultCapabilitiesToString()
2727
{
28-
IEnumerable<string> capabilities = P2PProtocolHandler.DefaultCapabilities
28+
IEnumerable<string> capabilities = ProtocolsManager.DefaultCapabilities
2929
.OrderBy(x => x.ProtocolCode).ThenByDescending(x => x.Version)
3030
.Select(x => $"{x.ProtocolCode}/{x.Version}");
3131
return string.Join(",", capabilities);

src/Nethermind/Nethermind.Network/P2P/ProtocolHandlers/P2PProtocolHandler.cs

+1-9
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,9 @@ public class P2PProtocolHandler(
4949

5050
protected override TimeSpan InitTimeout => Timeouts.P2PHello;
5151

52-
public static readonly IEnumerable<Capability> DefaultCapabilities = new Capability[]
53-
{
54-
new(Protocol.Eth, 66),
55-
new(Protocol.Eth, 67),
56-
new(Protocol.Eth, 68),
57-
new(Protocol.NodeData, 1)
58-
};
59-
6052
public IReadOnlyList<Capability> AgreedCapabilities { get { return _agreedCapabilities; } }
6153
public IReadOnlyList<Capability> AvailableCapabilities { get { return _availableCapabilities; } }
62-
private readonly List<Capability> _supportedCapabilities = DefaultCapabilities.ToList();
54+
private readonly List<Capability> _supportedCapabilities = new List<Capability>();
6355

6456
public int ListenPort { get; } = session.LocalPort;
6557
public PublicKey LocalNodeId { get; } = localNodeId;

src/Nethermind/Nethermind.Network/ProtocolsManager.cs

+10-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Concurrent;
66
using System.Collections.Generic;
7+
using System.Linq;
78
using System.Numerics;
89
using System.Text.RegularExpressions;
910
using Nethermind.Config;
@@ -35,6 +36,14 @@ namespace Nethermind.Network
3536
{
3637
public class ProtocolsManager : IProtocolsManager
3738
{
39+
public static readonly IEnumerable<Capability> DefaultCapabilities = new Capability[]
40+
{
41+
new(Protocol.Eth, 66),
42+
new(Protocol.Eth, 67),
43+
new(Protocol.Eth, 68),
44+
new(Protocol.NodeData, 1)
45+
};
46+
3847
private readonly ConcurrentDictionary<Guid, SyncPeerProtocolHandlerBase> _syncPeers = new();
3948

4049
private readonly ConcurrentDictionary<Node, ConcurrentDictionary<Guid, ProtocolHandlerBase>> _hangingSatelliteProtocols =
@@ -54,11 +63,10 @@ public class ProtocolsManager : IProtocolsManager
5463
private readonly ForkInfo _forkInfo;
5564
private readonly IGossipPolicy _gossipPolicy;
5665
private readonly ITxGossipPolicy _txGossipPolicy;
57-
private readonly INetworkConfig _networkConfig;
5866
private readonly ILogManager _logManager;
5967
private readonly ILogger _logger;
6068
private readonly IDictionary<string, Func<ISession, int, IProtocolHandler>> _protocolFactories;
61-
private readonly HashSet<Capability> _capabilities = new();
69+
private readonly HashSet<Capability> _capabilities = DefaultCapabilities.ToHashSet();
6270
private readonly Regex? _clientIdPattern;
6371
private readonly IBackgroundTaskScheduler _backgroundTaskScheduler;
6472
private readonly ISnapServer? _snapServer;
@@ -98,7 +106,6 @@ public ProtocolsManager(
98106
_gossipPolicy = gossipPolicy ?? throw new ArgumentNullException(nameof(gossipPolicy));
99107
_txGossipPolicy = transactionsGossipPolicy ?? ShouldGossip.Instance;
100108
_logManager = logManager ?? throw new ArgumentNullException(nameof(logManager));
101-
_networkConfig = networkConfig ?? throw new ArgumentNullException(nameof(networkConfig));
102109
_snapServer = snapServer;
103110
_logger = _logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
104111

src/Nethermind/Nethermind.State.Test/WorldStateManagerTests.cs

+15
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,19 @@ public void ShouldProxyReorgBoundaryEvent()
3838

3939
gotEvent.Should().BeTrue();
4040
}
41+
42+
[TestCase(INodeStorage.KeyScheme.Hash, true)]
43+
[TestCase(INodeStorage.KeyScheme.HalfPath, false)]
44+
public void ShouldNotSupportHashLookupOnHalfpath(INodeStorage.KeyScheme keyScheme, bool hashSupported)
45+
{
46+
IWorldState worldState = Substitute.For<IWorldState>();
47+
ITrieStore trieStore = Substitute.For<ITrieStore>();
48+
IReadOnlyTrieStore readOnlyTrieStore = Substitute.For<IReadOnlyTrieStore>();
49+
trieStore.AsReadOnly().Returns(readOnlyTrieStore);
50+
readOnlyTrieStore.Scheme.Returns(keyScheme);
51+
IDbProvider dbProvider = TestMemDbProvider.Init();
52+
WorldStateManager worldStateManager = new WorldStateManager(worldState, trieStore, dbProvider, LimboLogs.Instance);
53+
54+
worldStateManager.SupportHashLookup.Should().Be(hashSupported);
55+
}
4156
}

src/Nethermind/Nethermind.State/IWorldStateManager.cs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public interface IWorldStateManager
1111
IWorldState GlobalWorldState { get; }
1212
IStateReader GlobalStateReader { get; }
1313
IReadOnlyTrieStore TrieStore { get; }
14+
bool SupportHashLookup { get; }
1415

1516
/// <summary>
1617
/// Used by read only tasks that need to execute blocks.

src/Nethermind/Nethermind.State/OverlayWorldStateManager.cs

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class OverlayWorldStateManager(
2626
public IStateReader GlobalStateReader => _reader;
2727

2828
public IReadOnlyTrieStore TrieStore { get; } = overlayTrieStore.AsReadOnly();
29+
public bool SupportHashLookup => overlayTrieStore.Scheme == INodeStorage.KeyScheme.Hash;
2930

3031
public IWorldState CreateResettableWorldState(IWorldState? forWarmup = null)
3132
{

src/Nethermind/Nethermind.State/OverridableWorldStateManager.cs

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public OverridableWorldStateManager(IDbProvider dbProvider, IReadOnlyTrieStore t
3131
public IWorldState GlobalWorldState => _state;
3232
public IStateReader GlobalStateReader => _reader;
3333
public IReadOnlyTrieStore TrieStore => _overlayTrieStore.AsReadOnly();
34+
public bool SupportHashLookup => _overlayTrieStore.Scheme == INodeStorage.KeyScheme.Hash;
3435

3536
public IWorldState CreateResettableWorldState(IWorldState? forWarmup = null)
3637
{

src/Nethermind/Nethermind.State/ReadOnlyWorldStateManager.cs

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ ILogManager logManager
3737
public IStateReader GlobalStateReader { get; }
3838

3939
public IReadOnlyTrieStore TrieStore => _readOnlyTrieStore;
40+
public bool SupportHashLookup => _readOnlyTrieStore.Scheme == INodeStorage.KeyScheme.Hash;
4041

4142
public IWorldState CreateResettableWorldState(IWorldState? forWarmup = null)
4243
{

0 commit comments

Comments
 (0)