Use CScript for vin and vout,
[NovacoinLibrary.git] / Novacoin / CBlock.cs
index 136941a..17ffe6a 100644 (file)
@@ -1,4 +1,5 @@
 \feffusing System;
+using System.Text;
 using System.Collections.Generic;
 
 namespace Novacoin
@@ -16,7 +17,7 @@ namespace Novacoin
                /// <summary>
                /// Transactions array.
                /// </summary>
-               public CTransaction[] tx;
+               public CTransaction[] vtx;
 
                /// <summary>
                /// Block header signature.
@@ -27,26 +28,68 @@ namespace Novacoin
         /// Parse byte sequence and initialize new block instance
         /// </summary>
         /// <param name="blockBytes"></param>
-               public CBlock (List<byte> blockBytes)
+               public CBlock (IList<byte> blockBytes)
                {
             header = new CBlockHeader();
 
             WrappedList<byte> wBytes = new WrappedList<byte>(blockBytes);
 
             // Fill the block header fields
-            header.nVersion = Interop.LEBytesToUInt32(wBytes.GetItems(4));
+            header.nVersion = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
             header.prevHash = new Hash256(wBytes.GetItems(32));
             header.merkleRoot = new Hash256(wBytes.GetItems(32));
-            header.nTime = Interop.LEBytesToUInt32(wBytes.GetItems(4));
-            header.nBits = Interop.LEBytesToUInt32(wBytes.GetItems(4));
-            header.nNonce = Interop.LEBytesToUInt32(wBytes.GetItems(4));
+            header.nTime = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
+            header.nBits = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
+            header.nNonce = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
 
             // Parse transactions list
-            tx = CTransaction.ParseTransactionsList(ref wBytes);
+            vtx = CTransaction.ReadTransactionsList(ref wBytes);
 
             // Read block signature
             signature = wBytes.GetItems((int)VarInt.ReadVarInt(ref wBytes));
                }
+
+        /// <summary>
+        /// Convert current instance into sequence of bytes
+        /// </summary>
+        /// <returns>Byte sequence</returns>
+        public IList<byte> Bytes 
+        {
+            get
+            {
+                List<byte> r = new List<byte>();
+
+                r.AddRange(header.Bytes);
+                r.AddRange(VarInt.EncodeVarInt(vtx.LongLength)); // transactions count
+
+                foreach (CTransaction tx in vtx)
+                {
+                    r.AddRange(tx.Bytes);
+                }
+
+                r.AddRange(VarInt.EncodeVarInt(signature.LongLength));
+                r.AddRange(signature);
+
+                return r;
+            }
+        }
+
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+
+            sb.AppendFormat("CBlock(\n header={0},\n", header.ToString());
+
+            foreach(CTransaction tx in vtx)
+            {
+                sb.AppendFormat("{0},\n", tx.ToString());
+            }
+
+            sb.AppendFormat("signature={0})\n", Interop.ToHex(signature));
+            
+            // TODO
+            return sb.ToString();
+        }
        }
 }