Correct calculation of modifier checksums.
authorCryptoManiac <balthazar.ad@gmail.com>
Sat, 12 Sep 2015 14:11:22 +0000 (17:11 +0300)
committerCryptoManiac <balthazar.ad@gmail.com>
Sat, 12 Sep 2015 14:11:22 +0000 (17:11 +0300)
Novacoin/CBlockStore.cs
Novacoin/DatabaseObjects.cs
Novacoin/StakeModifier.cs

index 7439235..fde21c6 100644 (file)
@@ -197,6 +197,8 @@ namespace Novacoin
                 // Init list of block items
                 foreach (var item in blockTreeItems)
                 {
+                    item.nStakeModifierChecksum = StakeModifier.GetModifierChecksum(item);
+
                     blockMap.TryAdd(item.Hash, item);
 
                     if (item.IsProofOfStake)
@@ -359,9 +361,9 @@ namespace Novacoin
             }
 
             itemTemplate.SetStakeModifier(nStakeModifier, fGeneratedStakeModifier);
+            itemTemplate.nStakeModifierChecksum = StakeModifier.GetModifierChecksum(itemTemplate);
 
-            var nChecksum = StakeModifier.GetModifierChecksum(ref itemTemplate);
-            if (!ModifierCheckpoints.Verify(itemTemplate.nHeight, nChecksum))
+            if (!ModifierCheckpoints.Verify(itemTemplate.nHeight, itemTemplate.nStakeModifierChecksum))
             {
                 return false; // Stake modifier checkpoints mismatch
             }
index cb93d2d..57a47bd 100644 (file)
@@ -502,6 +502,11 @@ namespace Novacoin
         }
 
         /// <summary>
+        /// Stake modifier checksum
+        /// </summary>
+        public uint nStakeModifierChecksum;
+
+        /// <summary>
         /// Chain trust score
         /// </summary>
         [Ignore]
index f706cf3..474e81d 100644 (file)
@@ -415,7 +415,7 @@ namespace Novacoin
         /// </summary>
         /// <param name="cursorBlock">Block cursor.</param>
         /// <returns>Checksum value.</returns>
-        public static uint GetModifierChecksum(ref CBlockStoreItem cursorBlock)
+        public static uint GetModifierChecksum(CBlockStoreItem cursorBlock)
         {
             Contract.Assert(cursorBlock.prev != null || (uint256)cursorBlock.Hash == NetInfo.nHashGenesisBlock);
 
@@ -428,8 +428,7 @@ namespace Novacoin
             // Hash previous checksum with flags, hashProofOfStake and nStakeModifier
             if (cursorBlock.prev != null)
             {
-                var prevCursor = cursorBlock.prev;
-                bw.Write(GetModifierChecksum(ref prevCursor));
+                bw.Write(cursorBlock.prev.nStakeModifierChecksum);
             }
 
             bw.Write((uint)cursorBlock.BlockTypeFlag);
@@ -441,7 +440,7 @@ namespace Novacoin
 
             hashChecksum >>= (256 - 32);
 
-            return hashChecksum.Low32;
+            return (uint)hashChecksum.Low64;
         }
 
         public static bool CheckProofOfStake(CTransaction tx, uint nBits, out uint256 hashProofOfStake, out uint256 targetProofOfStake)