Exemplo n.º 1
0
        private void CheckIntputs(Transaction tx, CoinView inputs, int nSpendHeight)
        {
            if (!inputs.HaveInputs(tx))
            {
                ConsensusErrors.BadTransactionMissingInput.Throw();
            }
            Money nValueIn = Money.Zero;
            Money nFees    = Money.Zero;

            for (int i = 0; i < tx.Inputs.Count; i++)
            {
                var prevout = tx.Inputs[i].PrevOut;
                var coins   = inputs.AccessCoins(prevout.Hash);

                // If prev is coinbase, check that it's matured
                if (coins.Coinbase)
                {
                    if (nSpendHeight - coins.Height < COINBASE_MATURITY)
                    {
                        ConsensusErrors.BadTransactionPrematureCoinbaseSpending.Throw();
                    }
                }

                // Check for negative or overflow input values
                nValueIn += coins.TryGetOutput(prevout.N).Value;
                if (!MoneyRange(coins.TryGetOutput(prevout.N).Value) || !MoneyRange(nValueIn))
                {
                    ConsensusErrors.BadTransactionInputValueOutOfRange.Throw();
                }
            }

            if (nValueIn < tx.TotalOut)
            {
                ConsensusErrors.BadTransactionInBelowOut.Throw();
            }

            // Tally transaction fees
            Money nTxFee = nValueIn - tx.TotalOut;

            if (nTxFee < 0)
            {
                ConsensusErrors.BadTransactionNegativeFee.Throw();
            }
            nFees += nTxFee;
            if (!MoneyRange(nFees))
            {
                ConsensusErrors.BadTransactionFeeOutOfRange.Throw();
            }
        }