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

Feature/network di #7520

Draft
wants to merge 38 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
4df93ed
Seems nice
asdacap Sep 24, 2024
4b3cc69
Snap provider
asdacap Sep 24, 2024
479a3f8
Sync dispatcher
asdacap Sep 24, 2024
0a52825
Dedup
asdacap Sep 24, 2024
3144f3b
Multi sync mode selector
asdacap Sep 25, 2024
c85f3e8
Fast and full sync
asdacap Sep 25, 2024
c126f95
The merge synchronizer
asdacap Sep 25, 2024
5d21826
Use reflection
asdacap Sep 25, 2024
3d90236
Fic test
asdacap Sep 25, 2024
b9dac97
Minor cleanup
asdacap Sep 25, 2024
0f5343d
Remote block downloader
asdacap Sep 25, 2024
1181068
Reduce constructor parameter
asdacap Sep 25, 2024
54facc1
Add unit tests
asdacap Sep 25, 2024
67fe004
Cleanup
asdacap Sep 25, 2024
aecaea1
Whitespace
asdacap Sep 25, 2024
867f1f3
Pass through the servide collection
asdacap Sep 27, 2024
cb82a56
Use a need to wait for header config
asdacap Sep 27, 2024
7b2b7ec
Remove more manual construction
asdacap Sep 27, 2024
13e167f
Whitespace
asdacap Sep 27, 2024
7ba6845
Merge remote-tracking branch 'origin/master' into feature/minor-di
asdacap Sep 27, 2024
9b0cf3d
Do this more properly
asdacap Sep 27, 2024
b06b200
Set sync mode selector from container directly
asdacap Sep 27, 2024
8034622
Get component directly from container
asdacap Sep 27, 2024
915047e
Remove unnecessary code
asdacap Sep 27, 2024
e4b3baa
I thought I specifically fixed this before
asdacap Sep 27, 2024
fd8845e
Merge remote-tracking branch 'origin/master' into feature/minor-di-pr…
asdacap Sep 27, 2024
1c54c1d
Well.. might as well make everything autofac
asdacap Sep 27, 2024
e7abfba
Fix test
asdacap Sep 27, 2024
0b58c9c
Cleanup
asdacap Sep 27, 2024
a90fb3f
Why did you not fail earlier?
asdacap Sep 27, 2024
c14ae8b
Use module. Module nice.
asdacap Sep 28, 2024
0f73b6b
Fix fast sync being loaded in tests
asdacap Sep 30, 2024
dd015d3
Merge remote-tracking branch 'origin/master' into feature/minor-di-pr…
asdacap Sep 30, 2024
ee4cf91
Fic build
asdacap Sep 30, 2024
69bcc78
Merge branch 'fix/build-on-nodeloaders-test' into feature/minor-di-pr…
asdacap Sep 30, 2024
dfd0f34
Merge remote-tracking branch 'origin/master' into feature/minor-di-pr…
asdacap Sep 30, 2024
9e4da92
Migrate more of network initialization
asdacap Sep 28, 2024
39ede21
Fix build
asdacap Sep 30, 2024
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
3 changes: 3 additions & 0 deletions src/Nethermind/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<PackageVersion Include="AspNetCore.HealthChecks.UI" Version="8.0.1" />
<PackageVersion Include="AspNetCore.HealthChecks.UI.Client" Version="8.0.1" />
<PackageVersion Include="AspNetCore.HealthChecks.UI.InMemory.Storage" Version="8.0.1" />
<PackageVersion Include="Autofac" Version="8.1.0" />
<PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
<PackageVersion Include="BenchmarkDotNet" Version="0.13.12" />
<PackageVersion Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.13.12" />
<PackageVersion Include="BouncyCastle.Cryptography" Version="2.4.0" />
Expand Down Expand Up @@ -36,6 +38,7 @@
<PackageVersion Include="Microsoft.ClearScript.V8.Native.osx-x64" Version="7.4.5" />
<PackageVersion Include="Microsoft.ClearScript.V8.Native.win-x64" Version="7.4.5" />
<PackageVersion Include="McMaster.Extensions.CommandLineUtils" Version="4.1.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
// SPDX-License-Identifier: LGPL-3.0-only

using System.Threading.Tasks;
using Autofac;

