internal static async Task <IPAddress> GetExternalIp(TumblerClient client, string url) { var result = await client.Client.GetAsync(url).ConfigureAwait(false); var content = await result.Content.ReadAsStringAsync().ConfigureAwait(false); return(IPAddress.Parse(content.Replace("\n", string.Empty))); }
public TumblerClientContext(TumblerClient tumblerClient, RPCClient rpcClient, Client.Tumbler.Services.IRepository clientRepository) { var parameters = tumblerClient.GetTumblerParameters(); PaymentMachineState = new PaymentStateMachine( parameters, tumblerClient, new ClientDestinationWallet("", new ExtKey().Neuter().GetWif(rpcClient.Network), new KeyPath(), clientRepository), Client.Tumbler.Services.ExternalServices.CreateFromRPCClient(rpcClient, clientRepository) ); }
private static void StartTumbler(string[] args) { Logs.Configure(new FuncLoggerFactory(i => new ConsoleLogger(i, (a, b) => true, false))); CancellationTokenSource broadcasterCancel = new CancellationTokenSource(); DBreezeRepository dbreeze = null; try { var network = args.Contains("-testnet", StringComparer.OrdinalIgnoreCase) ? Network.TestNet : args.Contains("-regtest", StringComparer.OrdinalIgnoreCase) ? Network.RegTest : Network.Main; Logs.Configuration.LogInformation("Network: " + network); var dataDir = DefaultDataDirectory.GetDefaultDirectory("NTumbleBit", network); var consoleArgs = new TextFileConfiguration(args); var configFile = GetDefaultConfigurationFile(dataDir, network); var config = TextFileConfiguration.Parse(File.ReadAllText(configFile)); consoleArgs.MergeInto(config, true); config.AddAlias("server", "tumbler.server"); var onlymonitor = config.GetOrDefault <bool>("onlymonitor", false); RPCClient rpc = null; try { rpc = RPCArgs.ConfigureRPCClient(config, network); } catch { throw new ConfigException("Please, fix rpc settings in " + configFile); } dbreeze = new DBreezeRepository(Path.Combine(dataDir, "db")); var services = ExternalServices.CreateFromRPCClient(rpc, dbreeze); var broadcaster = new BroadcasterJob(services, Logs.Main); broadcaster.Start(broadcasterCancel.Token); Logs.Main.LogInformation("BroadcasterJob started"); if (!onlymonitor) { var server = config.GetOrDefault("tumbler.server", null as Uri); if (server == null) { Logs.Main.LogError("tumbler.server not configured"); throw new ConfigException(); } var client = new TumblerClient(network, server); Logs.Configuration.LogInformation("Downloading tumbler information of " + server.AbsoluteUri); var parameters = Retry(3, () => client.GetTumblerParameters()); Logs.Configuration.LogInformation("Tumbler Server Connection successfull"); var existingConfig = dbreeze.Get <ClassicTumbler.ClassicTumblerParameters>("Configuration", client.Address.AbsoluteUri); if (existingConfig != null) { if (Serializer.ToString(existingConfig) != Serializer.ToString(parameters)) { Logs.Configuration.LogError("The configuration file of the tumbler changed since last connection, it should never happen"); throw new ConfigException(); } } else { dbreeze.UpdateOrInsert("Configuration", client.Address.AbsoluteUri, parameters, (o, n) => n); } if (parameters.Network != rpc.Network) { throw new ConfigException("The tumbler server run on a different network than the local rpc server"); } IDestinationWallet destinationWallet = null; try { destinationWallet = GetDestinationWallet(config, rpc.Network, dbreeze); } catch (Exception ex) { Logs.Main.LogInformation("outputwallet.extpubkey is not configured, trying to use outputwallet.rpc settings."); try { destinationWallet = GetRPCDestinationWallet(config, rpc.Network); } catch { throw ex; } //Not a bug, want to throw the other exception } var stateMachine = new StateMachinesExecutor(parameters, client, destinationWallet, services, dbreeze, Logs.Main); stateMachine.Start(broadcasterCancel.Token); Logs.Main.LogInformation("State machines started"); } Logs.Main.LogInformation("Press enter to stop"); Console.ReadLine(); broadcasterCancel.Cancel(); } catch (ConfigException ex) { if (!string.IsNullOrEmpty(ex.Message)) { Logs.Configuration.LogError(ex.Message); } } catch (Exception ex) { Logs.Configuration.LogError(ex.Message); Logs.Configuration.LogDebug(ex.StackTrace); } finally { if (!broadcasterCancel.IsCancellationRequested) { broadcasterCancel.Cancel(); } dbreeze?.Dispose(); } }
static void Main(string[] args) { // args[0] = server CTB URL // args[1] = cycle number (not too important) // args[2] = cookie file path for Tor // args[3] & args[4] = -noTor and/or -tumblerProtocol=http |-tumblerProtocol=tcp var useTor = !args.Contains("-noTor"); TumblerProtocolType?tumblerProtocol = null; try { string tumblerProtocolString = args.Where(a => a.StartsWith("-tumblerProtocol=")).Select(a => a.Substring("-tumblerProtocol=".Length).Replace("\"", "")).FirstOrDefault(); if (tumblerProtocolString != null) { tumblerProtocol = Enum.Parse <TumblerProtocolType>(tumblerProtocolString, true); } if (useTor && tumblerProtocol.HasValue && tumblerProtocol.Value == 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 serverAddress = new TumblerUrlBuilder(args[0]); var cycle = int.Parse(args[1]); var client = new TumblerClient(Network.Main, serverAddress, cycle); var cookieFile = new FileInfo(args[2]); IPEndPoint endpoint; var settings = new SocksConnectionSettings(); if (useTor) { using (var tor = new TorClient("127.0.0.1", 9051, cookieFile)) { try { tor.ConnectAsync().GetAwaiter().GetResult(); } catch { Console.WriteLine("Error in connect"); } if (!tor.AuthenticateAsync().GetAwaiter().GetResult()) { Console.WriteLine("Error in authenticate"); } var endpoints = tor.GetSocksListenersAsync().GetAwaiter().GetResult(); endpoint = endpoints.FirstOrDefault(); if (endpoint == null) { throw new TorException("Tor has no socks listener", ""); } } settings.Proxy = endpoint; } var handler = settings.CreateHttpHandler(tumblerProtocol ?? TumblerProtocolType.Tcp); if (handler != null) { client.SetHttpHandler(handler); } else { Console.WriteLine("Handler is null"); } Console.WriteLine(DateTime.Now + " Obtaining MasterNode parameters"); try { var parameters = client.GetTumblerParameters(); Console.WriteLine("Core settings"); Console.WriteLine($"Network: {parameters.Network}"); Console.WriteLine($"ExpectedAddress: {parameters.ExpectedAddress}"); Console.WriteLine($"Denomination: {parameters.Denomination}"); Console.WriteLine($"Fee: {parameters.Fee}"); Console.WriteLine(); Console.WriteLine("Standard Server Check"); Console.WriteLine($" - IsStandard (MasterNode value =? ExpectedValue): {parameters.IsStandard()}"); Console.WriteLine($" - Version ({parameters.Version} =? {ClassicTumblerParameters.LAST_VERSION}): {parameters.Version == ClassicTumblerParameters.LAST_VERSION}"); Console.WriteLine($" - VoucherKey: {parameters.VoucherKey.CheckKey()}"); Console.WriteLine($" - ServerKey: {parameters.ServerKey.CheckKey()}"); Console.WriteLine($" - FakePuzzleCount ({parameters.FakePuzzleCount} =? {285}): {parameters.FakePuzzleCount == 285}"); Console.WriteLine($" - RealPuzzleCount ({parameters.RealPuzzleCount} =? {15}): {parameters.RealPuzzleCount == 15}"); Console.WriteLine($" - RealTransactionCount ({parameters.RealTransactionCount} =? {42}): {parameters.RealTransactionCount == 42}"); Console.WriteLine($" - FakeTransactionCount ({parameters.FakeTransactionCount} =? {42}): {parameters.FakeTransactionCount == 42}"); Console.WriteLine($" - Denomination ({parameters.Denomination} =? {new Money(0.1m, MoneyUnit.BTC)}): {parameters.Denomination == new Money(0.1m, MoneyUnit.BTC)}"); Console.WriteLine($" - Fee ({parameters.Fee} =? {new Money(0.00155m, MoneyUnit.BTC)}): {parameters.Fee == new Money(0.00155m, MoneyUnit.BTC)}"); Console.WriteLine($" - FakeFormat ({parameters.FakeFormat} =? {new uint256(Enumerable.Range(0, 32).Select(o => o == 0 ? (byte)0 : (byte)1).ToArray())}): {parameters.FakeFormat == new uint256(Enumerable.Range(0, 32).Select(o => o == 0 ? (byte)0 : (byte)1).ToArray())}"); Console.WriteLine(); Console.WriteLine($"Cycles"); Console.WriteLine($" - CycleGenerator: {parameters.CycleGenerator.FirstCycle.ToString()}"); Console.WriteLine($" - RegistrationOverlap: {parameters.CycleGenerator.RegistrationOverlap}"); Console.WriteLine(); Console.WriteLine("Cryptography"); Console.WriteLine($" - FakeFormat: {parameters.FakeFormat}"); Console.WriteLine($" - FakeTransactionCount: {parameters.FakeTransactionCount}"); Console.WriteLine($" - RealPuzzleCount: {parameters.RealPuzzleCount}"); Console.WriteLine($" - FakePuzzleCount: {parameters.FakePuzzleCount}"); Console.WriteLine($" - RealTransactionCount: {parameters.RealTransactionCount}"); Console.WriteLine($" - Version: {parameters.Version}"); Console.WriteLine($" - FakeFormat: {parameters.Version}"); Console.WriteLine(); } catch (Exception ex) { } Console.WriteLine(); Console.WriteLine(DateTime.Now + " Starting tor connectivity test..."); while (true) { Stopwatch stopwatch = Stopwatch.StartNew(); try { var parameters = client.GetTumblerParameters(); stopwatch.Stop(); Console.WriteLine(DateTime.Now + " Received parameter response in " + stopwatch.ElapsedMilliseconds + "ms"); } catch { stopwatch.Stop(); Console.WriteLine(DateTime.Now + " Timed out after " + stopwatch.ElapsedMilliseconds + "ms"); } Thread.Sleep(1000); } }
static void Main(string[] args) { // args[0] = server CTB URL // args[1] = cycle number (not too important) // args[2] = cookie file path for Tor var serverAddress = new TumblerUrlBuilder(args[0]); var cycle = int.Parse(args[1]); var client = new TumblerClient(Network.Main, serverAddress, cycle); var cookieFile = new FileInfo(args[2]); IPEndPoint endpoint; using (var tor = new TorClient("127.0.0.1", 9051, cookieFile)) { try { tor.ConnectAsync().GetAwaiter().GetResult(); } catch { Console.WriteLine("Error in connect"); } if (!tor.AuthenticateAsync().GetAwaiter().GetResult()) { Console.WriteLine("Error in authenticate"); } var endpoints = tor.GetSocksListenersAsync().GetAwaiter().GetResult(); endpoint = endpoints.FirstOrDefault(); if (endpoint == null) { throw new TorException("Tor has no socks listener", ""); } } var settings = new SocksConnectionSettings(); settings.Proxy = endpoint; var handler = settings.CreateHttpHandler(TumblerProtocolType.Tcp); if (handler != null) { client.SetHttpHandler(handler); } else { Console.WriteLine("Handler is null"); } Console.WriteLine(DateTime.Now + " Starting tor connectivity test..."); while (true) { Stopwatch stopwatch = Stopwatch.StartNew(); try { var parameters = client.GetTumblerParameters(); stopwatch.Stop(); Console.WriteLine(DateTime.Now + " Received parameter response in " + stopwatch.ElapsedMilliseconds + "ms"); } catch { stopwatch.Stop(); Console.WriteLine(DateTime.Now + " Timed out after " + stopwatch.ElapsedMilliseconds + "ms"); } } }