Use CScript for vin and vout,
[NovacoinLibrary.git] / Novacoin / CBlock.cs
1 \feffusing System;
2 using System.Text;
3 using System.Collections.Generic;
4
5 namespace Novacoin
6 {
7         /// <summary>
8         /// Represents the block. Block consists of header, transaction array and header signature.
9         /// </summary>
10         public class CBlock
11         {
12                 /// <summary>
13                 /// Block header.
14                 /// </summary>
15                 public CBlockHeader header;
16
17                 /// <summary>
18                 /// Transactions array.
19                 /// </summary>
20                 public CTransaction[] vtx;
21
22                 /// <summary>
23                 /// Block header signature.
24                 /// </summary>
25                 public byte[] signature;
26
27         /// <summary>
28         /// Parse byte sequence and initialize new block instance
29         /// </summary>
30         /// <param name="blockBytes"></param>
31                 public CBlock (IList<byte> blockBytes)
32                 {
33             header = new CBlockHeader();
34
35             WrappedList<byte> wBytes = new WrappedList<byte>(blockBytes);
36
37             // Fill the block header fields
38             header.nVersion = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
39             header.prevHash = new Hash256(wBytes.GetItems(32));
40             header.merkleRoot = new Hash256(wBytes.GetItems(32));
41             header.nTime = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
42             header.nBits = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
43             header.nNonce = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
44
45             // Parse transactions list
46             vtx = CTransaction.ReadTransactionsList(ref wBytes);
47
48             // Read block signature
49             signature = wBytes.GetItems((int)VarInt.ReadVarInt(ref wBytes));
50                 }
51
52         /// <summary>
53         /// Convert current instance into sequence of bytes
54         /// </summary>
55         /// <returns>Byte sequence</returns>
56         public IList<byte> Bytes 
57         {
58             get
59             {
60                 List<byte> r = new List<byte>();
61
62                 r.AddRange(header.Bytes);
63                 r.AddRange(VarInt.EncodeVarInt(vtx.LongLength)); // transactions count
64
65                 foreach (CTransaction tx in vtx)
66                 {
67                     r.AddRange(tx.Bytes);
68                 }
69
70                 r.AddRange(VarInt.EncodeVarInt(signature.LongLength));
71                 r.AddRange(signature);
72
73                 return r;
74             }
75         }
76
77         public override string ToString()
78         {
79             StringBuilder sb = new StringBuilder();
80
81             sb.AppendFormat("CBlock(\n header={0},\n", header.ToString());
82
83             foreach(CTransaction tx in vtx)
84             {
85                 sb.AppendFormat("{0},\n", tx.ToString());
86             }
87
88             sb.AppendFormat("signature={0})\n", Interop.ToHex(signature));
89             
90             // TODO
91             return sb.ToString();
92         }
93         }
94 }
95