X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2FCBlock.cs;h=9bf7e360511138be2d36f284f93c73ef58d52cd7;hb=3aae916a057b494e197fc0adaaa5656880090565;hp=101d20ee6a613c3217e0922a131bff2e1de46ba9;hpb=161220f258cf9eb640d354951a48b45598301b1a;p=NovacoinLibrary.git diff --git a/Novacoin/CBlock.cs b/Novacoin/CBlock.cs index 101d20e..9bf7e36 100644 --- a/Novacoin/CBlock.cs +++ b/Novacoin/CBlock.cs @@ -47,6 +47,16 @@ namespace Novacoin /// public class CBlock { + /// + /// Maximum block size is 1Mb. + /// + public const uint nMaxBlockSize = 1000000; + + /// + /// Sanity threshold for amount of sigops. + /// + public const uint nMaxSigOps = 20000; + /// /// Block header. /// @@ -92,13 +102,7 @@ namespace Novacoin var reader = new BinaryReader(stream); // Fill the block header fields - header = new CBlockHeader(); - header.nVersion = reader.ReadUInt32(); - header.prevHash = new ScryptHash256(reader.ReadBytes(32)); - header.merkleRoot = new Hash256(reader.ReadBytes(32)); - header.nTime = reader.ReadUInt32(); - header.nBits = reader.ReadUInt32(); - header.nNonce = reader.ReadUInt32(); + header = new CBlockHeader(ref reader); // Parse transactions list vtx = CTransaction.ReadTransactionsList(ref reader); @@ -124,11 +128,11 @@ namespace Novacoin public bool CheckBlock(bool fCheckPOW = true, bool fCheckMerkleRoot = true, bool fCheckSig = true) { - var uniqueTX = new List(); // tx hashes + var uniqueTX = new List(); // tx hashes uint nSigOps = 0; // total sigops // Basic sanity checkings - if (vtx.Length == 0 || Size > 1000000) + if (vtx.Length == 0 || Size > nMaxBlockSize) { return false; } @@ -251,7 +255,7 @@ namespace Novacoin } // Reject block if validation would consume too much resources. - if (nSigOps > 50000) + if (nSigOps > nMaxSigOps) { return false; } @@ -265,9 +269,24 @@ namespace Novacoin return true; } - private bool CheckProofOfWork(ScryptHash256 hash, uint nBits) + private bool CheckProofOfWork(uint256 hash, uint nBits) { - // TODO: stub! + uint256 nTarget = new uint256(); + nTarget.Compact = nBits; + + // Check range + if (nTarget > NetUtils.nProofOfWorkLimit) + { + // nBits below minimum work + return false; + } + + // Check proof of work matches claimed amount + if (hash > nTarget) + { + // hash doesn't match nBits + return false; + } return true; } @@ -401,7 +420,7 @@ namespace Novacoin /// /// Merkle root /// - public Hash256 hashMerkleRoot + public uint256 hashMerkleRoot { get { @@ -409,7 +428,7 @@ namespace Novacoin foreach (var tx in vtx) { - merkleTree.AddRange(Hash256.ComputeRaw256(tx)); + merkleTree.AddRange(CryptoUtils.ComputeHash256(tx)); } int levelOffset = 0; @@ -422,12 +441,12 @@ namespace Novacoin var left = merkleTree.GetRange((levelOffset + nLeft) * 32, 32).ToArray(); var right = merkleTree.GetRange((levelOffset + nRight) * 32, 32).ToArray(); - merkleTree.AddRange(Hash256.ComputeRaw256(ref left, ref right)); + merkleTree.AddRange(CryptoUtils.ComputeHash256(ref left, ref right)); } levelOffset += nLevelSize; } - return (merkleTree.Count == 0) ? new Hash256() : new Hash256(merkleTree.GetRange(merkleTree.Count-32, 32).ToArray()); + return (merkleTree.Count == 0) ? 0 : (uint256)merkleTree.GetRange(merkleTree.Count-32, 32).ToArray(); } }