Turn ByteQueue into MemoryStream wrapper, use MemoryStream for serialization of COutP...
[NovacoinLibrary.git] / Novacoin / CTxIn.cs
index a33606a..067ad46 100644 (file)
 using System;
 using System.Text;
 using System.Collections.Generic;
+using System.IO;
 
 namespace Novacoin
 {
-       /// <summary>
-       /// Transaction input.
-       /// </summary>
-       public class CTxIn
+    [Serializable]
+    public class TxInConstructorException : Exception
+    {
+        public TxInConstructorException()
+        {
+        }
+
+        public TxInConstructorException(string message)
+                : base(message)
+        {
+        }
+
+        public TxInConstructorException(string message, Exception inner)
+                : base(message, inner)
+        {
+        }
+    }
+
+    /// <summary>
+    /// Transaction input.
+    /// </summary>
+    public class CTxIn
        {
         /// <summary>
         /// Previous input data
@@ -69,21 +88,42 @@ namespace Novacoin
         /// <returns>Inputs array</returns>
         public static CTxIn[] ReadTxInList(ref ByteQueue wBytes)
         {
-            // Get amount
-            int nInputs = (int)wBytes.GetVarInt();
-            var vin = new CTxIn[nInputs];
-
-            for (int nIndex = 0; nIndex < nInputs; nIndex++)
+            try
             {
-                // Fill inputs array
-                vin[nIndex] = new CTxIn();
-                vin[nIndex].prevout = new COutPoint(wBytes.Get(36));
-                vin[nIndex].scriptSig = new CScript(wBytes.Get((int)wBytes.GetVarInt()));
-                vin[nIndex].nSequence = BitConverter.ToUInt32(wBytes.Get(4), 0);
+                // Get amount
+                int nInputs = (int)wBytes.GetVarInt();
+                var vin = new CTxIn[nInputs];
+
+                for (int nIndex = 0; nIndex < nInputs; nIndex++)
+                {
+                    // Fill inputs array
+                    vin[nIndex] = new CTxIn();
+                    vin[nIndex].prevout = new COutPoint(wBytes.Get(36));
+                    vin[nIndex].scriptSig = new CScript(wBytes.Get((int)wBytes.GetVarInt()));
+                    vin[nIndex].nSequence = BitConverter.ToUInt32(wBytes.Get(4), 0);
+                }
+
+                // Return inputs array
+                return vin;
             }
+            catch (Exception e)
+            {
+                throw new TxInConstructorException("Desirealization failed.", e);
+            }
+        }
+
+        /// <summary>
+        /// Serialized size
+        /// </summary>
+        public int Size
+        {
+            get {
+                int nSize = 40; // COutPoint, nSequence
+                nSize += VarInt.GetEncodedSize(scriptSig.Size);
+                nSize += scriptSig.Size;
 
-            // Return inputs array
-            return vin;
+                return nSize;
+            }
         }
 
         /// <summary>
@@ -92,19 +132,19 @@ namespace Novacoin
         /// <returns>Byte sequence.</returns>
         public static implicit operator byte[] (CTxIn input)
         {
-            var inputBytes = new List<byte>();
-
-            inputBytes.AddRange((byte[])input.prevout); // prevout
+            var stream = new MemoryStream();
+            var writer = new BinaryWriter(stream);
 
-            var s = (byte[])input.scriptSig;
-            inputBytes.AddRange(VarInt.EncodeVarInt(s.Length)); // scriptSig length
-            inputBytes.AddRange(s); // scriptSig
-            inputBytes.AddRange(BitConverter.GetBytes(input.nSequence)); // Sequence
+            writer.Write(input.prevout); // prevout
+            writer.Write(VarInt.EncodeVarInt(input.scriptSig.Size)); // scriptSig length
+            writer.Write(input.scriptSig); // scriptSig
+            writer.Write(input.nSequence); // nSequence
 
-            return inputBytes.ToArray();
+            var inputBytes = stream.ToArray();
+            writer.Close();
+            return inputBytes;
         }
 
-
         public bool IsFinal
         {
             get { return (nSequence == uint.MaxValue); }
@@ -138,4 +178,3 @@ namespace Novacoin
 
        }
 }
-