public static bool IsConsolidationTxn(Transaction transaction, ConsolidationTxParameters consolidationParameters, PrevOut[] prevOuts)
        {
            // The consolidation factor zero disables free consolidation txns
            if (consolidationParameters.MinConsolidationFactor == 0)
            {
                return(false);
            }

            if (transaction.IsCoinBase)
            {
                return(false);
            }

            // The transaction does not decrease #UTXO enough
            if (transaction.Inputs.Count < consolidationParameters.MinConsolidationFactor * transaction.Outputs.Count)
            {
                return(false);
            }

            long sumScriptPubKeySizesTxInputs = 0;

            // combine input with corresponding output it is spending
            var pairsInOut = transaction.Inputs.Zip(prevOuts,
                                                    (i, o) =>
                                                    new
            {
                input  = i,
                output = o
            });

            foreach (var item in pairsInOut)
            {
                // Transaction has less than minConsInputMaturity confirmations
                if (item.output.Confirmations < consolidationParameters.MinConsolidationInputMaturity)
                {
                    return(false);
                }
                // Spam detection
                if (item.input.ScriptSig.Length > consolidationParameters.MaxConsolidationInputScriptSize)
                {
                    return(false);
                }
                if (!consolidationParameters.AcceptNonStdConsolidationInput && !item.output.IsStandard)
                {
                    return(false);
                }
                sumScriptPubKeySizesTxInputs += item.output.ScriptPubKeyLength;
            }

            long sumScriptPubKeySizesTxOutputs = transaction.Outputs.Sum(x => x.ScriptPubKey.Length);

            // Size in utxo db does not decrease enough for cons. transaction to be profitable
            if (sumScriptPubKeySizesTxInputs < consolidationParameters.MinConsolidationFactor * sumScriptPubKeySizesTxOutputs)
            {
                return(false);
            }

            return(true);
        }
Exemple #2
0
 public BlockChainInfoData(string bestBlockHash, long bestBlockHeight, ConsolidationTxParameters consolidationTxParameters)
 {
     this.BestBlockHeight           = bestBlockHeight;
     this.BestBlockHash             = bestBlockHash;
     this.ConsolidationTxParameters = consolidationTxParameters;
 }