public ArenaClient( CredentialIssuerParameters amountCredentialIssuerParameters, CredentialIssuerParameters vsizeCredentialIssuerParameters, CredentialPool amountCredentialPool, CredentialPool vsizeCredentialPool, IArenaRequestHandler requestHandler, WasabiRandom random) { AmountCredentialClient = new WabiSabiClient(amountCredentialIssuerParameters, random, ProtocolConstants.MaxAmountPerAlice, amountCredentialPool); VsizeCredentialClient = new WabiSabiClient(vsizeCredentialIssuerParameters, random, ProtocolConstants.MaxVsizePerAlice, vsizeCredentialPool); RequestHandler = requestHandler; }
public ArenaClient( CredentialIssuerParameters amountCredentialIssuerParameters, CredentialIssuerParameters weightCredentialIssuerParameters, CredentialPool amountCredentialPool, CredentialPool weightCredentialPool, IArenaRequestHandler requestHandler, WasabiRandom random) { AmountCredentialClient = new WabiSabiClient(amountCredentialIssuerParameters, ProtocolCredentialNumber, random, ProtocolMaxAmountPerAlice, amountCredentialPool); WeightCredentialClient = new WabiSabiClient(weightCredentialIssuerParameters, ProtocolCredentialNumber, random, ProtocolMaxWeightPerAlice, weightCredentialPool); RequestHandler = requestHandler; }
public async Task RegisterInputAsyncTest() { var config = new WabiSabiConfig(); var round = WabiSabiFactory.CreateRound(config); using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(config, round); using var key = new Key(); var outpoint = BitcoinFactory.CreateOutPoint(); var mockRpc = new Mock <IRPCClient>(); mockRpc.Setup(rpc => rpc.GetTxOutAsync(outpoint.Hash, (int)outpoint.N, true)) .ReturnsAsync(new NBitcoin.RPC.GetTxOutResponse { IsCoinBase = false, Confirmations = 200, TxOut = new TxOut(Money.Coins(1m), key.PubKey.WitHash.GetAddress(Network.Main)), }); await using var coordinator = new ArenaRequestHandler(config, new Prison(), arena, mockRpc.Object); var rnd = new InsecureRandom(); var amountCredentials = new CredentialPool(); var weightCredentials = new CredentialPool(); var protocolCredentialNumber = 2; var protocolMaxWeightPerAlice = 1_000L; var amountClient = new WabiSabiClient(round.AmountCredentialIssuerParameters, protocolCredentialNumber, rnd, 4_300_000_000_000ul, amountCredentials); var weightClient = new WabiSabiClient(round.WeightCredentialIssuerParameters, protocolCredentialNumber, rnd, (ulong)protocolMaxWeightPerAlice, weightCredentials); var apiClient = new ArenaClient(amountClient, weightClient, coordinator); var aliceId = await apiClient.RegisterInputAsync(Money.Coins(1m), outpoint, key, round.Id, round.Hash); Assert.NotEqual(Guid.Empty, aliceId); Assert.Empty(amountCredentials.Valuable); var reissuanceAmounts = new[] { Money.Coins(.75m) - round.FeeRate.GetFee(Constants.P2wpkhInputVirtualSize), Money.Coins(.25m) }; var inputWeight = 4 * Constants.P2wpkhInputVirtualSize; var inputRemainingWeights = new[] { protocolMaxWeightPerAlice - inputWeight }; // Phase: Input Registration await apiClient.ConfirmConnectionAsync( round.Id, aliceId, inputRemainingWeights, amountCredentials.ZeroValue.Take(protocolCredentialNumber), reissuanceAmounts); Assert.Empty(amountCredentials.Valuable); // Phase: Connection Confirmation round.SetPhase(Phase.ConnectionConfirmation); await apiClient.ConfirmConnectionAsync( round.Id, aliceId, inputRemainingWeights, amountCredentials.ZeroValue.Take(protocolCredentialNumber), reissuanceAmounts); Assert.Single(amountCredentials.Valuable, x => x.Amount.ToMoney() == reissuanceAmounts.First()); Assert.Single(amountCredentials.Valuable, x => x.Amount.ToMoney() == reissuanceAmounts.Last()); }