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