public static async Task <TumblerClientRuntime> FromConfigurationAsync(TumblerClientConfiguration configuration, ClientInteraction interaction) { TumblerClientRuntime runtime = new TumblerClientRuntime(); try { await runtime.ConfigureAsync(configuration, interaction).ConfigureAwait(false); } catch { runtime.Dispose(); throw; } return(runtime); }
public async Task ConfigureAsync(TumblerClientConfiguration configuration, ClientInteraction interaction) { interaction = interaction ?? new AcceptAllClientInteraction(); Network = configuration.Network; TumblerServer = configuration.TumblerServer; BobSettings = configuration.BobConnectionSettings; AliceSettings = configuration.AliceConnectionSettings; AllowInsecure = configuration.AllowInsecure; await SetupTorAsync(interaction, configuration.TorPath).ConfigureAwait(false); RPCClient rpc = null; try { rpc = configuration.RPCArgs.ConfigureRPCClient(configuration.Network); } catch { throw new ConfigException("Please, fix rpc settings in " + configuration.ConfigurationFile); } var dbreeze = new DBreezeRepository(Path.Combine(configuration.DataDir, "db2")); Cooperative = configuration.Cooperative; Repository = dbreeze; _Disposables.Add(dbreeze); Tracker = new Tracker(dbreeze, Network); Services = ExternalServices.CreateFromRPCClient(rpc, dbreeze, Tracker); if (configuration.OutputWallet.RootKey != null && configuration.OutputWallet.KeyPath != null) { DestinationWallet = new ClientDestinationWallet(configuration.OutputWallet.RootKey, configuration.OutputWallet.KeyPath, dbreeze, configuration.Network); } else if (configuration.OutputWallet.RPCArgs != null) { try { DestinationWallet = new RPCDestinationWallet(configuration.OutputWallet.RPCArgs.ConfigureRPCClient(Network)); } catch { throw new ConfigException("Please, fix outputwallet rpc settings in " + configuration.ConfigurationFile); } } else { throw new ConfigException("Missing configuration for outputwallet"); } TumblerParameters = dbreeze.Get <ClassicTumbler.ClassicTumblerParameters>("Configuration", configuration.TumblerServer.Uri.AbsoluteUri); if (TumblerParameters != null && TumblerParameters.GetHash() != configuration.TumblerServer.ConfigurationHash) { TumblerParameters = null; } if (!configuration.OnlyMonitor) { var client = CreateTumblerClient(0); if (TumblerParameters == null) { Logs.Configuration.LogInformation("Downloading tumbler information of " + configuration.TumblerServer.Uri.AbsoluteUri); var parameters = Retry(3, () => client.GetTumblerParameters()); if (parameters == null) { throw new ConfigException("Unable to download tumbler's parameters"); } if (parameters.GetHash() != configuration.TumblerServer.ConfigurationHash) { throw new ConfigException("The tumbler returned an invalid configuration"); } var standardCycles = new StandardCycles(configuration.Network); var standardCycle = standardCycles.GetStandardCycle(parameters); if (standardCycle == null || !parameters.IsStandard()) { Logs.Configuration.LogWarning("This tumbler has non standard parameters"); if (!AllowInsecure) { throw new ConfigException("This tumbler has non standard parameters"); } standardCycle = null; } await interaction.ConfirmParametersAsync(parameters, standardCycle).ConfigureAwait(false); Repository.UpdateOrInsert("Configuration", TumblerServer.Uri.AbsoluteUri, parameters, (o, n) => n); TumblerParameters = parameters; Logs.Configuration.LogInformation("Tumbler parameters saved"); } Logs.Configuration.LogInformation($"Using tumbler {TumblerServer.Uri.AbsoluteUri}"); } }
public static TumblerClientRuntime FromConfiguration(TumblerClientConfiguration configuration, ClientInteraction interaction) { return(FromConfigurationAsync(configuration, interaction).GetAwaiter().GetResult()); }