Program.cs
1 using BlockchainUtils; 2 using CodexContractsPlugin; 3 using CodexContractsPlugin.Marketplace; 4 using Core; 5 using GethPlugin; 6 using Logging; 7 using Utils; 8 9 namespace TraceContract 10 { 11 public class Program 12 { 13 public static void Main(string[] args) 14 { 15 ProjectPlugin.Load<GethPlugin.GethPlugin>(); 16 ProjectPlugin.Load<CodexContractsPlugin.CodexContractsPlugin>(); 17 18 var p = new Program(); 19 p.Run(); 20 } 21 22 private readonly ILog log = new ConsoleLog(); 23 private readonly Input input = new(); 24 private readonly Config config = new(); 25 private readonly Output output; 26 27 public Program() 28 { 29 output = new(log, input, config); 30 } 31 32 private void Run() 33 { 34 try 35 { 36 TracePurchase(); 37 } 38 catch (Exception exc) 39 { 40 log.Error(exc.ToString()); 41 } 42 } 43 44 private void TracePurchase() 45 { 46 Log("Setting up..."); 47 var entryPoint = new EntryPoint(log, new KubernetesWorkflow.Configuration(null, TimeSpan.FromMinutes(1.0), TimeSpan.FromSeconds(10.0), "_Unused!_"), Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); 48 entryPoint.Announce(); 49 var ci = entryPoint.CreateInterface(); 50 var geth = ConnectGethNode(); 51 var contracts = ConnectCodexContracts(ci, geth); 52 53 var chainTracer = new ChainTracer(log, geth, contracts, input, output); 54 var requestTimeRange = chainTracer.TraceChainTimeline(); 55 56 Log("Downloading storage nodes logs for the request timerange..."); 57 DownloadStorageNodeLogs(requestTimeRange, entryPoint.Tools); 58 59 output.ShowOutputFiles(log); 60 61 entryPoint.Decommission(false, false, false); 62 Log("Done"); 63 } 64 65 private IGethNode ConnectGethNode() 66 { 67 var account = EthAccountGenerator.GenerateNew(); 68 var blockCache = new BlockCache(); 69 return new CustomGethNode(log, blockCache, config.RpcEndpoint, config.GethPort, account.PrivateKey); 70 } 71 72 private ICodexContracts ConnectCodexContracts(CoreInterface ci, IGethNode geth) 73 { 74 var deployment = new CodexContractsDeployment( 75 config: new MarketplaceConfig(), 76 marketplaceAddress: config.MarketplaceAddress, 77 abi: config.Abi, 78 tokenAddress: config.TokenAddress 79 ); 80 return ci.WrapCodexContractsDeployment(geth, deployment); 81 } 82 83 private void DownloadStorageNodeLogs(TimeRange requestTimeRange, IPluginTools tools) 84 { 85 var start = requestTimeRange.From - config.LogStartBeforeStorageContractStarts; 86 87 foreach (var node in config.StorageNodesKubernetesPodNames) 88 { 89 Log($"Downloading logs from '{node}'..."); 90 91 var targetFile = output.CreateNodeLogTargetFile(node); 92 var downloader = new ElasticSearchLogDownloader(log, tools, config); 93 downloader.Download(targetFile, node, start, requestTimeRange.To); 94 } 95 } 96 97 private void Log(string msg) 98 { 99 log.Log(msg); 100 } 101 } 102 }