/ Tools / CodexNetDeployer / CodexNodeStarter.cs
CodexNodeStarter.cs
  1  using CodexClient;
  2  using CodexContractsPlugin;
  3  using CodexPlugin;
  4  using Core;
  5  using GethPlugin;
  6  using Utils;
  7  
  8  namespace CodexNetDeployer
  9  {
 10      public class CodexNodeStarter
 11      {
 12          private readonly Configuration config;
 13          private readonly CoreInterface ci;
 14          private readonly IGethNode gethNode;
 15          private readonly ICodexContracts contracts;
 16          private ICodexNode? bootstrapNode = null;
 17          private int validatorsLeft;
 18  
 19          public CodexNodeStarter(Configuration config, CoreInterface ci, IGethNode gethNode, ICodexContracts contracts, int numberOfValidators)
 20          {
 21              this.config = config;
 22              this.ci = ci;
 23              this.gethNode = gethNode;
 24              this.contracts = contracts;
 25              validatorsLeft = numberOfValidators;
 26          }
 27  
 28          public CodexNodeStartResult? Start(int i)
 29          {
 30              var name = GetCodexContainerName(i);
 31              Console.Write($" - {i} ({name})\t");
 32              Console.CursorLeft = 30;
 33  
 34              ICodexNode? codexNode = null;
 35              try
 36              {
 37                  codexNode = ci.StartCodexNode(s =>
 38                  {
 39                      s.WithName(name);
 40                      s.WithLogLevel(config.CodexLogLevel, new CodexLogCustomTopics(config.Discv5LogLevel, config.Libp2pLogLevel));
 41                      s.WithStorageQuota(config.StorageQuota!.Value.MB());
 42  
 43                      if (config.ShouldMakeStorageAvailable)
 44                      {
 45                          s.EnableMarketplace(gethNode, contracts, m =>
 46                          {
 47                              m.WithInitial(100.Eth(), config.InitialTestTokens.TstWei());
 48                              if (validatorsLeft > 0) m.AsValidator();
 49                              if (config.ShouldMakeStorageAvailable) m.AsStorageNode();
 50                          });
 51                      }
 52  
 53                      if (bootstrapNode != null) s.WithBootstrapNode(bootstrapNode);
 54                      if (config.MetricsEndpoints) s.EnableMetrics();
 55                      if (config.BlockTTL != Configuration.SecondsIn1Day) s.WithBlockTTL(TimeSpan.FromSeconds(config.BlockTTL));
 56                      if (config.BlockMI != Configuration.TenMinutes) s.WithBlockMaintenanceInterval(TimeSpan.FromSeconds(config.BlockMI));
 57                      if (config.BlockMN != 1000) s.WithBlockMaintenanceNumber(config.BlockMN);
 58  
 59                      if (config.IsPublicTestNet)
 60                      {
 61                          s.AsPublicTestNet(CreatePublicTestNetConfig(i));
 62                      }
 63                  });
 64              
 65                  var debugInfo = codexNode.GetDebugInfo();
 66                  if (!string.IsNullOrWhiteSpace(debugInfo.Spr))
 67                  {
 68                      Console.Write("Online\t");
 69  
 70                      if (config.ShouldMakeStorageAvailable)
 71                      {
 72                          var availability = new CreateStorageAvailability(
 73                              totalSpace: config.StorageSell!.Value.MB(),
 74                              maxDuration: TimeSpan.FromSeconds(config.MaxDuration),
 75                              minPricePerBytePerSecond: config.MinPricePerBytePerSecond.TstWei(),
 76                              totalCollateral: config.MaxCollateral.TstWei()
 77                          );
 78  
 79                          var response = codexNode.Marketplace.MakeStorageAvailable(availability);
 80  
 81                          if (!string.IsNullOrEmpty(response))
 82                          {
 83                              Console.Write("Storage available\t");
 84                          }
 85                          else throw new Exception("Failed to make storage available.");
 86                      }
 87                      
 88                      Console.Write("OK" + Environment.NewLine);
 89  
 90                      validatorsLeft--;
 91                      if (bootstrapNode == null) bootstrapNode = codexNode;
 92                      return new CodexNodeStartResult(codexNode);
 93                  }
 94              }
 95              catch (Exception ex)
 96              {
 97                  Console.WriteLine("Exception:" + ex.ToString());
 98              }
 99  
100              Console.WriteLine("Unknown failure.");
101              if (codexNode != null)
102              {
103                  Console.WriteLine("Downloading container log.");
104                  codexNode.DownloadLog();
105              }
106  
107              return null;
108          }
109  
110          private CodexTestNetConfig CreatePublicTestNetConfig(int i)
111          {
112              var discPort = config.PublicDiscPorts.Split(",")[i];
113              var listenPort = config.PublicListenPorts.Split(",")[i];
114  
115              return new CodexTestNetConfig
116              {
117                  PublicDiscoveryPort = Convert.ToInt32(discPort),
118                  PublicListenPort = Convert.ToInt32(listenPort)
119              };
120          }
121  
122          private string GetCodexContainerName(int i)
123          {
124              if (i == 0) return "BOOTSTRAP";
125              return "CODEX" + i;
126          }
127      }
128  
129      public class CodexNodeStartResult
130      {
131          public CodexNodeStartResult(ICodexNode codexNode)
132          {
133              CodexNode = codexNode;
134          }
135  
136          public ICodexNode CodexNode { get; }
137      }
138  }