Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
79 changes: 79 additions & 0 deletions src/Blockcore.sln
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,32 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenExo", "OpenExo", "{4B08
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenExo.Node", "Networks\OpenExo\OpenExo.Node\OpenExo.Node.csproj", "{AAB36899-879B-4098-9060-E69240AB7150}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Persistence", "Persistence", "{64694A14-97E0-4CBC-8032-754F9353B2DD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blockcore.Features.BlockStore.Persistence.LevelDb", "Features\Persistence\Blockcore.Features.BlockStore.Persistence.LevelDb\Blockcore.Features.BlockStore.Persistence.LevelDb.csproj", "{AB9A2812-610D-4061-BE71-784AB39FE415}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blockcore.Features.Consensus.Persistence.LevelDb", "Features\Persistence\Blockcore.Features.Consensus.Persistence.LevelDb\Blockcore.Features.Consensus.Persistence.LevelDb.csproj", "{E4C7723E-F2D1-41A3-A22A-3D5CB3AE6D6C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blockcore.Persistence.LevelDb", "Features\Persistence\Blockcore.Persistence.LevelDb\Blockcore.Persistence.LevelDb.csproj", "{7760BAD0-B57D-4A57-95DB-A5C53EED5D54}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blockcore.Features.Base.Persistence.LevelDb", "Features\Persistence\Blockcore.Features.Base.Persistence.LevelDb\Blockcore.Features.Base.Persistence.LevelDb.csproj", "{5A2AC2B6-0541-4AD2-9BCE-09829C71B3E1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LevelDb", "LevelDb", "{640B1C2A-2346-40E6-9755-87B7EB2B3428}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RocksDb", "RocksDb", "{2A20F4A8-01E8-4C44-A394-65C2DE6FBF28}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blockcore.Persistence.RocksDb", "Features\Persistence\Blockcore.Persistence.RocksDb\Blockcore.Persistence.RocksDb.csproj", "{7785B6F6-62B3-47D2-8A16-1B92BB993797}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blockcore.Features.Base.Persistence.RocksDb", "Features\Persistence\Blockcore.Features.Base.Persistence.RocksDb\Blockcore.Features.Base.Persistence.RocksDb.csproj", "{9E72A554-24DD-4AEE-BFC7-FB844F055BE6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blockcore.Features.BlockStore.Persistence.RocksDb", "Features\Persistence\Blockcore.Features.BlockStore.Persistence.RocksDb\Blockcore.Features.BlockStore.Persistence.RocksDb.csproj", "{1F1C53EC-AAA1-4028-8CDA-4DF1ED4AF516}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blockcore.Features.Consensus.Persistence.RocksDb", "Features\Persistence\Blockcore.Features.Consensus.Persistence.RocksDb\Blockcore.Features.Consensus.Persistence.RocksDb.csproj", "{BC0A50DF-0816-4613-B6B1-D1FEC384DFAE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blockcore.Features.Persistence.Rocksdb.CorePackage", "Features\Persistence\Blockcore.Features.Persistence.Rocksdb.CorePackage\Blockcore.Features.Persistence.Rocksdb.CorePackage.csproj", "{8098D7F8-8B2F-451C-8DCB-90597B768F96}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blockcore.Features.Persistence.LevelDb.CorePackage", "Features\Persistence\Blockcore.Features.Persistence.LevelDb.CorePackage\Blockcore.Features.Persistence.LevelDb.CorePackage.csproj", "{4275AF0C-587B-4C9D-A100-0F2DD1702674}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -337,6 +363,46 @@ Global
{AAB36899-879B-4098-9060-E69240AB7150}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AAB36899-879B-4098-9060-E69240AB7150}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AAB36899-879B-4098-9060-E69240AB7150}.Release|Any CPU.Build.0 = Release|Any CPU
{AB9A2812-610D-4061-BE71-784AB39FE415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB9A2812-610D-4061-BE71-784AB39FE415}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB9A2812-610D-4061-BE71-784AB39FE415}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB9A2812-610D-4061-BE71-784AB39FE415}.Release|Any CPU.Build.0 = Release|Any CPU
{E4C7723E-F2D1-41A3-A22A-3D5CB3AE6D6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4C7723E-F2D1-41A3-A22A-3D5CB3AE6D6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E4C7723E-F2D1-41A3-A22A-3D5CB3AE6D6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E4C7723E-F2D1-41A3-A22A-3D5CB3AE6D6C}.Release|Any CPU.Build.0 = Release|Any CPU
{7760BAD0-B57D-4A57-95DB-A5C53EED5D54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7760BAD0-B57D-4A57-95DB-A5C53EED5D54}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7760BAD0-B57D-4A57-95DB-A5C53EED5D54}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7760BAD0-B57D-4A57-95DB-A5C53EED5D54}.Release|Any CPU.Build.0 = Release|Any CPU
{5A2AC2B6-0541-4AD2-9BCE-09829C71B3E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5A2AC2B6-0541-4AD2-9BCE-09829C71B3E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5A2AC2B6-0541-4AD2-9BCE-09829C71B3E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5A2AC2B6-0541-4AD2-9BCE-09829C71B3E1}.Release|Any CPU.Build.0 = Release|Any CPU
{7785B6F6-62B3-47D2-8A16-1B92BB993797}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7785B6F6-62B3-47D2-8A16-1B92BB993797}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7785B6F6-62B3-47D2-8A16-1B92BB993797}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7785B6F6-62B3-47D2-8A16-1B92BB993797}.Release|Any CPU.Build.0 = Release|Any CPU
{9E72A554-24DD-4AEE-BFC7-FB844F055BE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9E72A554-24DD-4AEE-BFC7-FB844F055BE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9E72A554-24DD-4AEE-BFC7-FB844F055BE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9E72A554-24DD-4AEE-BFC7-FB844F055BE6}.Release|Any CPU.Build.0 = Release|Any CPU
{1F1C53EC-AAA1-4028-8CDA-4DF1ED4AF516}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F1C53EC-AAA1-4028-8CDA-4DF1ED4AF516}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F1C53EC-AAA1-4028-8CDA-4DF1ED4AF516}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F1C53EC-AAA1-4028-8CDA-4DF1ED4AF516}.Release|Any CPU.Build.0 = Release|Any CPU
{BC0A50DF-0816-4613-B6B1-D1FEC384DFAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BC0A50DF-0816-4613-B6B1-D1FEC384DFAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BC0A50DF-0816-4613-B6B1-D1FEC384DFAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BC0A50DF-0816-4613-B6B1-D1FEC384DFAE}.Release|Any CPU.Build.0 = Release|Any CPU
{8098D7F8-8B2F-451C-8DCB-90597B768F96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8098D7F8-8B2F-451C-8DCB-90597B768F96}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8098D7F8-8B2F-451C-8DCB-90597B768F96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8098D7F8-8B2F-451C-8DCB-90597B768F96}.Release|Any CPU.Build.0 = Release|Any CPU
{4275AF0C-587B-4C9D-A100-0F2DD1702674}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4275AF0C-587B-4C9D-A100-0F2DD1702674}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4275AF0C-587B-4C9D-A100-0F2DD1702674}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4275AF0C-587B-4C9D-A100-0F2DD1702674}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -397,6 +463,19 @@ Global
{4F3C67B3-D96D-46A6-9BBC-19EB0A1A8712} = {4B0889C8-78BE-41C2-BB7B-7E82B3B83753}
{4B0889C8-78BE-41C2-BB7B-7E82B3B83753} = {3B56C02B-4468-4268-B797-851562789FCC}
{AAB36899-879B-4098-9060-E69240AB7150} = {4B0889C8-78BE-41C2-BB7B-7E82B3B83753}
{64694A14-97E0-4CBC-8032-754F9353B2DD} = {15D29FFD-6142-4DC5-AFFD-10BA0CA55C45}
{AB9A2812-610D-4061-BE71-784AB39FE415} = {640B1C2A-2346-40E6-9755-87B7EB2B3428}
{E4C7723E-F2D1-41A3-A22A-3D5CB3AE6D6C} = {640B1C2A-2346-40E6-9755-87B7EB2B3428}
{7760BAD0-B57D-4A57-95DB-A5C53EED5D54} = {640B1C2A-2346-40E6-9755-87B7EB2B3428}
{5A2AC2B6-0541-4AD2-9BCE-09829C71B3E1} = {640B1C2A-2346-40E6-9755-87B7EB2B3428}
{640B1C2A-2346-40E6-9755-87B7EB2B3428} = {64694A14-97E0-4CBC-8032-754F9353B2DD}
{2A20F4A8-01E8-4C44-A394-65C2DE6FBF28} = {64694A14-97E0-4CBC-8032-754F9353B2DD}
{7785B6F6-62B3-47D2-8A16-1B92BB993797} = {2A20F4A8-01E8-4C44-A394-65C2DE6FBF28}
{9E72A554-24DD-4AEE-BFC7-FB844F055BE6} = {2A20F4A8-01E8-4C44-A394-65C2DE6FBF28}
{1F1C53EC-AAA1-4028-8CDA-4DF1ED4AF516} = {2A20F4A8-01E8-4C44-A394-65C2DE6FBF28}
{BC0A50DF-0816-4613-B6B1-D1FEC384DFAE} = {2A20F4A8-01E8-4C44-A394-65C2DE6FBF28}
{8098D7F8-8B2F-451C-8DCB-90597B768F96} = {64694A14-97E0-4CBC-8032-754F9353B2DD}
{4275AF0C-587B-4C9D-A100-0F2DD1702674} = {64694A14-97E0-4CBC-8032-754F9353B2DD}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6C780ABA-5872-4B83-AD3F-A5BD423AD907}
Expand Down
21 changes: 2 additions & 19 deletions src/Blockcore/Base/BaseFeature.cs
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,8 @@ public static IFullNodeBuilder UseBaseFeature(this IFullNodeBuilder fullNodeBuil
.AddFeature<BaseFeature>()
.FeatureServices(services =>
{
fullNodeBuilder.PersistenceProviderManager.RequirePersistence<BaseFeature>(services);

services.AddSingleton(fullNodeBuilder.Network.Consensus.ConsensusFactory);
services.AddSingleton<DataStoreSerializer>();
services.AddSingleton(fullNodeBuilder.NodeSettings.LoggerFactory);
Expand All @@ -400,7 +402,6 @@ public static IFullNodeBuilder UseBaseFeature(this IFullNodeBuilder fullNodeBuil
services.AddSingleton<IInvalidBlockHashStore, InvalidBlockHashStore>();
services.AddSingleton<IChainState, ChainState>();
services.AddSingleton<IChainRepository, ChainRepository>();
AddDbImplementation(services, fullNodeBuilder.NodeSettings);
services.AddSingleton<IFinalizedBlockInfoRepository, FinalizedBlockInfoRepository>();
services.AddSingleton<ITimeSyncBehaviorState, TimeSyncBehaviorState>();
services.AddSingleton<NodeDeployments>();
Expand Down Expand Up @@ -486,23 +487,5 @@ public static IFullNodeBuilder UseBaseFeature(this IFullNodeBuilder fullNodeBuil

return fullNodeBuilder;
}

private static void AddDbImplementation(IServiceCollection services, NodeSettings settings)
{
if (settings.DbType == DbType.Leveldb)
{
services.AddSingleton<IChainStore, LeveldbChainStore>();
services.AddSingleton<IKeyValueRepository, LeveldbKeyValueRepository>();

return;
}

if (settings.DbType == DbType.Rocksdb)
{
services.AddSingleton<IChainStore, RocksdbChainStore>();
services.AddSingleton<IKeyValueRepository, RocksdbKeyValueRepository>();
return;
}
}
}
}
3 changes: 0 additions & 3 deletions src/Blockcore/Blockcore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,7 @@
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.4" />
<PackageReference Include="LevelDB.Standard" Version="2.1.6.1" />
<PackageReference Include="NStratis.HashLib" Version="1.0.0.1" />
<PackageReference Include="RocksDbNative" Version="6.2.2" />
<PackageReference Include="RocksDbSharp" Version="6.2.2" />
</ItemGroup>

<ItemGroup>
Expand Down
35 changes: 26 additions & 9 deletions src/Blockcore/Builder/FullNodeBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
using Blockcore.Builder.Feature;
using Blockcore.Configuration;
using Blockcore.Networks;
using Blockcore.Persistence;
using Blockcore.Utilities;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NBitcoin;

namespace Blockcore.Builder
{
Expand Down Expand Up @@ -51,6 +51,9 @@ public class FullNodeBuilder : IFullNodeBuilder
/// <inheritdoc />
public NodeSettings NodeSettings { get; set; }

/// <inheritdoc />
public IPersistenceProviderManager PersistenceProviderManager { get; set; }

/// <inheritdoc />
public Network Network { get; set; }

Expand All @@ -64,19 +67,23 @@ public FullNodeBuilder() :
this(new List<Action<IServiceCollection>>(),
new List<Action<IServiceProvider>>(),
new List<Action<IFeatureCollection>>(),
new FeatureCollection())
new FeatureCollection(),
null)
{
}

/// <summary>
/// Initializes an instance of the object using specific NodeSettings instance and registers required services.
/// </summary>
/// <param name="nodeSettings">User defined node settings.</param>
public FullNodeBuilder(NodeSettings nodeSettings)
/// <param name="persistenceProviderManager">Persistence Provider Manager that will help registering needed persistence services.</param>
public FullNodeBuilder(NodeSettings nodeSettings, IPersistenceProviderManager persistenceProviderManager)
: this(nodeSettings, new List<Action<IServiceCollection>>(),
new List<Action<IServiceProvider>>(),
new List<Action<IFeatureCollection>>(),
new FeatureCollection())
new FeatureCollection(),
persistenceProviderManager
)
{
}

Expand All @@ -88,9 +95,10 @@ public FullNodeBuilder(NodeSettings nodeSettings)
/// <param name="configureDelegates">List of delegates that configure the service providers.</param>
/// <param name="featuresRegistrationDelegates">List of delegates that add features to the collection.</param>
/// <param name="features">Collection of features to be available to and/or used by the node.</param>
/// <param name="persistenceProviderManager">Persistence Provider Manager that will help registering needed persistence services.</param>
internal FullNodeBuilder(NodeSettings nodeSettings, List<Action<IServiceCollection>> configureServicesDelegates, List<Action<IServiceProvider>> configureDelegates,
List<Action<IFeatureCollection>> featuresRegistrationDelegates, IFeatureCollection features)
: this(configureServicesDelegates, configureDelegates, featuresRegistrationDelegates, features)
List<Action<IFeatureCollection>> featuresRegistrationDelegates, IFeatureCollection features, IPersistenceProviderManager persistenceProviderManager)
: this(configureServicesDelegates, configureDelegates, featuresRegistrationDelegates, features, persistenceProviderManager)
{
Guard.NotNull(nodeSettings, nameof(nodeSettings));

Expand All @@ -113,8 +121,9 @@ internal FullNodeBuilder(NodeSettings nodeSettings, List<Action<IServiceCollecti
/// <param name="configureDelegates">List of delegates that configure the service providers.</param>
/// <param name="featuresRegistrationDelegates">List of delegates that add features to the collection.</param>
/// <param name="features">Collection of features to be available to and/or used by the node.</param>
/// <param name="persistenceProviderManager">Persistence Provider Manager that will help registering needed persistence services.</param>
internal FullNodeBuilder(List<Action<IServiceCollection>> configureServicesDelegates, List<Action<IServiceProvider>> configureDelegates,
List<Action<IFeatureCollection>> featuresRegistrationDelegates, IFeatureCollection features)
List<Action<IFeatureCollection>> featuresRegistrationDelegates, IFeatureCollection features, IPersistenceProviderManager persistenceProviderManager)
{
Guard.NotNull(configureServicesDelegates, nameof(configureServicesDelegates));
Guard.NotNull(configureDelegates, nameof(configureDelegates));
Expand All @@ -125,6 +134,7 @@ internal FullNodeBuilder(List<Action<IServiceCollection>> configureServicesDeleg
this.configureDelegates = configureDelegates;
this.featuresRegistrationDelegates = featuresRegistrationDelegates;
this.Features = features;
this.PersistenceProviderManager = persistenceProviderManager;
}

/// <inheritdoc />
Expand Down Expand Up @@ -166,7 +176,7 @@ public IFullNode Build()
// Print command-line help
if (this.NodeSettings?.PrintHelpAndExit ?? false)
{
NodeSettings.PrintHelp(this.Network);
NodeSettings.PrintHelp(this.Network, this);

foreach (IFeatureRegistration featureRegistration in this.Features.FeatureRegistrations)
{
Expand All @@ -180,7 +190,7 @@ public IFullNode Build()
}

// Create configuration file if required
this.NodeSettings?.CreateDefaultConfigurationFile(this.Features.FeatureRegistrations);
this.NodeSettings?.CreateDefaultConfigurationFile(this.Features.FeatureRegistrations, this);

ServiceProvider fullNodeServiceProvider = this.Services.BuildServiceProvider();
this.ConfigureServices(fullNodeServiceProvider);
Expand Down Expand Up @@ -213,6 +223,13 @@ private IServiceCollection BuildServices()
{
this.Services = new ServiceCollection();

// If no persistence provider has been set yet, create a default one
if (this.PersistenceProviderManager == null)
{
this.PersistenceProviderManager = new PersistenceProviderManager(this.NodeSettings);
}
this.PersistenceProviderManager.Initialize();

// register services before features
// as some of the features may depend on independent services
foreach (Action<IServiceCollection> configureServices in this.configureServicesDelegates)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using Blockcore.Persistence;

namespace Blockcore.Builder
{
/// <summary>
/// A class providing extension methods for <see cref="IFullNodeBuilder"/>.
/// </summary>
public static class FullNodeBuilderIPersistenceProviderManagerExtension
{
/// <summary>
/// Makes the full node builder use specific node settings.
/// </summary>
/// <param name="builder">Full node builder to which inject persistence provider manager.</param>
/// <param name="persistenceProviderManager">The persistence provider manager to use to.</param>
/// <returns>Interface to allow fluent code.</returns>
public static IFullNodeBuilder UsePersistenceProviderMananger(this IFullNodeBuilder builder, IPersistenceProviderManager persistenceProviderManager)
{
var nodeBuilder = builder as FullNodeBuilder;
nodeBuilder.PersistenceProviderManager = persistenceProviderManager;

return builder;
}
}
}
5 changes: 4 additions & 1 deletion src/Blockcore/Builder/IFullNodeBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
using Blockcore.Builder.Feature;
using Blockcore.Configuration;
using Blockcore.Networks;
using Blockcore.Persistence;
using Microsoft.Extensions.DependencyInjection;
using NBitcoin;

namespace Blockcore.Builder
{
Expand All @@ -15,6 +15,9 @@ public interface IFullNodeBuilder
/// <summary>User defined node settings.</summary>
NodeSettings NodeSettings { get; }

/// <summary>Allows to require implementation of the persistence layer they need.</summary>
IPersistenceProviderManager PersistenceProviderManager { get; }

/// <summary>Specification of the network the node runs on - regtest/testnet/mainnet.</summary>
Network Network { get; }

Expand Down
Loading