/// <summary> /// Builds a node with basic services and RPC enabled. /// </summary> /// <param name="dir">Data directory that the node should use.</param> /// <returns>Interface to the newly built node.</returns> public IFullNode BuildServicedNode(string dir) { NodeSettings nodeSettings = new NodeSettings(args: new string[] { $"-datadir={dir}" }); var fullNodeBuilder = new FullNodeBuilder(nodeSettings); IFullNode fullNode = fullNodeBuilder .UsePowConsensus() .UseBlockStore() .UseMempool() .AddRPC() .Build(); return(fullNode); }
private static NodeHostSettings FullNodeSetup(NodeSettings nodeSettings) { IFullNodeBuilder node = new FullNodeBuilder() .UsePersistenceProviderMananger(new TestPersistenceProviderManager(nodeSettings)) .UseNodeSettings(nodeSettings) .UseNodeHost(); if (nodeSettings.Network.Consensus.IsProofOfStake) { node.UsePosConsensus(); } else { node.UsePowConsensus(); } return(node.Build() .NodeService <NodeHostSettings>()); }
public void CanHaveAllFullnodeServicesTest() { // This test is put in the mempool feature because the // mempool requires all the features to be a fullnode NodeSettings nodeSettings = new NodeSettings(args: new string[] { $"-datadir=Stratis.Bitcoin.Features.MemoryPool.Tests/TestData/FullNodeBuilderTest/CanHaveAllServicesTest" }); var fullNodeBuilder = new FullNodeBuilder(nodeSettings); IFullNode fullNode = fullNodeBuilder .UsePowConsensus() .UseBlockStore() .UseMempool() .Build(); IServiceProvider serviceProvider = fullNode.Services.ServiceProvider; var network = serviceProvider.GetService <Network>(); var settings = serviceProvider.GetService <NodeSettings>(); var consensusLoop = serviceProvider.GetService <IConsensusLoop>() as ConsensusLoop; var chain = serviceProvider.GetService <NBitcoin.ConcurrentChain>(); var chainState = serviceProvider.GetService <IChainState>() as ChainState; var blockStoreManager = serviceProvider.GetService <BlockStoreManager>(); var consensusRules = serviceProvider.GetService <IConsensusRules>(); consensusRules.Register(serviceProvider.GetService <IRuleRegistration>()); var mempoolManager = serviceProvider.GetService <MempoolManager>(); var connectionManager = serviceProvider.GetService <IConnectionManager>() as ConnectionManager; Assert.NotNull(fullNode); Assert.NotNull(network); Assert.NotNull(settings); Assert.NotNull(consensusLoop); Assert.NotNull(chain); Assert.NotNull(chainState); Assert.NotNull(blockStoreManager); Assert.NotNull(mempoolManager); Assert.NotNull(connectionManager); }
public void CanHaveAllFullnodeServicesTest() { // This test is put in the mempool feature because the // mempool requires all the features to be a fullnode var nodeSettings = NodeSettings.Default(); nodeSettings.DataDir = "Xels.Bitcoin.Features.MemoryPool.Tests/TestData/FullNodeBuilderTest/CanHaveAllServicesTest"; var fullNodeBuilder = new FullNodeBuilder(nodeSettings); IFullNode fullNode = fullNodeBuilder .UsePowConsensus() .UseBlockStore() .UseMempool() .Build(); IServiceProvider serviceProvider = fullNode.Services.ServiceProvider; var network = serviceProvider.GetService <Network>(); var settings = serviceProvider.GetService <NodeSettings>(); var consensusLoop = serviceProvider.GetService <IConsensusLoop>() as ConsensusLoop; var consensus = serviceProvider.GetService <IPowConsensusValidator>() as PowConsensusValidator; var chain = serviceProvider.GetService <NBitcoin.ConcurrentChain>(); var chainState = serviceProvider.GetService <IChainState>() as ChainState; var blockStoreManager = serviceProvider.GetService <BlockStoreManager>(); var mempoolManager = serviceProvider.GetService <MempoolManager>(); var connectionManager = serviceProvider.GetService <IConnectionManager>() as ConnectionManager; Assert.NotNull(fullNode); Assert.NotNull(network); Assert.NotNull(settings); Assert.NotNull(consensusLoop); Assert.NotNull(consensus); Assert.NotNull(chain); Assert.NotNull(chainState); Assert.NotNull(blockStoreManager); Assert.NotNull(mempoolManager); Assert.NotNull(connectionManager); }
public static async Task MainAsync(string[] args) { try { var isTestNet = args.Contains("-testnet"); var isStratis = args.Contains("stratis"); var agent = "Breeze"; // This setting is not in NodeSettings yet, so get it directly from the args ConfigurationOptionWrapper <string> registrationStoreDirectory = new ConfigurationOptionWrapper <string>("RegistrationStoreDirectory", args.GetValueOf("-storedir")); ConfigurationOptionWrapper <string>[] configurationOptions = { registrationStoreDirectory }; NodeSettings nodeSettings; if (isStratis) { //if (NodeSettings.PrintHelp(args, Network.StratisMain)) // return; Network network = isTestNet ? Network.StratisTest : Network.StratisMain; if (isTestNet) { args = args.Append("-addnode=51.141.28.47").ToArray(); // TODO: fix this temp hack } nodeSettings = new NodeSettings(network, ProtocolVersion.ALT_PROTOCOL_VERSION, agent, args: args, loadConfiguration: false); } else { nodeSettings = new NodeSettings(agent: agent, args: args, loadConfiguration: false); } IFullNodeBuilder fullNodeBuilder = null; if (args.Contains("light")) { fullNodeBuilder = new FullNodeBuilder() .UseNodeSettings(nodeSettings) .UseLightWallet() .UseWatchOnlyWallet() .UseBlockNotification() .UseTransactionNotification() .UseApi(); } else { fullNodeBuilder = new FullNodeBuilder() .UseNodeSettings(nodeSettings); if (args.Contains("stratis")) { fullNodeBuilder.UsePosConsensus(); } else { fullNodeBuilder.UsePowConsensus(); } fullNodeBuilder.UseBlockStore() .UseMempool() .UseBlockNotification() .UseTransactionNotification() .UseWallet() .UseWatchOnlyWallet(); if (args.Contains("stratis")) { fullNodeBuilder.AddPowPosMining(); } else { fullNodeBuilder.AddMining(); } fullNodeBuilder.AddRPC() .UseApi(); } if (args.Contains("registration")) { //fullNodeBuilder.UseInterNodeCommunication(); fullNodeBuilder.UseRegistration(); } // Need this to happen for both TB and non-TB daemon Logs.Configure(new FuncLoggerFactory(i => new DualLogger(i, (a, b) => true, false))); // Start NTumbleBit logging to the console SetupTumbleBitConsoleLogs(nodeSettings); // Currently TumbleBit is bitcoin only if (args.Contains("-tumblebit")) { // We no longer pass the URI in via the command line, the registration feature selects a random one fullNodeBuilder.UseTumbleBit(configurationOptions); } IFullNode node = fullNodeBuilder.Build(); // Add logging to NLog SetupTumbleBitNLogs(nodeSettings); // Start Full Node - this will also start the API. await node.RunAsync(); } catch (Exception ex) { Console.WriteLine("There was a problem initializing the node. Details: '{0}'", ex.Message); } }
public static async Task MainAsync(string[] args) { try { var comparer = new CommandlineArgumentComparer(); var isRegTest = args.Contains("regtest", comparer); var isTestNet = args.Contains("testnet", comparer); var isStratis = args.Contains("stratis", comparer); var isLight = args.Contains("light", comparer); var useRegistration = args.Contains("registration", comparer); var useTumblebit = args.Contains("tumblebit", comparer); var useTor = !args.Contains("noTor", comparer); string registrationStoreDirectoryPath = args.GetValueOf("-storedir"); TumblerProtocolType tumblerProtocol; try { string tumblerProtocolString = args.GetValueOf("-tumblerProtocol"); if (!isRegTest && (tumblerProtocolString != null || !useTor)) { Console.WriteLine("Options -TumblerProtocol and -NoTor can only be used in combination with -RegTest switch."); return; } if (tumblerProtocolString != null) { tumblerProtocol = Enum.Parse <TumblerProtocolType>(tumblerProtocolString, true); } else { tumblerProtocol = TumblerProtocolType.Tcp; } if (useTor && tumblerProtocol == TumblerProtocolType.Http) { Console.WriteLine("TumblerProtocol can only be changed to Http when Tor is disabled. Please use -NoTor switch to disable Tor."); return; } } catch { Console.WriteLine($"Incorrect tumbling prococol specified; the valid values are {TumblerProtocolType.Tcp} and {TumblerProtocolType.Http}"); return; } var agent = "Breeze"; NodeSettings nodeSettings; if (isStratis) { //if (NodeSettings.PrintHelp(args, Network.StratisMain)) // return; Network network; if (isRegTest) { network = Network.StratisRegTest; } else if (isTestNet) { args = args.Append("-addnode=51.141.28.47").ToArray(); // TODO: fix this temp hack network = Network.StratisTest; } else { network = Network.StratisMain; } nodeSettings = new NodeSettings(network, ProtocolVersion.ALT_PROTOCOL_VERSION, agent, args: args, loadConfiguration: false); } else { nodeSettings = new NodeSettings(agent: agent, args: args, loadConfiguration: false); } IFullNodeBuilder fullNodeBuilder = null; if (isLight) { fullNodeBuilder = new FullNodeBuilder() .UseNodeSettings(nodeSettings) .UseLightWallet() .UseWatchOnlyWallet() .UseBlockNotification() .UseTransactionNotification() .UseApi(); } else { fullNodeBuilder = new FullNodeBuilder() .UseNodeSettings(nodeSettings); if (isStratis) { fullNodeBuilder.UsePosConsensus(); } else { fullNodeBuilder.UsePowConsensus(); } fullNodeBuilder.UseBlockStore() .UseMempool() .UseBlockNotification() .UseTransactionNotification() .UseWallet() .UseWatchOnlyWallet(); if (isStratis) { fullNodeBuilder.AddPowPosMining(); } else { fullNodeBuilder.AddMining(); } fullNodeBuilder.AddRPC() .UseApi(); } if (useRegistration) { //fullNodeBuilder.UseInterNodeCommunication(); fullNodeBuilder.UseRegistration(); } // Need this to happen for both TB and non-TB daemon string dataDir = nodeSettings.DataDir; if (string.IsNullOrEmpty(dataDir)) { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { dataDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StratisNode"); } else { dataDir = Path.Combine(Environment.GetEnvironmentVariable("HOME"), ".stratisnode"); } } string logDir = Path.Combine(dataDir, nodeSettings.Network.RootFolderName, nodeSettings.Network.Name, "Logs"); Logs.Configure(new FuncLoggerFactory(i => new DualLogger(i, (a, b) => true, false)), logDir); // Start NTumbleBit logging to the console SetupTumbleBitConsoleLogs(nodeSettings); // Currently TumbleBit is bitcoin only if (useTumblebit) { if (string.IsNullOrEmpty(registrationStoreDirectoryPath)) { string networkName; if (isRegTest) { networkName = "StratisRegTest"; } else if (isTestNet) { networkName = "StratisTest"; } else { networkName = "StratisMain"; } registrationStoreDirectoryPath = Path.Combine(dataDir, "stratis", networkName, "registrationHistory.json"); } // Those settings are not in NodeSettings yet, so get it directly from the args ConfigurationOptionWrapper <object> registrationStoreDirectory = new ConfigurationOptionWrapper <object>("RegistrationStoreDirectory", registrationStoreDirectoryPath); ConfigurationOptionWrapper <object> torOption = new ConfigurationOptionWrapper <object>("Tor", useTor); ConfigurationOptionWrapper <object> tumblerProtocolOption = new ConfigurationOptionWrapper <object>("TumblerProtocol", tumblerProtocol); ConfigurationOptionWrapper <object> useDummyAddressOption = new ConfigurationOptionWrapper <object>("UseDummyAddress", true); ConfigurationOptionWrapper <object>[] tumblebitConfigurationOptions = { registrationStoreDirectory, torOption, tumblerProtocolOption, useDummyAddressOption }; // We no longer pass the URI in via the command line, the registration feature selects a random one fullNodeBuilder.UseTumbleBit(tumblebitConfigurationOptions); } IFullNode node = fullNodeBuilder.Build(); // Add logging to NLog SetupTumbleBitNLogs(nodeSettings); // Start Full Node - this will also start the API. await node.RunAsync(); } catch (Exception ex) { Console.WriteLine("There was a problem initializing the node. Details: '{0}'", ex.Message); } }