Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make P2P and Tor configurations oneliners #1945

Merged
merged 40 commits into from Jul 22, 2019
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
52659cb
Create new config params
nopara73 Jul 18, 2019
b4271cf
Read obsolate config values and set new ones according,
molnard Jul 18, 2019
cf61a13
Starting to remove host, port config entries and use the new EndPoints
molnard Jul 18, 2019
1fda515
Overwrite old config with the new one
molnard Jul 18, 2019
646a071
Read obsolete config values and set new ones according (#21)
nopara73 Jul 18, 2019
5440fb3
Revert "Read obsolete config values and set new ones according"
nopara73 Jul 18, 2019
dad774f
Revert "Read obsolete config values and set new ones according" (#22)
nopara73 Jul 18, 2019
c6147a5
Implement backwards compatibility on config files.
nopara73 Jul 18, 2019
b7c5afc
Introduce EndPointParser
nopara73 Jul 18, 2019
3898d84
Implement corresponding settings
nopara73 Jul 18, 2019
d3b2f3e
Rename _bitcoinCoreEndPoint to _bitcoinP2pEndPoint
nopara73 Jul 18, 2019
90a80f4
fix typo
nopara73 Jul 18, 2019
9558f1c
Remove unnecessary backing field.
nopara73 Jul 19, 2019
52e0022
Simplify backwardscomp check
nopara73 Jul 19, 2019
4fae835
save progress
nopara73 Jul 19, 2019
f5b48dc
Add unit tests for parser
nopara73 Jul 19, 2019
83a1295
Add ParserTests to CI.
nopara73 Jul 19, 2019
a14b689
Add more unit tests
nopara73 Jul 19, 2019
b5b4c2b
Assert default port constants so NBitcoin updates don't surprise us.
nopara73 Jul 19, 2019
e43d21f
Assert min and maxrange of port
nopara73 Jul 19, 2019
c39b827
fix var name
nopara73 Jul 21, 2019
3235adc
Test with real ports instead of 0.
nopara73 Jul 21, 2019
c443cc0
Bring network nullcheck up.
nopara73 Jul 21, 2019
714efc0
Add more tests
nopara73 Jul 21, 2019
bd6012b
Improve port parsing
nopara73 Jul 21, 2019
2afa2ee
Make Tor lib work with EndPoints instead of IPEndPoints
nopara73 Jul 21, 2019
07deed4
Merge branch 'master' into config
nopara73 Jul 21, 2019
000a514
Fix codemaid brainfuck
nopara73 Jul 21, 2019
af81cd9
fix regtests
nopara73 Jul 21, 2019
811ab4d
Add RPC params to the config file.
nopara73 Jul 21, 2019
13f5416
Cleanup ports from CoreNode
nopara73 Jul 21, 2019
fbede18
Make Network a Network, not a string.
nopara73 Jul 21, 2019
c7e9726
Use Network types in the selection array, too.
nopara73 Jul 21, 2019
3beeef5
Merge branch 'master' into config
nopara73 Jul 22, 2019
334f745
Save on lost textbox focus instead on character change.
nopara73 Jul 22, 2019
ac9d9d9
Warning message always visible at SettingsTab
molnard Jul 22, 2019
80bca4b
Enable `bitcoin-p2p` and `tcp`
nopara73 Jul 22, 2019
d68bb91
Warning message always visible at SettingsTab (#23)
nopara73 Jul 22, 2019
bd51135
add wait on error let UI run
molnard Jul 22, 2019
54a991d
Add wait on update error and let UI run (#24)
nopara73 Jul 22, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
174 changes: 99 additions & 75 deletions WalletWasabi.Backend/Config.cs
Expand Up @@ -27,63 +27,36 @@ public class Config : IConfig
[JsonProperty(PropertyName = "BitcoinRpcConnectionString")]
public string BitcoinRpcConnectionString { get; private set; }

[JsonProperty(PropertyName = "MainNetBitcoinCoreHost")]
public string MainNetBitcoinCoreHost { get; internal set; }
[JsonProperty(PropertyName = "MainNetBitcoinP2pEndPoint")]
[JsonConverter(typeof(EndPointJsonConverter), Constants.DefaultMainNetBitcoinP2pPort)]
public EndPoint MainNetBitcoinP2pEndPoint { get; internal set; }

[JsonProperty(PropertyName = "TestNetBitcoinCoreHost")]
public string TestNetBitcoinCoreHost { get; internal set; }
[JsonProperty(PropertyName = "TestNetBitcoinP2pEndPoint")]
[JsonConverter(typeof(EndPointJsonConverter), Constants.DefaultTestNetBitcoinP2pPort)]
public EndPoint TestNetBitcoinP2pEndPoint { get; internal set; }

[JsonProperty(PropertyName = "RegTestBitcoinCoreHost")]
public string RegTestBitcoinCoreHost { get; internal set; }
[JsonProperty(PropertyName = "RegTestBitcoinP2pEndPoint")]
[JsonConverter(typeof(EndPointJsonConverter), Constants.DefaultRegTestBitcoinP2pPort)]
public EndPoint RegTestBitcoinP2pEndPoint { get; internal set; }

[JsonProperty(PropertyName = "MainNetBitcoinCorePort")]
public int? MainNetBitcoinCorePort { get; internal set; }

[JsonProperty(PropertyName = "TestNetBitcoinCorePort")]
public int? TestNetBitcoinCorePort { get; internal set; }

[JsonProperty(PropertyName = "RegTestBitcoinCorePort")]
public int? RegTestBitcoinCorePort { get; internal set; }

private EndPoint _bitcoinCoreEndPoint;

public EndPoint GetBitcoinCoreEndPoint()
public EndPoint GetBitcoinP2pEndPoint()
{
if (_bitcoinCoreEndPoint is null)
if (Network == Network.Main)
{
IPAddress ipHost;
string dnsHost = null;
int? port = null;
try
{
if (Network == Network.Main)
{
port = MainNetBitcoinCorePort;
dnsHost = MainNetBitcoinCoreHost;
ipHost = IPAddress.Parse(MainNetBitcoinCoreHost);
}
else if (Network == Network.TestNet)
{
port = TestNetBitcoinCorePort;
dnsHost = TestNetBitcoinCoreHost;
ipHost = IPAddress.Parse(TestNetBitcoinCoreHost);
}
else // if (Network == Network.RegTest)
{
port = RegTestBitcoinCorePort;
dnsHost = RegTestBitcoinCoreHost;
ipHost = IPAddress.Parse(RegTestBitcoinCoreHost);
}

_bitcoinCoreEndPoint = new IPEndPoint(ipHost, port ?? Network.DefaultPort);
}
catch
{
_bitcoinCoreEndPoint = new DnsEndPoint(dnsHost, port ?? Network.DefaultPort);
}
return MainNetBitcoinP2pEndPoint;
}
else if (Network == Network.TestNet)
{
return TestNetBitcoinP2pEndPoint;
}
else if (Network == Network.RegTest)
{
return RegTestBitcoinP2pEndPoint;
}
else
{
throw new NotSupportedException($"{nameof(Network)} not supported: {Network}.");
}

return _bitcoinCoreEndPoint;
}

public Config()
Expand All @@ -97,22 +70,16 @@ public Config(string filePath)

public Config(Network network,
string bitcoinRpcConnectionString,
string mainNetBitcoinCoreHost,
string testNetBitcoinCoreHost,
string regTestBitcoinCoreHost,
int? mainNetBitcoinCorePort,
int? testNetBitcoinCorePort,
int? regTestBitcoinCorePort)
EndPoint mainNetBitcoinP2pEndPoint,
EndPoint testNetBitcoinP2pEndPoint,
EndPoint regTestBitcoinP2pEndPoint)
{
Network = Guard.NotNull(nameof(network), network);
BitcoinRpcConnectionString = Guard.NotNullOrEmptyOrWhitespace(nameof(bitcoinRpcConnectionString), bitcoinRpcConnectionString);

MainNetBitcoinCoreHost = Guard.NotNullOrEmptyOrWhitespace(nameof(mainNetBitcoinCoreHost), mainNetBitcoinCoreHost);
TestNetBitcoinCoreHost = Guard.NotNullOrEmptyOrWhitespace(nameof(testNetBitcoinCoreHost), testNetBitcoinCoreHost);
RegTestBitcoinCoreHost = Guard.NotNullOrEmptyOrWhitespace(nameof(regTestBitcoinCoreHost), regTestBitcoinCoreHost);
MainNetBitcoinCorePort = Guard.NotNull(nameof(mainNetBitcoinCorePort), mainNetBitcoinCorePort);
TestNetBitcoinCorePort = Guard.NotNull(nameof(testNetBitcoinCorePort), testNetBitcoinCorePort);
RegTestBitcoinCorePort = Guard.NotNull(nameof(regTestBitcoinCorePort), regTestBitcoinCorePort);
MainNetBitcoinP2pEndPoint = Guard.NotNull(nameof(mainNetBitcoinP2pEndPoint), mainNetBitcoinP2pEndPoint);
TestNetBitcoinP2pEndPoint = Guard.NotNull(nameof(testNetBitcoinP2pEndPoint), testNetBitcoinP2pEndPoint);
RegTestBitcoinP2pEndPoint = Guard.NotNull(nameof(regTestBitcoinP2pEndPoint), regTestBitcoinP2pEndPoint);
}

/// <inheritdoc />
Expand All @@ -134,12 +101,10 @@ public async Task LoadOrCreateDefaultFileAsync()
Network = Network.Main;
BitcoinRpcConnectionString = "user:password";

MainNetBitcoinCoreHost = IPAddress.Loopback.ToString();
TestNetBitcoinCoreHost = IPAddress.Loopback.ToString();
RegTestBitcoinCoreHost = IPAddress.Loopback.ToString();
MainNetBitcoinCorePort = Network.Main.DefaultPort;
TestNetBitcoinCorePort = Network.TestNet.DefaultPort;
RegTestBitcoinCorePort = Network.RegTest.DefaultPort;
MainNetBitcoinP2pEndPoint = new IPEndPoint(IPAddress.Loopback, Constants.DefaultMainNetBitcoinP2pPort);
TestNetBitcoinP2pEndPoint = new IPEndPoint(IPAddress.Loopback, Constants.DefaultTestNetBitcoinP2pPort);
RegTestBitcoinP2pEndPoint = new IPEndPoint(IPAddress.Loopback, Constants.DefaultRegTestBitcoinP2pPort);

if (!File.Exists(FilePath))
{
Logger.LogInfo<Config>($"{nameof(Config)} file did not exist. Created at path: `{FilePath}`.");
Expand All @@ -152,12 +117,14 @@ public async Task LoadOrCreateDefaultFileAsync()
Network = config.Network ?? Network;
BitcoinRpcConnectionString = config.BitcoinRpcConnectionString ?? BitcoinRpcConnectionString;

MainNetBitcoinCoreHost = config.MainNetBitcoinCoreHost ?? MainNetBitcoinCoreHost;
TestNetBitcoinCoreHost = config.TestNetBitcoinCoreHost ?? TestNetBitcoinCoreHost;
RegTestBitcoinCoreHost = config.RegTestBitcoinCoreHost ?? RegTestBitcoinCoreHost;
MainNetBitcoinCorePort = config.MainNetBitcoinCorePort ?? MainNetBitcoinCorePort;
TestNetBitcoinCorePort = config.TestNetBitcoinCorePort ?? TestNetBitcoinCorePort;
RegTestBitcoinCorePort = config.RegTestBitcoinCorePort ?? RegTestBitcoinCorePort;
MainNetBitcoinP2pEndPoint = config.MainNetBitcoinP2pEndPoint ?? MainNetBitcoinP2pEndPoint;
TestNetBitcoinP2pEndPoint = config.TestNetBitcoinP2pEndPoint ?? TestNetBitcoinP2pEndPoint;
RegTestBitcoinP2pEndPoint = config.RegTestBitcoinP2pEndPoint ?? RegTestBitcoinP2pEndPoint;

if (TryEnsureBackwardsCompatibility(jsonString))
{
await ToFileAsync();
}
}

await ToFileAsync();
Expand Down Expand Up @@ -193,5 +160,62 @@ public void AssertFilePathSet()
throw new NotSupportedException($"{nameof(FilePath)} is not set. Use {nameof(SetFilePath)} to set it.");
}
}

private bool TryEnsureBackwardsCompatibility(string jsonString)
{
try
{
var jsObject = JsonConvert.DeserializeObject<JObject>(jsonString);
bool saveIt = false;

var mainNetBitcoinCoreHost = jsObject.Value<string>("MainNetBitcoinCoreHost");
var mainNetBitcoinCorePort = jsObject.Value<int?>("MainNetBitcoinCorePort");
var testNetBitcoinCoreHost = jsObject.Value<string>("TestNetBitcoinCoreHost");
var testNetBitcoinCorePort = jsObject.Value<int?>("TestNetBitcoinCorePort");
var regTestBitcoinCoreHost = jsObject.Value<string>("RegTestBitcoinCoreHost");
var regTestBitcoinCorePort = jsObject.Value<int?>("RegTestBitcoinCorePort");

if (mainNetBitcoinCoreHost != null)
{
int port = mainNetBitcoinCorePort ?? Constants.DefaultMainNetBitcoinP2pPort;

if (EndPointParser.TryParse(mainNetBitcoinCoreHost, port, out EndPoint ep))
{
MainNetBitcoinP2pEndPoint = ep;
saveIt = true;
}
}

if (testNetBitcoinCoreHost != null)
{
int port = testNetBitcoinCorePort ?? Constants.DefaultTestNetBitcoinP2pPort;

if (EndPointParser.TryParse(testNetBitcoinCoreHost, port, out EndPoint ep))
{
TestNetBitcoinP2pEndPoint = ep;
saveIt = true;
}
}

if (regTestBitcoinCoreHost != null)
{
int port = regTestBitcoinCorePort ?? Constants.DefaultRegTestBitcoinP2pPort;

if (EndPointParser.TryParse(regTestBitcoinCoreHost, port, out EndPoint ep))
{
RegTestBitcoinP2pEndPoint = ep;
saveIt = true;
}
}

return saveIt;
}
catch (Exception ex)
{
Logger.LogWarning<Config>("Backwards compatibility couldn't be ensured.");
Logger.LogInfo<Config>(ex);
return false;
}
}
}
}
2 changes: 1 addition & 1 deletion WalletWasabi.Backend/Global.cs
Expand Up @@ -52,7 +52,7 @@ public async Task InitializeAsync(Config config, CcjRoundConfig roundConfig, RPC
await AssertRpcNodeFullyInitializedAsync();

// Make sure P2P works.
await InitializeP2pAsync(config.Network, config.GetBitcoinCoreEndPoint());
await InitializeP2pAsync(config.Network, config.GetBitcoinP2pEndPoint());

// Initialize index building
var indexBuilderServiceDir = Path.Combine(DataDir, nameof(IndexBuilderService));
Expand Down