Beginning of FetchInputs implementation.
[NovacoinLibrary.git] / Novacoin / CTransaction.cs
index fd62f41..8a5f6a7 100644 (file)
@@ -20,6 +20,7 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.IO;
+using System.Diagnostics.Contracts;
 
 namespace Novacoin
 {
@@ -56,6 +57,11 @@ namespace Novacoin
         public const ulong nMaxMoney = 2000000000 * nCoin;
 
         /// <summary>
+        /// Maximum transaction size is 250Kb
+        /// </summary>
+        public const uint nMaxTxSize = 250000;
+
+        /// <summary>
         /// Version of transaction schema.
         /// </summary>
         public uint nVersion;
@@ -132,15 +138,15 @@ namespace Novacoin
                 return true;
             }
 
-            CTransaction txPrev = null;
+            TxOutItem txOutCursor = null;
             for (int i = 0; i < vin.Length; i++)
             {
                 var outpoint = vin[i].prevout;
 
-                if (!CBlockStore.Instance.GetTransaction(outpoint.hash, ref txPrev))
+                if (!CBlockStore.Instance.GetTxOutCursor(outpoint, ref txOutCursor))
                     return false;
 
-                if (!ScriptCode.VerifyScript(vin[i].scriptSig, txPrev.vout[outpoint.n].scriptPubKey, this, i, (int)scriptflag.SCRIPT_VERIFY_P2SH, 0))
+                if (!ScriptCode.VerifyScript(vin[i].scriptSig, txOutCursor.scriptPubKey, this, i, (int)scriptflag.SCRIPT_VERIFY_P2SH, 0))
                     return false;
             }
 
@@ -174,7 +180,7 @@ namespace Novacoin
         /// <returns>Checking result</returns>
         public bool CheckTransaction()
         {
-            if (Size > 250000 || vin.Length == 0 || vout.Length == 0)
+            if (Size > nMaxTxSize || vin.Length == 0 || vout.Length == 0)
             {
                 return false;
             }
@@ -393,9 +399,26 @@ namespace Novacoin
         /// <summary>
         /// Transaction hash
         /// </summary>
-        public Hash256 Hash
+        public uint256 Hash
+        {
+            get { return CryptoUtils.ComputeHash256(this); }
+        }
+
+        /// <summary>
+        /// Amount of novacoins spent by this transaction.
+        /// </summary>
+        public ulong ValueOut
         {
-            get { return Hash256.Compute256(this); }
+            get
+            {
+                ulong nValueOut = 0;
+                foreach (var txout in vout)
+                {
+                    nValueOut += txout.nValue;
+                    Contract.Assert(MoneyRange(txout.nValue) && MoneyRange(nValueOut));
+                }
+                return nValueOut;
+            }
         }
 
         /// <summary>