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);
    }
Example #2
0
    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);
    }
Example #3
0
        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();
        }
Example #4
0
    /// <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();
    }
Example #5
0
    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);
    }
Example #6
0
 public BribeAmount(MoneyRange value)
 {
     Value = value;
 }