Use GetProofOfStakeHash
[NovacoinLibrary.git] / Novacoin / StakeModifier.cs
index 944fd36..882a699 100644 (file)
@@ -295,9 +295,12 @@ namespace Novacoin
         /// The stake modifier used to hash for a stake kernel is chosen as the stake
         /// modifier about a selection interval later than the coin generating the kernel
         /// </summary>
-        static bool GetKernelStakeModifier(uint256 hashBlockFrom, ref long nStakeModifier, ref uint nStakeModifierHeight, ref uint nStakeModifierTime)
+        static bool GetKernelStakeModifier(uint256 hashBlockFrom, out long nStakeModifier, out uint nStakeModifierHeight, out uint nStakeModifierTime)
         {
             nStakeModifier = 0;
+            nStakeModifierTime = 0;
+            nStakeModifierHeight = 0;
+
             var cursorFrom = CBlockStore.Instance.GetMapCursor(hashBlockFrom);
             if (cursorFrom == null)
             {
@@ -330,16 +333,18 @@ namespace Novacoin
             return true;
         }
 
-        public static bool GetKernelStakeModifier(uint256 hashBlockFrom, ref long nStakeModifier)
+        public static bool GetKernelStakeModifier(uint256 hashBlockFrom, out long nStakeModifier)
         {
             uint nStakeModifierHeight = 0;
             uint nStakeModifierTime = 0;
 
-            return GetKernelStakeModifier(hashBlockFrom, ref nStakeModifier, ref nStakeModifierHeight, ref nStakeModifierTime);
+            return GetKernelStakeModifier(hashBlockFrom, out nStakeModifier, out nStakeModifierHeight, out nStakeModifierTime);
         }
 
-        public static bool CheckStakeKernelHash(uint nBits, uint256 hashBlockFrom, uint nTimeBlockFrom, uint nTxPrevOffset, CTransaction txPrev, COutPoint prevout, uint nTimeTx, ref uint256 hashProofOfStake, ref uint256 targetProofOfStake)
+        public static bool CheckStakeKernelHash(uint nBits, uint256 hashBlockFrom, uint nTimeBlockFrom, uint nTxPrevOffset, CTransaction txPrev, COutPoint prevout, uint nTimeTx, out uint256 hashProofOfStake, out uint256 targetProofOfStake)
         {
+            hashProofOfStake = targetProofOfStake = 0;
+
             if (nTimeTx < txPrev.nTime)
             {
                 return false; // Transaction timestamp violation
@@ -359,10 +364,10 @@ namespace Novacoin
             targetProofOfStake = nCoinDayWeight * nTargetPerCoinDay;
 
             // Calculate hash
-            long nStakeModifier = 0;
-            uint nStakeModifierHeight = 0;
-            uint nStakeModifierTime = 0;
-            if (!GetKernelStakeModifier(hashBlockFrom, ref nStakeModifier, ref nStakeModifierHeight, ref nStakeModifierTime))
+            long nStakeModifier;
+            uint nStakeModifierTime;
+            uint nStakeModifierHeight;
+            if (!GetKernelStakeModifier(hashBlockFrom, out nStakeModifier, out nStakeModifierHeight, out nStakeModifierTime))
             {
                 return false;
             }
@@ -399,7 +404,7 @@ namespace Novacoin
             return Math.Min(nIntervalEnd - nIntervalBeginning - nStakeMinAge, nStakeMaxAge);
         }
 
-        internal static uint GetStakeModifierChecksum(CBlockStoreItem itemTemplate)
+        internal static uint GetStakeModifierChecksum(ref CBlockStoreItem itemTemplate)
         {
             Contract.Assert(itemTemplate.prev != null || (uint256)itemTemplate.Hash == NetInfo.nHashGenesisBlock);
 
@@ -432,8 +437,10 @@ namespace Novacoin
             return (uint)hashChecksum.Low64;
         }
 
-        internal static bool CheckProofOfStake(CTransaction tx, uint nBits, ref uint256 hashProofOfStake, ref uint256 targetProofOfStake)
+        public static bool CheckProofOfStake(CTransaction tx, uint nBits, out uint256 hashProofOfStake, out uint256 targetProofOfStake)
         {
+            hashProofOfStake = targetProofOfStake = 0;
+
             if (!tx.IsCoinStake)
             {
                 return false; // called on non-coinstake
@@ -444,9 +451,9 @@ namespace Novacoin
 
             // Read block header
 
-            long nBlockPos = 0;
-            CBlock block = null;
-            if (!CBlockStore.Instance.GetBlockByTransactionID(txin.prevout.hash, ref block, ref nBlockPos))
+            long nBlockPos;
+            CBlock block;
+            if (!CBlockStore.Instance.GetBlockByTransactionID(txin.prevout.hash, out block, out nBlockPos))
             {
                 return false; // unable to read block of previous transaction
             }
@@ -476,7 +483,7 @@ namespace Novacoin
                 return false; // vin[0] signature check failed
             }
 
-            if (!CheckStakeKernelHash(nBits, block.header.Hash, block.header.nTime, (uint)(nTxPos - nBlockPos), txPrev, txin.prevout, tx.nTime, ref hashProofOfStake, ref targetProofOfStake))
+            if (!CheckStakeKernelHash(nBits, block.header.Hash, block.header.nTime, (uint)(nTxPos - nBlockPos), txPrev, txin.prevout, tx.nTime, out hashProofOfStake, out targetProofOfStake))
             {
                 return false; // check kernel failed on coinstake 
             }