X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fkernel.cpp;h=58a4b88538bf9ae0b965e96ae59bf27219ffd26c;hb=56d7e2c8baefaa0229b42cef66c97da22c42dd61;hp=4055314749a6bf60d9d75ab872a31c7d688d2241;hpb=1e7993f68d8ada2bf6a523ac3b4afec64157f8ed;p=novacoin.git diff --git a/src/kernel.cpp b/src/kernel.cpp index 4055314..58a4b88 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -469,7 +469,7 @@ bool ScanForStakeKernelHash(MetaMap &mapMeta, uint32_t nBits, uint32_t nTime, ui bnTargetPerCoinDay.SetCompact(nBits); int64_t nValueIn = pcoin.first->vout[pcoin.second].nValue; - // Search backward in time from the given timestamp + // Search backward in time from the given timestamp // Search nSearchInterval seconds back up to nMaxStakeSearchInterval // Stopping search in case of shutting down or cache invalidation for (unsigned int n=0; n &solution) +// Precompute hashing state for static part of kernel +void GetKernelMidstate(uint64_t nStakeModifier, uint32_t nBlockTime, uint32_t nTxOffset, uint32_t nInputTxTime, uint32_t nOut, SHA256_CTX &ctx) { - CBlock block; - CTxIndex txindex; - uint256 hashProofOfStake; - - int nTime = GetTime(); - - CTxDB txdb("r"); - - // Load transaction index item - if (!txdb.ReadTxIndex(tx.GetHash(), txindex)) - return false; - - // Read block header - if (!block.ReadFromDisk(txindex.pos.nFile, txindex.pos.nBlockPos, false)) - return false; - - uint64_t nStakeModifier = 0; - if (!GetKernelStakeModifier(block.GetHash(), nStakeModifier)) - return false; - - // Transaction offset inside block - uint32_t nTxOffset = txindex.pos.nTxPos - txindex.pos.nBlockPos; + // Build static part of kernel + CDataStream ssKernel(SER_GETHASH, 0); + ssKernel << nStakeModifier; + ssKernel << nBlockTime << nTxOffset << nInputTxTime << nOut; + CDataStream::const_iterator it = ssKernel.begin(); + + // Init sha256 context and update it + // with first 24 bytes of kernel + SHA256_Init(&ctx); + SHA256_Update(&ctx, (unsigned char*)&it[0], 8 + 16); +} - uint32_t nBlockTime = block.nTime; +// Scan given midstate for solution +bool ScanMidstateForward(SHA256_CTX &ctx, uint32_t nBits, uint32_t nInputTxTime, int64_t nValueIn, std::pair &SearchInterval, std::pair &solution) +{ CBigNum bnTargetPerCoinDay; bnTargetPerCoinDay.SetCompact(nBits); - int64_t nValueIn = tx.vout[nOut].nValue; + + // Get maximum possible target to filter out the majority of obviously insufficient hashes + CBigNum bnMaxTargetPerCoinDay = bnTargetPerCoinDay * CBigNum(nValueIn) * nStakeMaxAge / COIN / (24 * 60 * 60); + uint256 maxTarget = bnMaxTargetPerCoinDay.getuint256(); + + SHA256_CTX ctxCopy = ctx; // Search forward in time from the given timestamp // Stopping search in case of shutting down - for (unsigned int n=0; n maxTarget) + continue; + + CBigNum bnCoinDayWeight = CBigNum(nValueIn) * GetWeight((int64_t)nInputTxTime, (int64_t)nTimeTx) / COIN / (24 * 60 * 60); + CBigNum bnTargetProofOfStake = bnCoinDayWeight * bnTargetPerCoinDay; if (bnTargetProofOfStake >= CBigNum(hashProofOfStake)) { @@ -614,7 +617,7 @@ uint32_t GetStakeModifierChecksum(const CBlockIndex* pindex) ss << pindex->nFlags << pindex->hashProofOfStake << pindex->nStakeModifier; uint256 hashChecksum = Hash(ss.begin(), ss.end()); hashChecksum >>= (256 - 32); - return hashChecksum.Get64(); + return static_cast(hashChecksum.Get64()); } // Check stake modifier hard checkpoints