2 * Novacoin classes library
3 * Copyright (C) 2015 Alex D. (balthazar.ad@gmail.com)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 using System.Collections.Generic;
26 /// Transaction input.
31 /// Previous input data
33 public COutPoint prevout;
36 /// First half of script, signatures for the scriptPubKey
38 public CScript scriptSig;
41 /// Transaction variant number, irrelevant if nLockTime isn't specified. Its value is 0xffffffff by default.
43 public uint nSequence = uint.MaxValue;
46 /// Initialize new CTxIn instance as copy of another one.
48 /// <param name="i">CTxIn instance.</param>
51 prevout = new COutPoint(i.prevout);
52 scriptSig = i.scriptSig;
53 nSequence = i.nSequence;
57 /// Initialize an empty instance of CTxIn class
61 prevout = new COutPoint();
62 scriptSig = new CScript();
66 /// Read vin list from byte sequence.
68 /// <param name="wBytes">Reference to byte sequence</param>
69 /// <returns>Inputs array</returns>
70 public static CTxIn[] ReadTxInList(ref ByteQueue wBytes)
73 int nInputs = (int)wBytes.GetVarInt();
74 var vin = new CTxIn[nInputs];
76 for (int nIndex = 0; nIndex < nInputs; nIndex++)
79 vin[nIndex] = new CTxIn();
80 vin[nIndex].prevout = new COutPoint(wBytes.Get(36));
81 vin[nIndex].scriptSig = new CScript(wBytes.Get((int)wBytes.GetVarInt()));
82 vin[nIndex].nSequence = BitConverter.ToUInt32(wBytes.Get(4), 0);
85 // Return inputs array
95 int nSize = 40; // COutPoint, nSequence
96 nSize += VarInt.GetEncodedSize(scriptSig.Size);
97 nSize += scriptSig.Size;
104 /// Get raw bytes representation of our input.
106 /// <returns>Byte sequence.</returns>
107 public static implicit operator byte[] (CTxIn input)
109 var inputBytes = new List<byte>();
111 inputBytes.AddRange((byte[])input.prevout); // prevout
113 var s = (byte[])input.scriptSig;
114 inputBytes.AddRange(VarInt.EncodeVarInt(s.Length)); // scriptSig length
115 inputBytes.AddRange(s); // scriptSig
116 inputBytes.AddRange(BitConverter.GetBytes(input.nSequence)); // Sequence
118 return inputBytes.ToArray();
124 get { return (nSequence == uint.MaxValue); }
126 public override string ToString ()
128 StringBuilder sb = new StringBuilder ();
130 sb.AppendFormat("CTxIn(");
131 sb.Append(prevout.ToString());
135 sb.AppendFormat(", coinbase={0}", Interop.ToHex((byte[])scriptSig));
139 sb.AppendFormat(", scriptsig={0}", scriptSig.ToString());
142 if (nSequence != uint.MaxValue)
144 sb.AppendFormat(", nSequence={0}", nSequence);
150 return sb.ToString ();