namespace Nethermind.Api.Extensions
{
public interface ISynchronizationPlugin : INethermindPlugin
{
Task InitSynchronization();
void ConfigureSynchronizationBuilder(ContainerBuilder containerBuilder);
Task InitSynchronization(IContainer container);
}
}
15 changes: 13 additions & 2 deletions src/Nethermind/Nethermind.Api/IApiWithBlockchain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: LGPL-3.0-only

#nullable enable
using Autofac;
using Nethermind.Blockchain;
using Nethermind.Blockchain.Filters;
using Nethermind.Blockchain.FullPruning;
Expand Down Expand Up @@ -91,13 +92,23 @@ public interface IApiWithBlockchain : IApiWithStores, IBlockchainBridgeFactory

IGasPriceOracle? GasPriceOracle { get; set; }

IEthSyncingInfo? EthSyncingInfo { get; set; }
IEthSyncingInfo? EthSyncingInfo { get; }

CompositePruningTrigger PruningTrigger { get; }

IBlockProductionPolicy? BlockProductionPolicy { get; set; }
INodeStorageFactory NodeStorageFactory { get; set; }
BackgroundTaskScheduler BackgroundTaskScheduler { get; set; }
IBackgroundTaskScheduler BackgroundTaskScheduler { get; set; }
CensorshipDetector CensorshipDetector { get; set; }

public ContainerBuilder ConfigureContainerBuilderFromApiWithBlockchain(ContainerBuilder builder)
{
ConfigureContainerBuilderFromApiWithStores(builder)
.AddPropertiesFrom<IApiWithBlockchain>(this)
.AddSingleton<INodeStorage>(NodeStorageFactory.WrapKeyValueStore(DbProvider!.StateDb));
if (TrieStore != null) builder.AddSingleton<IReadOnlyTrieStore>(TrieStore.AsReadOnly());

return builder;
}
}
}
38 changes: 23 additions & 15 deletions src/Nethermind/Nethermind.Api/IApiWithNetwork.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
// SPDX-License-Identifier: LGPL-3.0-only

using System.Collections.Generic;
using Autofac;
using Nethermind.Consensus;
using Nethermind.Core;
using Nethermind.Core.PubSub;
using Nethermind.Grpc;
using Nethermind.JsonRpc;
Expand All @@ -16,37 +18,43 @@
using Nethermind.Synchronization;
using Nethermind.Synchronization.Peers;
using Nethermind.Sockets;
using Nethermind.Synchronization.ParallelSync;

namespace Nethermind.Api
{
public interface IApiWithNetwork : IApiWithBlockchain
{
(IApiWithNetwork GetFromApi, IApiWithNetwork SetInApi) ForNetwork => (this, this);

IDisconnectsAnalyzer? DisconnectsAnalyzer { get; set; }
IDiscoveryApp? DiscoveryApp { get; set; }
IDiscoveryApp? DiscoveryApp { get; }
IGrpcServer? GrpcServer { get; set; }
IIPResolver? IpResolver { get; set; }
IMessageSerializationService MessageSerializationService { get; }
IGossipPolicy GossipPolicy { get; set; }
IMonitoringService MonitoringService { get; set; }
INodeStatsManager? NodeStatsManager { get; set; }
IPeerManager? PeerManager { get; set; }
IPeerPool? PeerPool { get; set; }
IProtocolsManager? ProtocolsManager { get; set; }
IProtocolValidator? ProtocolValidator { get; set; }
INodeStatsManager? NodeStatsManager { get; }
IPeerManager? PeerManager { get; }
IPeerPool? PeerPool { get; }
IList<IPublisher> Publishers { get; }
IRlpxHost? RlpxPeer { get; set; }
IRlpxHost? RlpxPeer { get; }
IRpcModuleProvider? RpcModuleProvider { get; set; }
IJsonRpcLocalStats? JsonRpcLocalStats { get; set; }
ISessionMonitor? SessionMonitor { get; set; }
IStaticNodesManager? StaticNodesManager { get; set; }
ISynchronizer? Synchronizer { get; set; }
IPivot? Pivot { get; set; }
ISyncPeerPool? SyncPeerPool { get; set; }
IPeerDifficultyRefreshPool? PeerDifficultyRefreshPool { get; set; }
ISyncServer? SyncServer { get; set; }
ISessionMonitor? SessionMonitor { get; }
IStaticNodesManager? StaticNodesManager { get; }
ISynchronizer? Synchronizer { get; }
ISyncModeSelector SyncModeSelector { get; }
ISyncPeerPool? SyncPeerPool { get; }
IPeerDifficultyRefreshPool? PeerDifficultyRefreshPool { get; }
ISyncServer? SyncServer { get; }
IWebSocketsManager WebSocketsManager { get; set; }
ISubscriptionFactory? SubscriptionFactory { get; set; }

IContainer? ApiWithNetworkServiceContainer { get; set; }

public ContainerBuilder ConfigureContainerBuilderFromApiWithNetwork(ContainerBuilder builder)
{
return ConfigureContainerBuilderFromApiWithBlockchain(builder)
.AddPropertiesFrom(this);
}
}
}
8 changes: 8 additions & 0 deletions src/Nethermind/Nethermind.Api/IApiWithStores.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using Autofac;
using Nethermind.Blockchain;
using Nethermind.Blockchain.Blocks;
using Nethermind.Blockchain.Find;
using Nethermind.Blockchain.Receipts;
using Nethermind.Consensus;
using Nethermind.Core;
using Nethermind.Crypto;
using Nethermind.Db.Blooms;
using Nethermind.State.Repositories;
Expand All @@ -29,5 +31,11 @@ public interface IApiWithStores : IBasicApi
IReceiptMonitor? ReceiptMonitor { get; set; }
IWallet? Wallet { get; set; }
IBlockStore? BadBlocksStore { get; set; }

