X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2FCBlockHeader.cs;h=d56df3372466e8c6635bf3ac701e8870129c3490;hb=1f0b7fb3d5fc3969952610cebe1b173dbece722b;hp=2335e7d874c089ae989be192514703dfd477113d;hpb=c5c813f88fd93f2360d503f7165cdbcc97189459;p=NovacoinLibrary.git diff --git a/Novacoin/CBlockHeader.cs b/Novacoin/CBlockHeader.cs index 2335e7d..d56df33 100644 --- a/Novacoin/CBlockHeader.cs +++ b/Novacoin/CBlockHeader.cs @@ -1,45 +1,143 @@ -using System; +/** + * Novacoin classes library + * Copyright (C) 2015 Alex D. (balthazar.ad@gmail.com) + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +using System; +using System.Text; using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.IO; namespace Novacoin { - /// - /// Block header - /// - public class CBlockHeader + /// + /// Block header + /// + public class CBlockHeader { /// /// Version of block schema. /// - public uint nVersion = 6; + public uint nVersion; /// /// Previous block hash. /// - public Hash256 prevHash = new Hash256(); + public ScryptHash256 prevHash; /// /// Merkle root hash. /// - public Hash256 merkleRoot = new Hash256(); + public Hash256 merkleRoot; /// /// Block timestamp. /// - public uint nTime = 0; + public uint nTime; /// /// Compressed difficulty representation. /// - public uint nBits = 0; + public uint nBits; /// /// Nonce counter. /// - public uint nNonce = 0; + public uint nNonce; + /// + /// Initialize an empty instance + /// public CBlockHeader () { + nVersion = 6; + prevHash = new ScryptHash256(); + merkleRoot = new Hash256(); + nTime = Interop.GetTime(); + nBits = 0; + nNonce = 0; } + + public CBlockHeader(CBlockHeader h) + { + nVersion = h.nVersion; + prevHash = new ScryptHash256(h.prevHash); + merkleRoot = new Hash256(h.merkleRoot); + nTime = h.nTime; + nBits = h.nBits; + nNonce = h.nNonce; + } + + /// + /// Init block header with bytes. + /// + /// Byte array. + public CBlockHeader(byte[] bytes) + { + Contract.Requires(bytes.Length == 80, "Any valid block header is exactly 80 bytes long."); + + var stream = new MemoryStream(bytes); + var reader = new BinaryReader(stream); + + nVersion = reader.ReadUInt32(); + prevHash = new ScryptHash256(reader.ReadBytes(32)); + merkleRoot = new Hash256(reader.ReadBytes(32)); + nTime = reader.ReadUInt32(); + nBits = reader.ReadUInt32(); + nNonce = reader.ReadUInt32(); + + reader.Close(); + } + + /// + /// Convert current block header instance into sequence of bytes + /// + /// Byte sequence + public static implicit operator byte[] (CBlockHeader h) + { + var stream = new MemoryStream(); + var writer = new BinaryWriter(stream); + + writer.Write(h.nVersion); + writer.Write(h.prevHash); + writer.Write(h.merkleRoot); + writer.Write(h.nTime); + writer.Write(h.nBits); + writer.Write(h.nNonce); + + var resultBytes = stream.ToArray(); + + writer.Close(); + + return resultBytes; + } + + public ScryptHash256 Hash + { + get { + return ScryptHash256.Compute256(this); + } + } + + public override string ToString() + { + var sb = new StringBuilder(); + sb.AppendFormat("CBlockHeader(nVersion={0}, prevHash={1}, merkleRoot={2}, nTime={3}, nBits={4}, nNonce={5})", nVersion, prevHash.ToString(), merkleRoot.ToString(), nTime, nBits, nNonce); + return sb.ToString(); + } } }