using System; using System.Text; using System.Collections.Generic; namespace Novacoin { /// /// Represents the block. Block consists of header, transaction array and header signature. /// public class CBlock { /// /// Block header. /// public CBlockHeader header; /// /// Transactions array. /// public CTransaction[] vtx; /// /// Block header signature. /// public byte[] signature; public CBlock(CBlock b) { header = new CBlockHeader(b.header); for (int i = 0; i < b.vtx.Length; i++) { vtx[i] = new CTransaction(b.vtx[i]); } b.signature.CopyTo(signature, 0); } /// /// Parse byte sequence and initialize new block instance /// /// public CBlock (IList blockBytes) { ByteQueue wBytes = new ByteQueue(blockBytes); // Fill the block header fields header = new CBlockHeader(wBytes.Get(80)); // Parse transactions list vtx = CTransaction.ReadTransactionsList(ref wBytes); // Read block signature signature = wBytes.Get((int)wBytes.GetVarInt()); } public CBlock() { // Initialize empty array of transactions. Please note that such // configuration is not valid real block since it has to provide // at least one transaction. vtx = new CTransaction[0]; } /// /// Convert current instance into sequence of bytes /// /// Byte sequence public IList Bytes { get { List r = new List(); 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(); } } }