private static MultipartyTransactionParameters CreateMultipartyTransactionParameters() { var reasonableRange = new MoneyRange(Money.Coins(0.0001m), Money.Coins(430)); var txParams = new MultipartyTransactionParameters( new FeeRate(5m), CoordinationFeeRate.Zero, reasonableRange, reasonableRange, Network.Main); return(txParams); }
public static uint256 CalculateHash( DateTimeOffset inputRegistrationStart, TimeSpan inputRegistrationTimeout, TimeSpan connectionConfirmationTimeout, TimeSpan outputRegistrationTimeout, TimeSpan transactionSigningTimeout, MoneyRange allowedInputAmounts, ImmutableSortedSet <ScriptType> allowedInputTypes, MoneyRange allowedOutputAmounts, ImmutableSortedSet <ScriptType> allowedOutputTypes, Network network, long feePerK, CoordinationFeeRate coordinationFeeRate, int maxTransactionSize, long minRelayTxFeePerK, long maxAmountCredentialValue, long maxVsizeCredentialValue, long maxVsizeAllocationPerAlice, long maxSuggestedAmount, CredentialIssuerParameters amountCredentialIssuerParameters, CredentialIssuerParameters vsizeCredentialIssuerParameters) { var hash = StrobeHasher.Create(ProtocolConstants.RoundStrobeDomain) .Append(ProtocolConstants.RoundInputRegistrationStartStrobeLabel, inputRegistrationStart) .Append(ProtocolConstants.RoundInputRegistrationTimeoutStrobeLabel, inputRegistrationTimeout) .Append(ProtocolConstants.RoundConnectionConfirmationTimeoutStrobeLabel, connectionConfirmationTimeout) .Append(ProtocolConstants.RoundOutputRegistrationTimeoutStrobeLabel, outputRegistrationTimeout) .Append(ProtocolConstants.RoundTransactionSigningTimeoutStrobeLabel, transactionSigningTimeout) .Append(ProtocolConstants.RoundAllowedInputAmountsStrobeLabel, allowedInputAmounts) .Append(ProtocolConstants.RoundAllowedInputTypesStrobeLabel, allowedInputTypes) .Append(ProtocolConstants.RoundAllowedOutputAmountsStrobeLabel, allowedOutputAmounts) .Append(ProtocolConstants.RoundAllowedOutputTypesStrobeLabel, allowedOutputTypes) .Append(ProtocolConstants.RoundNetworkStrobeLabel, network.ToString()) .Append(ProtocolConstants.RoundFeeRateStrobeLabel, feePerK) .Append(ProtocolConstants.RoundCoordinationFeeRateStrobeLabel, coordinationFeeRate) .Append(ProtocolConstants.RoundMaxTransactionSizeStrobeLabel, maxTransactionSize) .Append(ProtocolConstants.RoundMinRelayTxFeeStrobeLabel, minRelayTxFeePerK) .Append(ProtocolConstants.RoundMaxAmountCredentialValueStrobeLabel, maxAmountCredentialValue) .Append(ProtocolConstants.RoundMaxVsizeCredentialValueStrobeLabel, maxVsizeCredentialValue) .Append(ProtocolConstants.RoundMaxVsizePerAliceStrobeLabel, maxVsizeAllocationPerAlice) .Append(ProtocolConstants.RoundMaxSuggestedAmountLabel, maxSuggestedAmount) .Append(ProtocolConstants.RoundAmountCredentialIssuerParametersStrobeLabel, amountCredentialIssuerParameters) .Append(ProtocolConstants.RoundVsizeCredentialIssuerParametersStrobeLabel, vsizeCredentialIssuerParameters) .GetHash(); return(hash); }
public Round(RoundParameters roundParameters) { RoundParameters = roundParameters; var allowedAmounts = new MoneyRange(roundParameters.MinRegistrableAmount, RoundParameters.MaxRegistrableAmount); var txParams = new MultipartyTransactionParameters(roundParameters.FeeRate, allowedAmounts, allowedAmounts, roundParameters.Network); CoinjoinState = new ConstructionState(txParams); InitialInputVsizeAllocation = CoinjoinState.Parameters.MaxTransactionSize - MultipartyTransactionParameters.SharedOverhead; MaxRegistrableVsize = Math.Min(InitialInputVsizeAllocation / RoundParameters.MaxInputCountByRound, (int)ProtocolConstants.MaxVsizeCredentialValue); MaxVsizeAllocationPerAlice = MaxRegistrableVsize; AmountCredentialIssuer = new(new(RoundParameters.Random), RoundParameters.Random, MaxRegistrableAmount); VsizeCredentialIssuer = new(new(RoundParameters.Random), RoundParameters.Random, MaxRegistrableVsize); AmountCredentialIssuerParameters = AmountCredentialIssuer.CredentialIssuerSecretKey.ComputeCredentialIssuerParameters(); VsizeCredentialIssuerParameters = VsizeCredentialIssuer.CredentialIssuerSecretKey.ComputeCredentialIssuerParameters(); Id = CalculateHash(); }
/// <param name="feeRate">Bitcoin network fee rate the coinjoin is targeting.</param> /// <param name="allowedOutputAmount">Range of output amount that's allowed to be registered.</param> /// <param name="outputSize">Size of an output.</param> /// <param name="inputSize">Size of an input.</param> /// <param name="availableVsize">Available virtual size for outputs.</param> /// <param name="random">Allows testing by setting a seed value for the random number generator. Use <c>null</c> in production code.</param> public AmountDecomposer(FeeRate feeRate, MoneyRange allowedOutputAmount, int outputSize, int inputSize, int availableVsize, Random?random = null) { FeeRate = feeRate; InputSize = inputSize; OutputSize = outputSize; InputFee = FeeRate.GetFee(inputSize); OutputFee = FeeRate.GetFee(outputSize); AvailableVsize = availableVsize; MinAllowedOutputAmountPlusFee = allowedOutputAmount.Min + OutputFee; MaxAllowedOutputAmount = allowedOutputAmount.Max; Random = random ?? Random.Shared; // Create many standard denominations. DenominationsPlusFees = CreateDenominationsPlusFees(); }
public Round(RoundParameters roundParameters) { RoundParameters = roundParameters; var allowedAmounts = new MoneyRange(roundParameters.MinRegistrableAmount, RoundParameters.MaxRegistrableAmount); var txParams = new MultipartyTransactionParameters(roundParameters.FeeRate, roundParameters.CoordinationFeeRate, allowedAmounts, allowedAmounts, roundParameters.Network); CoinjoinState = new ConstructionState(txParams); InitialInputVsizeAllocation = CoinjoinState.Parameters.MaxTransactionSize - MultipartyTransactionParameters.SharedOverhead; MaxVsizeCredentialValue = Math.Min(InitialInputVsizeAllocation / RoundParameters.MaxInputCountByRound, (int)ProtocolConstants.MaxVsizeCredentialValue); MaxVsizeAllocationPerAlice = MaxVsizeCredentialValue; AmountCredentialIssuer = new(new(RoundParameters.Random), RoundParameters.Random, MaxAmountCredentialValue); VsizeCredentialIssuer = new(new(RoundParameters.Random), RoundParameters.Random, MaxVsizeCredentialValue); AmountCredentialIssuerParameters = AmountCredentialIssuer.CredentialIssuerSecretKey.ComputeCredentialIssuerParameters(); VsizeCredentialIssuerParameters = VsizeCredentialIssuer.CredentialIssuerSecretKey.ComputeCredentialIssuerParameters(); InputRegistrationTimeFrame = TimeFrame.Create(RoundParameters.StandardInputRegistrationTimeout).StartNow(); ConnectionConfirmationTimeFrame = TimeFrame.Create(RoundParameters.ConnectionConfirmationTimeout); OutputRegistrationTimeFrame = TimeFrame.Create(RoundParameters.OutputRegistrationTimeout); TransactionSigningTimeFrame = TimeFrame.Create(RoundParameters.TransactionSigningTimeout); }
public BribeAmount(MoneyRange value) { Value = value; }