X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2FCTxOut.cs;h=eb24845cbd503f15d2c0b6714fdb512a496ba074;hb=be9d844557911f95165d2c9875c4f5b2822cfc92;hp=679c692b83a645969f3f5b6e3fb94c0cb7e3112d;hpb=b31df5639083b6ffdf8b9f74973c8233b6c05818;p=NovacoinLibrary.git diff --git a/Novacoin/CTxOut.cs b/Novacoin/CTxOut.cs index 679c692..eb24845 100644 --- a/Novacoin/CTxOut.cs +++ b/Novacoin/CTxOut.cs @@ -1,6 +1,25 @@ -using System; +/** + * Novacoin classes library + * Copyright (C) 2015 Alex D. (balthazar.ad@gmail.com) + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +using System; using System.Text; using System.Collections.Generic; +using System.IO; namespace Novacoin { @@ -12,32 +31,118 @@ namespace Novacoin /// /// Input value. /// - private ulong nValue = 0; + public ulong nValue = ulong.MaxValue; /// /// Second half of script which contains spending instructions. /// - private byte[] scriptPubKey; + public CScript scriptPubKey; - public CTxOut () - { - } + /// + /// Initialize new CTxOut instance as a copy of another instance. + /// + /// CTxOut instance. + public CTxOut(CTxOut o) + { + nValue = o.nValue; + scriptPubKey = o.scriptPubKey; + } + + /// + /// Initialize an empty instance of CTxOut class + /// + public CTxOut() + { + SetEmpty(); + } + + /// + /// Read vout list from byte sequence. + /// + /// Reference to byte sequence + /// Outputs array + public static CTxOut[] ReadTxOutList(ref ByteQueue wBytes) + { + int nOutputs = (int)wBytes.GetVarInt(); + var vout =new CTxOut[nOutputs]; + + for (int nIndex = 0; nIndex < nOutputs; nIndex++) + { + // Fill outputs array + vout[nIndex] = new CTxOut(); + vout[nIndex].nValue = BitConverter.ToUInt64(wBytes.Get(8), 0); + + int nScriptPKLen = (int)wBytes.GetVarInt(); + vout[nIndex].scriptPubKey = new CScript(wBytes.Get(nScriptPKLen)); + } + + return vout; + } - public IList ToBytes() + /// + /// Get raw bytes representation of our output. + /// + /// Byte sequence. + public static implicit operator byte[] (CTxOut output) { - List resultBytes = new List(); + var stream = new MemoryStream(); + var writer = new BinaryWriter(stream); - resultBytes.AddRange(Interop.LEBytes(nValue)); // txout value - resultBytes.AddRange(VarInt.EncodeVarInt(scriptPubKey.LongLength)); // scriptPubKey length - resultBytes.AddRange(scriptPubKey); // scriptPubKey + writer.Write(output.nValue); // txout value + writer.Write(VarInt.EncodeVarInt(output.scriptPubKey.Size)); // scriptPubKey length + writer.Write(output.scriptPubKey); // scriptPubKey + + var resultBytes = stream.ToArray(); + + writer.Close(); return resultBytes; } - public override string ToString () + /// + /// Null prevouts have -1 value + /// + public void SetNull() + { + nValue = ulong.MaxValue; + scriptPubKey = new CScript(); + } + + /// + /// Empty outputs have zero value and empty scriptPubKey + /// + public void SetEmpty() + { + nValue = 0; + scriptPubKey = new CScript(); + } + + public bool IsNull + { + get { return (nValue == ulong.MaxValue); } + } + + public bool IsEmpty + { + get { return nValue == 0 && scriptPubKey.IsNull; } + } + + /// + /// Serialized size + /// + public int Size + { + get + { + var nScriptSize = scriptPubKey.Size; + return 8 + VarInt.GetEncodedSize(nScriptSize) + nScriptSize; + } + } + + public override string ToString () { - StringBuilder sb = new StringBuilder (); - sb.AppendFormat ("CTxOut(nValue={0},scriptPubKey={1}", nValue, scriptPubKey.ToString()); + var sb = new StringBuilder (); + sb.AppendFormat ("CTxOut(nValue={0}, scriptPubKey={1})", nValue, scriptPubKey.ToString()); return sb.ToString (); }