Improve empty constructors behavior
[NovacoinLibrary.git] / Novacoin / CTxIn.cs
1 \feffusing System;
2 using System.Text;
3 using System.Collections.Generic;
4
5 namespace Novacoin
6 {
7         /// <summary>
8         /// Transaction input.
9         /// </summary>
10         public class CTxIn
11         {
12                 /// <summary>
13                 /// Hash of parent transaction.
14                 /// </summary>
15                 public Hash256 txID;
16
17                 /// <summary>
18                 /// Parent input number.
19                 /// </summary>
20         public uint n = 0;
21
22                 /// <summary>
23                 /// First half of script, signatures for the scriptPubKey
24                 /// </summary>
25         public CScript scriptSig;
26
27                 /// <summary>
28                 /// Transaction variant number, irrelevant if nLockTime isn't specified. Its value is 0xffffffff by default.
29                 /// </summary>
30         public uint nSequence = 0xffffffff;
31
32         /// <summary>
33         /// Initialize new CTxIn instance as copy of another one.
34         /// </summary>
35         /// <param name="i">CTxIn instance.</param>
36         public CTxIn(CTxIn i)
37         {
38             txID = i.txID;
39             n = i.n;
40             scriptSig = i.scriptSig;
41             nSequence = i.nSequence;
42         }
43
44         /// <summary>
45         /// Initialize an empty instance of CTxIn class
46         /// </summary>
47         public CTxIn()
48         {
49             txID = new Hash256();
50             scriptSig = new CScript();
51         }
52
53         /// <summary>
54         /// Read vin list from byte sequence.
55         /// </summary>
56         /// <param name="wBytes">Reference to byte sequence</param>
57         /// <returns>Inputs array</returns>
58         public static CTxIn[] ReadTxInList(ref WrappedList<byte> wBytes)
59         {
60             CTxIn[] vin;
61
62             // Get amount
63             int nInputs = (int)VarInt.ReadVarInt(ref wBytes);
64             vin = new CTxIn[nInputs];
65
66             for (int nIndex = 0; nIndex < nInputs; nIndex++)
67             {
68                 // Fill inputs array
69                 vin[nIndex] = new CTxIn();
70
71                 vin[nIndex].txID = new Hash256(wBytes.GetItems(32));
72                 vin[nIndex].n = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
73                 vin[nIndex].scriptSig = new CScript(wBytes.GetItems((int)VarInt.ReadVarInt(ref wBytes)));
74                 vin[nIndex].nSequence = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
75             }
76
77             // Return inputs array
78             return vin;
79         }
80
81         /// <summary>
82         /// Get raw bytes representation of our input.
83         /// </summary>
84         /// <returns>Byte sequence.</returns>
85         public IList<byte> Bytes
86         {
87             get
88             {
89                 List<byte> inputBytes = new List<byte>();
90
91                 inputBytes.AddRange(txID.hashBytes); // Input transaction id
92                 inputBytes.AddRange(BitConverter.GetBytes(n)); // Output number
93
94                 List<byte> s = new List<byte>(scriptSig.Bytes);
95
96                 inputBytes.AddRange(VarInt.EncodeVarInt(s.Count)); // scriptSig length
97                 inputBytes.AddRange(s); // scriptSig
98                 inputBytes.AddRange(BitConverter.GetBytes(nSequence)); // Sequence
99
100                 return inputBytes;
101             }
102         }
103
104         public bool IsCoinBase
105         {
106             get { return txID.IsZero; }
107         }
108
109                 public override string ToString ()
110                 {
111                         StringBuilder sb = new StringBuilder ();
112
113             if (IsCoinBase)
114             {
115                 sb.AppendFormat("CTxIn(txId={0}, coinbase={2}, nSequence={3})", txID.ToString(), n, Interop.ToHex(scriptSig.Bytes), nSequence);
116             }
117             else
118             {
119                 sb.AppendFormat("CTxIn(txId={0}, n={1}, scriptSig={2}, nSequence={3})", txID.ToString(), n, scriptSig.ToString(), nSequence);
120             }
121
122                         return sb.ToString ();
123                 }
124
125         }
126 }
127