X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fkernel.cpp;h=3267420d9d7d02f7e8b2ab3ccecbec2f1a63005b;hb=128b5cec3c7f20b34a40541be2236c11fe204df6;hp=e554aff15395b4ff4746c0cacaa50cf50d4b5ef8;hpb=5d466098ff30f0dece5d7e64e1b8b701aa088649;p=novacoin.git diff --git a/src/kernel.cpp b/src/kernel.cpp index e554aff..3267420 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -31,12 +31,15 @@ typedef std::map MapModifierCheckpoints; // Hard checkpoints of stake modifiers to ensure they are deterministic static std::map mapStakeModifierCheckpoints = boost::assign::map_list_of - ( 0, 0x0e00670bu ) + ( 0, 0x0e00670bu ) ( 12661, 0x5d84115du ) (143990, 0x9c592c78u ) (149000, 0x48f2bdc4u ) (160000, 0x789df0f0u ) (200000, 0x01ec1503u ) + (221047, 0x0b39ef50u ) + (243100, 0xe928d83au ) + (532000, 0x3e5c2b81u ) ; // Hard checkpoints of stake modifiers to ensure they are deterministic (testNet) @@ -161,13 +164,13 @@ static bool SelectBlockFromCandidates(vector >& vSortedBy if (fSelected && hashSelection < hashBest) { hashBest = hashSelection; - *pindexSelected = (const CBlockIndex*) pindex; + *pindexSelected = pindex; } else if (!fSelected) { fSelected = true; hashBest = hashSelection; - *pindexSelected = (const CBlockIndex*) pindex; + *pindexSelected = pindex; } } if (fDebug && GetBoolArg("-printstakemodifier")) @@ -433,9 +436,13 @@ bool ScanKernelForward(unsigned char *kernel, uint32_t nBits, uint32_t nInputTxT // TODO: custom threads amount uint32_t nThreads = boost::thread::hardware_concurrency(); + if (nThreads == 0) + { + nThreads = 1; + printf("Warning: hardware_concurrency() failed in %s:%d\n", __FILE__, __LINE__); + } uint32_t nPart = (SearchInterval.second - SearchInterval.first) / nThreads; - KernelWorker *workers = new KernelWorker[nThreads]; boost::thread_group group; @@ -468,53 +475,6 @@ bool ScanKernelForward(unsigned char *kernel, uint32_t nBits, uint32_t nInputTxT return true; } -// Scan given midstate for solution -bool ScanContextBackward(SHA256_CTX &ctx, uint32_t nBits, uint32_t nInputTxTime, int64_t nValueIn, std::pair &SearchInterval, std::pair &solution) -{ - CBigNum bnTargetPerCoinDay; - bnTargetPerCoinDay.SetCompact(nBits); - - // Get maximum possible target to filter out the majority of obviously insufficient hashes - CBigNum bnMaxTargetPerCoinDay = bnTargetPerCoinDay * CBigNum(nValueIn) * nStakeMaxAge / COIN / nOneDay; - uint256 maxTarget = bnMaxTargetPerCoinDay.getuint256(); - - SHA256_CTX ctxCopy = ctx; - - // Search backward in time from the given timestamp - // Stopping search in case of shutting down - for (uint32_t nTimeTx=SearchInterval.first; nTimeTx>SearchInterval.second && !fShutdown; nTimeTx--) - { - // Complete first hashing iteration - uint256 hash1; - SHA256_Update(&ctxCopy, (unsigned char*)&nTimeTx, 4); - SHA256_Final((unsigned char*)&hash1, &ctxCopy); - - // Restore context - ctxCopy = ctx; - - // Finally, calculate kernel hash - uint256 hashProofOfStake; - SHA256((unsigned char*)&hash1, sizeof(hashProofOfStake), (unsigned char*)&hashProofOfStake); - - // Skip if hash doesn't satisfy the maximum target - if (hashProofOfStake > maxTarget) - continue; - - CBigNum bnCoinDayWeight = CBigNum(nValueIn) * GetWeight((int64_t)nInputTxTime, (int64_t)nTimeTx) / COIN / nOneDay; - CBigNum bnTargetProofOfStake = bnCoinDayWeight * bnTargetPerCoinDay; - - if (bnTargetProofOfStake >= CBigNum(hashProofOfStake)) - { - solution.first = hashProofOfStake; - solution.second = nTimeTx; - - return true; - } - } - - return false; -} - // Check kernel hash target and coinstake signature bool CheckProofOfStake(const CTransaction& tx, unsigned int nBits, uint256& hashProofOfStake, uint256& targetProofOfStake) {