Initial implementation of stake modifier calculation.
[NovacoinLibrary.git] / Novacoin / CBlock.cs
index 3f72c68..9bf7e36 100644 (file)
@@ -128,7 +128,7 @@ namespace Novacoin
 
         public bool CheckBlock(bool fCheckPOW = true, bool fCheckMerkleRoot = true, bool fCheckSig = true)
         {
-            var uniqueTX = new List<Hash256>(); // tx hashes
+            var uniqueTX = new List<uint256>(); // tx hashes
             uint nSigOps = 0; // total sigops
 
             // Basic sanity checkings
@@ -269,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;
         }
@@ -405,7 +420,7 @@ namespace Novacoin
         /// <summary>
         /// Merkle root
         /// </summary>
-        public Hash256 hashMerkleRoot
+        public uint256 hashMerkleRoot
         {
             get {
                 
@@ -413,7 +428,7 @@ namespace Novacoin
 
                 foreach (var tx in vtx)
                 {
-                    merkleTree.AddRange(Hash256.ComputeRaw256(tx));
+                    merkleTree.AddRange(CryptoUtils.ComputeHash256(tx));
                 }
 
                 int levelOffset = 0;
@@ -426,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();
             }
         }