public ContainerBuilder ConfigureContainerBuilderFromApiWithStores(ContainerBuilder builder)
{
return ConfigureContainerBuilderFromBasicApi(builder)
.AddPropertiesFrom<IApiWithStores>(this);
}
}
}
21 changes: 17 additions & 4 deletions src/Nethermind/Nethermind.Api/IBasicApi.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System;
using System.Collections.Generic;
using System.IO.Abstractions;
using System.Linq;
using Autofac;
using Nethermind.Abi;
using Nethermind.Api.Extensions;
using Nethermind.Blockchain.Synchronization;
using Nethermind.Config;
using Nethermind.Core;
using Nethermind.Core.Specs;
Expand All @@ -14,10 +17,10 @@
using Nethermind.Db;
using Nethermind.KeyStore;
using Nethermind.Logging;
using Nethermind.Network.Config;
using Nethermind.Serialization.Json;
using Nethermind.Specs.ChainSpecStyle;
using Nethermind.Synchronization;
using Nethermind.Synchronization.ParallelSync;

namespace Nethermind.Api
{
Expand All @@ -38,11 +41,10 @@ public interface IBasicApi
ILogManager LogManager { get; set; }
ProtectedPrivateKey? OriginalSignerKey { get; set; }
IReadOnlyList<INethermindPlugin> Plugins { get; }
[SkipServiceCollection]
string SealEngineType { get; set; }
ISpecProvider? SpecProvider { get; set; }
ISyncModeSelector SyncModeSelector { get; set; }
ISyncProgressResolver? SyncProgressResolver { get; set; }
IBetterPeerStrategy? BetterPeerStrategy { get; set; }
IBetterPeerStrategy? BetterPeerStrategy { get; }
ITimestamper Timestamper { get; }
ITimerFactory TimerFactory { get; }
IProcessExitSource? ProcessExit { get; set; }
Expand All @@ -57,5 +59,16 @@ public IEnumerable<IConsensusWrapperPlugin> GetConsensusWrapperPlugins() =>

public IEnumerable<ISynchronizationPlugin> GetSynchronizationPlugins() =>
Plugins.OfType<ISynchronizationPlugin>();

public ContainerBuilder ConfigureContainerBuilderFromBasicApi(ContainerBuilder builder)
{
builder.AddPropertiesFrom<IBasicApi>(this);
builder.Register<IEthereumEcdsa, IEcdsa>(ecdsa => ecdsa);
builder.RegisterSource(new ConfigRegistrationSource());

DbProvider!.ConfigureServiceCollection(builder);

return builder;
}
}
}
42 changes: 21 additions & 21 deletions src/Nethermind/Nethermind.Api/NethermindApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Collections.Generic;
using System.IO.Abstractions;
using Autofac;
using Nethermind.Abi;
using Nethermind.Api.Extensions;
using Nethermind.Blockchain;
Expand Down Expand Up @@ -126,8 +127,8 @@ public IBlockchainBridge CreateBlockchainBridge()
public ICryptoRandom CryptoRandom { get; }
public IDbProvider? DbProvider { get; set; }
public IDbFactory? DbFactory { get; set; }
public IDisconnectsAnalyzer? DisconnectsAnalyzer { get; set; }
public IDiscoveryApp? DiscoveryApp { get; set; }

