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;
///
/// Parse byte sequence and initialize new block instance
///
///
public CBlock (List blockBytes)
{
header = new CBlockHeader();
WrappedList wBytes = new WrappedList(blockBytes);
// Fill the block header fields
header.nVersion = BitConverter.ToUInt32(wBytes.GetItems(4), 0);
header.prevHash = new Hash256(wBytes.GetItems(32));
header.merkleRoot = new Hash256(wBytes.GetItems(32));
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
vtx = CTransaction.ReadTransactionsList(ref wBytes);
// Read block signature
signature = wBytes.GetItems((int)VarInt.ReadVarInt(ref wBytes));
}
///
/// 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();
}
}
}