X-Git-Url: https://git.novaco.in/?p=NovacoinLibrary.git;a=blobdiff_plain;f=Novacoin%2FCBlockStore.cs;h=a9c504cdfd310a048d42043a18c9adabc1e4bd26;hp=279edc7245e07706ff6d94658031ba2ee69be05e;hb=7726cc3ff2ad58160957235de7c08f1e704c8532;hpb=729e4ae7db34bd869fab8079f08968175fe3e5e8 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;