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();
}
}
}