From: CryptoManiac Date: Sat, 12 Sep 2015 14:11:22 +0000 (+0300) Subject: Correct calculation of modifier checksums. X-Git-Url: https://git.novaco.in/?p=NovacoinLibrary.git;a=commitdiff_plain;h=b661b6a5e141152680be1cd09f584fc5cac7b8ad Correct calculation of modifier checksums. --- diff --git a/Novacoin/CBlockStore.cs b/Novacoin/CBlockStore.cs index 7439235..fde21c6 100644 --- a/Novacoin/CBlockStore.cs +++ b/Novacoin/CBlockStore.cs @@ -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 } diff --git a/Novacoin/DatabaseObjects.cs b/Novacoin/DatabaseObjects.cs index cb93d2d..57a47bd 100644 --- a/Novacoin/DatabaseObjects.cs +++ b/Novacoin/DatabaseObjects.cs @@ -502,6 +502,11 @@ namespace Novacoin } /// + /// Stake modifier checksum + /// + public uint nStakeModifierChecksum; + + /// /// Chain trust score /// [Ignore] diff --git a/Novacoin/StakeModifier.cs b/Novacoin/StakeModifier.cs index f706cf3..474e81d 100644 --- a/Novacoin/StakeModifier.cs +++ b/Novacoin/StakeModifier.cs @@ -415,7 +415,7 @@ namespace Novacoin /// /// Block cursor. /// Checksum value. - 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)