From 7726cc3ff2ad58160957235de7c08f1e704c8532 Mon Sep 17 00:00:00 2001 From: CryptoManiac Date: Wed, 2 Sep 2015 23:39:08 +0300 Subject: [PATCH] Add new block cursor helper properties, start implementation of StakeModifier calculation. --- Novacoin/CBlockStore.cs | 107 +++++++++++++++++++++++++++++++++++++++++++-- Novacoin/Novacoin.csproj | 1 + 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/Novacoin/CBlockStore.cs b/Novacoin/CBlockStore.cs index 279edc7..a9c504c 100644 --- a/Novacoin/CBlockStore.cs +++ b/Novacoin/CBlockStore.cs @@ -16,7 +16,7 @@ namespace Novacoin /// Block headers table /// [Table("BlockStorage")] - class CBlockStoreItem + public class CBlockStoreItem { /// /// Item ID in the database @@ -207,6 +207,72 @@ namespace Novacoin return false; } } + + /// + /// Previous block cursor + /// + public public CBlockStoreItem prev { + get { return CBlockStore.Instance.GetCursor(prevHash); } + } + + /// + /// STake modifier generation flag + /// + public bool GeneratedStakeModifier + { + get { return (BlockTypeFlag & BlockType.BLOCK_STAKE_MODIFIER) != 0; } + } + + /// + /// Sets stake modifier and flag. + /// + /// New stake modifier. + /// Set generation flag? + public void SetStakeModifier(long nModifier, bool fGeneratedStakeModifier) + { + nStakeModifier = nModifier; + if (fGeneratedStakeModifier) + BlockTypeFlag |= BlockType.BLOCK_STAKE_MODIFIER; + } + + /// + /// Set entropy bit. + /// + /// Entropy bit value (0 or 1). + /// False if value is our of range. + public bool SetStakeEntropyBit(byte nEntropyBit) + { + if (nEntropyBit > 1) + return false; + BlockTypeFlag |= (nEntropyBit != 0 ? BlockType.BLOCK_STAKE_ENTROPY : 0); + return true; + } + + /// + /// Set proof-of-stake flag. + /// + public void SetProofOfStake() + { + BlockTypeFlag |= BlockType.BLOCK_PROOF_OF_STAKE; + } + + /// + /// Block has no proof-of-stake flag. + /// + public bool IsProofOfWork + { + get { return (BlockTypeFlag & BlockType.BLOCK_PROOF_OF_STAKE) != 0; } + } + + /// + /// Block has proof-of-stake flag set. + /// + public bool IsProofOfStake + { + get { return (BlockTypeFlag & BlockType.BLOCK_PROOF_OF_STAKE) == 0; } + } + + } /// @@ -214,10 +280,9 @@ namespace Novacoin /// public enum BlockType { - PROOF_OF_WORK, - PROOF_OF_WORK_MODIFIER, - PROOF_OF_STAKE, - PROOF_OF_STAKE_MODIFIER + BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block + BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier + BLOCK_STAKE_MODIFIER = (1 << 2), // regenerated stake modifier }; /// @@ -567,6 +632,38 @@ namespace Novacoin return false; } + /// + /// Get block cursor from map. + /// + /// block hash + /// Cursor or null + public CBlockStoreItem GetCursor(uint256 blockHash) + { + if (blockHash == 0) + { + // Genesis block has zero prevHash and no parent. + return null; + } + + // First, check our block map. + CBlockStoreItem item = null; + if (blockMap.TryGetValue(blockHash, out item)) + { + return item; + } + + // Trying to get cursor from the database. + var QueryBlockCursor = dbConn.Query("select * from [BlockStorage] where [Hash] = ?", (byte[])blockHash); + + if (QueryBlockCursor.Count == 1) + { + return QueryBlockCursor[0]; + } + + // Nothing found. + return null; + } + public bool ProcessBlock(ref CBlock block) { var blockHash = block.header.Hash; diff --git a/Novacoin/Novacoin.csproj b/Novacoin/Novacoin.csproj index 34ef6c9..1990b60 100644 --- a/Novacoin/Novacoin.csproj +++ b/Novacoin/Novacoin.csproj @@ -123,6 +123,7 @@ + -- 1.7.1