public IDiscoveryApp? DiscoveryApp => ApiWithNetworkServiceContainer?.ResolveOptional<IDiscoveryApp>();
public ISigner? EngineSigner { get; set; }
public ISignerStore? EngineSignerStore { get; set; }
public IEnode? Enode { get; set; }
Expand All @@ -152,16 +153,14 @@ public IBlockchainBridge CreateBlockchainBridge()
public IMessageSerializationService MessageSerializationService { get; } = new MessageSerializationService();
public IGossipPolicy GossipPolicy { get; set; } = Policy.FullGossip;
public IMonitoringService MonitoringService { get; set; } = NullMonitoringService.Instance;
public INodeStatsManager? NodeStatsManager { get; set; }
public IPeerManager? PeerManager { get; set; }
public IPeerPool? PeerPool { get; set; }
public IProtocolsManager? ProtocolsManager { get; set; }
public IProtocolValidator? ProtocolValidator { get; set; }
public INodeStatsManager? NodeStatsManager => ApiWithNetworkServiceContainer?.ResolveOptional<INodeStatsManager>();
public IPeerManager? PeerManager => ApiWithNetworkServiceContainer?.ResolveOptional<IPeerManager>();
public IPeerPool? PeerPool => ApiWithNetworkServiceContainer?.ResolveOptional<IPeerPool>();
public IReceiptStorage? ReceiptStorage { get; set; }
public IReceiptFinder? ReceiptFinder { get; set; }
public IReceiptMonitor? ReceiptMonitor { get; set; }
public IRewardCalculatorSource? RewardCalculatorSource { get; set; } = NoBlockRewards.Instance;
public IRlpxHost? RlpxPeer { get; set; }
public IRlpxHost? RlpxPeer => ApiWithNetworkServiceContainer?.ResolveOptional<IRlpxHost>();
public IRpcModuleProvider? RpcModuleProvider { get; set; } = NullModuleProvider.Instance;
public IRpcAuthentication? RpcAuthentication { get; set; }
public IJsonRpcLocalStats? JsonRpcLocalStats { get; set; }
Expand All @@ -182,23 +181,22 @@ public ISealEngine SealEngine
}
}

public ISessionMonitor? SessionMonitor { get; set; }
public ISessionMonitor? SessionMonitor => ApiWithNetworkServiceContainer?.ResolveOptional<ISessionMonitor>();
public ISpecProvider? SpecProvider { get; set; }
public IPoSSwitcher PoSSwitcher { get; set; } = NoPoS.Instance;
public ISyncModeSelector SyncModeSelector { get; set; } = null!;

public ISyncProgressResolver? SyncProgressResolver { get; set; }
public IBetterPeerStrategy? BetterPeerStrategy { get; set; }
public IPivot? Pivot { get; set; }
public ISyncPeerPool? SyncPeerPool { get; set; }
public IPeerDifficultyRefreshPool? PeerDifficultyRefreshPool { get; set; }
public ISynchronizer? Synchronizer { get; set; }
public ISyncServer? SyncServer { get; set; }
public ISyncModeSelector SyncModeSelector => ApiWithNetworkServiceContainer?.ResolveOptional<ISyncModeSelector>()!;
public IBetterPeerStrategy? BetterPeerStrategy => ApiWithNetworkServiceContainer?.ResolveOptional<IBetterPeerStrategy>();
public ISyncPeerPool? SyncPeerPool => ApiWithNetworkServiceContainer?.ResolveOptional<ISyncPeerPool>();
public IPeerDifficultyRefreshPool? PeerDifficultyRefreshPool => ApiWithNetworkServiceContainer?.ResolveOptional<IPeerDifficultyRefreshPool>();
public ISynchronizer? Synchronizer => ApiWithNetworkServiceContainer?.ResolveOptional<ISynchronizer>();
public ISyncServer? SyncServer => ApiWithNetworkServiceContainer?.ResolveOptional<ISyncServer>();

