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

Use different AliceClients for every coin #7608

Merged
merged 1 commit into from Mar 22, 2022

Conversation

molnard
Copy link
Collaborator

@molnard molnard commented Mar 22, 2022

Fixes:

  • AliceClients were disposed right after the ConnectionConfirmation phase.
  • Same Tor identity was used for all the AliceClients.
2022-03-21 22:22:10.196 [20] ERROR      CoinJoinManager.ExecuteAsync (187)      Wallet: `Test0312` - Coinjoin client failed with exception: Exception: WalletWasabi.Tor.Socks5.Exceptions.TorCircuitExpiredException: Exception of type 'WalletWasabi.Tor.Socks5.Exceptions.TorCircuitExpiredException' was thrown.
   at WalletWasabi.Tor.Socks5.Pool.TorHttpPool.ObtainFreeConnectionAsync(HttpRequestMessage request, ICircuit circuit, CancellationToken token) in WalletWasabi\Tor\Socks5\Pool\TorHttpPool.cs:line 236
   at WalletWasabi.Tor.Socks5.Pool.TorHttpPool.SendAsync(HttpRequestMessage request, ICircuit circuit, CancellationToken cancellationToken) in WalletWasabi\Tor\Socks5\Pool\TorHttpPool.cs:line 115
   at WalletWasabi.Tor.Http.TorHttpClient.SendAsync(HttpRequestMessage request, CancellationToken token) in WalletWasabi\Tor\Http\TorHttpClient.cs:line 79
   at WalletWasabi.Tor.Http.TorHttpClient.SendAsync(HttpMethod method, String relativeUri, HttpContent content, CancellationToken token) in WalletWasabi\Tor\Http\TorHttpClient.cs:line 66
   at WalletWasabi.WabiSabi.Client.WabiSabiHttpApiClient.SendWithRetriesAsync(RemoteAction action, String jsonString, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\WabiSabiHttpApiClient.cs:line 77
   at WalletWasabi.WabiSabi.Client.WabiSabiHttpApiClient.SendWithRetriesAsync[TRequest](RemoteAction action, TRequest request, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\WabiSabiHttpApiClient.cs:line 121
   at WalletWasabi.WabiSabi.Client.WabiSabiHttpApiClient.SendAndReceiveAsync[TRequest](RemoteAction action, TRequest request, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\WabiSabiHttpApiClient.cs:line 133
   at WalletWasabi.WabiSabi.Client.ArenaClient.ReadyToSignAsync(uint256 roundId, Guid aliceId, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\ArenaClient.cs:line 208
   at WalletWasabi.WabiSabi.Client.AliceClient.ReadyToSignAsync(CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\AliceClient.cs:line 239
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.<>c__DisplayClass45_0.<<ReadyToSignAsync>b__0>d.MoveNext() in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 293
--- End of stack trace from previous location ---
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.ReadyToSignAsync(IEnumerable`1 aliceClients, DateTimeOffset readyToSignEndTime, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 297
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.ProceedWithOutputRegistrationPhaseAsync(uint256 roundId, ImmutableArray`1 registeredAliceClients, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 520
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.StartRoundAsync(IEnumerable`1 smartCoins, RoundState roundState, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 165
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.StartCoinJoinAsync(IEnumerable`1 coinCandidates, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 128
   at WalletWasabi.WabiSabi.Client.CoinJoinManager.ExecuteAsync(CancellationToken stoppingToken) in WalletWasabi\WabiSabi\Client\CoinJoinManager.cs:line 164
2022-03-21 22:22:14.288 [38] ERROR      CoinJoinManager.ExecuteAsync (187)      Wallet: `TestThink` - Coinjoin client failed with exception: Exception: WalletWasabi.Tor.Socks5.Exceptions.TorCircuitExpiredException: Exception of type 'WalletWasabi.Tor.Socks5.Exceptions.TorCircuitExpiredException' was thrown.
   at WalletWasabi.Tor.Socks5.Pool.TorHttpPool.ObtainFreeConnectionAsync(HttpRequestMessage request, ICircuit circuit, CancellationToken token) in WalletWasabi\Tor\Socks5\Pool\TorHttpPool.cs:line 236
   at WalletWasabi.Tor.Socks5.Pool.TorHttpPool.SendAsync(HttpRequestMessage request, ICircuit circuit, CancellationToken cancellationToken) in WalletWasabi\Tor\Socks5\Pool\TorHttpPool.cs:line 115
   at WalletWasabi.Tor.Http.TorHttpClient.SendAsync(HttpRequestMessage request, CancellationToken token) in WalletWasabi\Tor\Http\TorHttpClient.cs:line 79
   at WalletWasabi.Tor.Http.TorHttpClient.SendAsync(HttpMethod method, String relativeUri, HttpContent content, CancellationToken token) in WalletWasabi\Tor\Http\TorHttpClient.cs:line 66
   at WalletWasabi.WabiSabi.Client.WabiSabiHttpApiClient.SendWithRetriesAsync(RemoteAction action, String jsonString, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\WabiSabiHttpApiClient.cs:line 77
   at WalletWasabi.WabiSabi.Client.WabiSabiHttpApiClient.SendWithRetriesAsync[TRequest](RemoteAction action, TRequest request, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\WabiSabiHttpApiClient.cs:line 121
   at WalletWasabi.WabiSabi.Client.WabiSabiHttpApiClient.SendAndReceiveAsync[TRequest](RemoteAction action, TRequest request, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\WabiSabiHttpApiClient.cs:line 133
   at WalletWasabi.WabiSabi.Client.ArenaClient.ReadyToSignAsync(uint256 roundId, Guid aliceId, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\ArenaClient.cs:line 208
   at WalletWasabi.WabiSabi.Client.AliceClient.ReadyToSignAsync(CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\AliceClient.cs:line 239
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.<>c__DisplayClass45_0.<<ReadyToSignAsync>b__0>d.MoveNext() in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 293
--- End of stack trace from previous location ---
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.ReadyToSignAsync(IEnumerable`1 aliceClients, DateTimeOffset readyToSignEndTime, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 297
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.ProceedWithOutputRegistrationPhaseAsync(uint256 roundId, ImmutableArray`1 registeredAliceClients, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 520
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.StartRoundAsync(IEnumerable`1 smartCoins, RoundState roundState, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 165
   at WalletWasabi.WabiSabi.Client.CoinJoinClient.StartCoinJoinAsync(IEnumerable`1 coinCandidates, CancellationToken cancellationToken) in WalletWasabi\WabiSabi\Client\CoinJoinClient.cs:line 128
   at WalletWasabi.WabiSabi.Client.CoinJoinManager.ExecuteAsync(CancellationToken stoppingToken) in WalletWasabi\WabiSabi\Client\CoinJoinManager.cs:line 164

try
{
personCircuit = HttpClientFactory.NewHttpClientWithPersonCircuit(out Tor.Http.IHttpClient httpClient);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Holy sh**

@nothingmuch
Copy link
Contributor

wow could it be? is it exactly the thing i warned about repeatedly?

what a farce this project is.

@@ -141,25 +141,28 @@ public async Task<CoinJoinResult> StartRoundAsync(IEnumerable<SmartCoin> smartCo
{
var roundId = roundState.Id;

ImmutableArray<AliceClient> registeredAliceClients = ImmutableArray<AliceClient>.Empty;
ImmutableArray<(AliceClient AliceClient, PersonCircuit PersonCircuit)> registeredAliceClientAndCircuits = ImmutableArray<(AliceClient, PersonCircuit)>.Empty;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The noise/signal ratio of this line is close to infinite.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking of adding PersonCircuit to AliceClient but it won't be wise because of the abstractions. So the cleanest cut is to handle them outside.

@molnard molnard merged commit 1b491be into zkSNACKs:master Mar 22, 2022
@molnard molnard deleted the aliceclientfix branch March 22, 2022 16:34
@molnard
Copy link
Collaborator Author

molnard commented Mar 22, 2022

wow could it be? is it exactly the thing i warned about repeatedly?

This was exactly the right time to fix this.

@molnard
Copy link
Collaborator Author

molnard commented Mar 23, 2022

(1) The most important change in this PR is the line:

https://github.com/zkSNACKs/WalletWasabi/pull/7608/files#diff-b4b0ed52d80da8067250690ccb013b4ba124c66ddbe1969236ac568759630031L563

The circuit was disposed of right after the connection confirmation.

(2) The second change was to use separate Tor identities for every coin.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
Development

Successfully merging this pull request may close these issues.

None yet

3 participants