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); }
public BlockChainInfoData(string bestBlockHash, long bestBlockHeight, ConsolidationTxParameters consolidationTxParameters) { this.BestBlockHeight = bestBlockHeight; this.BestBlockHash = bestBlockHash; this.ConsolidationTxParameters = consolidationTxParameters; }