[SkipServiceCollection]
public IWorldState? WorldState { get; set; }
public IReadOnlyStateProvider? ChainHeadStateProvider { get; set; }
public IWorldStateManager? WorldStateManager { get; set; }
public IStateReader? StateReader { get; set; }
public IStaticNodesManager? StaticNodesManager { get; set; }
public IStaticNodesManager? StaticNodesManager => ApiWithNetworkServiceContainer?.ResolveOptional<IStaticNodesManager>();
public ITimestamper Timestamper { get; } = Core.Timestamper.Default;
public ITimerFactory TimerFactory { get; } = Core.Timers.TimerFactory.Default;
public ITransactionProcessor? TransactionProcessor { get; set; }
Expand All @@ -216,10 +214,10 @@ public ISealEngine SealEngine
public IBlockProducerEnvFactory? BlockProducerEnvFactory { get; set; }
public IGasPriceOracle? GasPriceOracle { get; set; }

public IEthSyncingInfo? EthSyncingInfo { get; set; }
public IEthSyncingInfo? EthSyncingInfo => ApiWithNetworkServiceContainer?.ResolveOptional<IEthSyncingInfo>();
public IBlockProductionPolicy? BlockProductionPolicy { get; set; }
public INodeStorageFactory NodeStorageFactory { get; set; } = null!;
public BackgroundTaskScheduler BackgroundTaskScheduler { get; set; } = null!;
public IBackgroundTaskScheduler BackgroundTaskScheduler { get; set; } = null!;
public CensorshipDetector CensorshipDetector { get; set; } = null!;
public IWallet? Wallet { get; set; }
public IBlockStore? BadBlocksStore { get; set; }
Expand All @@ -241,5 +239,7 @@ public ISealEngine SealEngine
public CompositePruningTrigger PruningTrigger { get; } = new();
public IProcessExitSource? ProcessExit { get; set; }
public CompositeTxGossipPolicy TxGossipPolicy { get; } = new();

public IContainer? ApiWithNetworkServiceContainer { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -143,4 +143,7 @@ public interface ISyncConfig : IConfig

[ConfigItem(Description = "_Technical._ MultiSyncModeSelector sync mode timer loop interval. Used for testing.", DefaultValue = "1000", HiddenFromDocs = true)]
int MultiSyncModeSelectorLoopTimerMs { get; set; }

[ConfigItem(Description = "_Technical._ MultiSyncModeSelector will wait for header to completely sync first.", DefaultValue = "false", HiddenFromDocs = true)]
bool NeedToWaitForHeader { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ public string? PivotHash
public int MallocTrimIntervalSec { get; set; } = 300;
public bool? SnapServingEnabled { get; set; } = null;
public int MultiSyncModeSelectorLoopTimerMs { get; set; } = 1000;
public bool NeedToWaitForHeader { get; set; }
public bool TrieHealing { get; set; } = true;

public override string ToString()
Expand Down
51 changes: 51 additions & 0 deletions src/Nethermind/Nethermind.Config/ConfigRegistrationSource.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System;
using System.Collections.Generic;
using System.Linq;
using Autofac;
using Autofac.Core;
using Autofac.Core.Activators.Delegate;
using Autofac.Core.Lifetime;
using Autofac.Core.Registration;

namespace Nethermind.Config;

/// <summary>
/// Dynamically resolve IConfig<T>
/// </summary>
public class ConfigRegistrationSource : IRegistrationSource
{
public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<ServiceRegistration>> registrationAccessor)
{
IServiceWithType swt = service as IServiceWithType;
if (swt == null || !typeof(IConfig).IsAssignableFrom(swt.ServiceType))
{
// It's not a request for the base handler type, so skip it.
return Enumerable.Empty<IComponentRegistration>();
}

// Dynamically resolve IConfig
ComponentRegistration registration = new ComponentRegistration(
Guid.NewGuid(),
new DelegateActivator(swt.ServiceType, (c, p) =>
{
IConfigProvider configProvider = c.Resolve<IConfigProvider>();
object config = typeof(IConfigProvider)
.GetMethod("GetConfig")
.MakeGenericMethod(swt.ServiceType)
.Invoke(configProvider, new object[] { });
return config;
}),
new RootScopeLifetime(),
InstanceSharing.Shared,
InstanceOwnership.OwnedByLifetimeScope,
new[] { service },
new Dictionary<string, object>());

return new IComponentRegistration[] { registration };
}

public bool IsAdapterForIndividualComponents => false;
}
Loading