X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fkernel.cpp;h=e554aff15395b4ff4746c0cacaa50cf50d4b5ef8;hb=5d466098ff30f0dece5d7e64e1b8b701aa088649;hp=3eb756981e7a9b83dbc460b05647d52790c2e4ba;hpb=bf625b55c2ab046459156d71863425fc592c0955;p=novacoin.git diff --git a/src/kernel.cpp b/src/kernel.cpp index 3eb7569..e554aff 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -1,10 +1,14 @@ // Copyright (c) 2012-2013 The PPCoin developers +// Copyright (c) 2013-2015 The Novacoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include "kernel.h" +#include "kernel_worker.h" #include "txdb.h" extern unsigned int nStakeMaxAge; @@ -423,173 +427,6 @@ bool CheckStakeKernelHash(uint32_t nBits, const CBlock& blockFrom, uint32_t nTxP return true; } - -#ifdef USE_YASM - -// SHA256 initial state -static const uint32_t init[8] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 }; - -// 8000000000000000000000000000000000000000000000000000000000000000000000e0 -static const uint32_t block1_suffix[9] = { 0x00000080, 0, 0, 0, 0, 0, 0, 0, 0xe0000000 }; - -// 8000000000000000000000000000000000000000000000000000000000000100 -static const uint32_t block2_suffix[8] = { 0x00000080, 0, 0, 0, 0, 0, 0, 0x00010000 }; - -extern "C" void sha256_avx(void *input_data, uint32_t digest[8], uint64_t num_blks); -extern "C" void sha256_avx_swap(void *input_data, uint32_t digest[8], uint64_t num_blks); - -class ScanMidstateWorker -{ -public: - ScanMidstateWorker() - { } - ScanMidstateWorker(unsigned char *kernel, uint32_t nBits, uint32_t nInputTxTime, int64_t nValueIn, uint32_t nIntervalBegin, uint32_t nIntervalEnd) - : kernel(kernel), nBits(nBits), nInputTxTime(nInputTxTime), bnValueIn(nValueIn), nIntervalBegin(nIntervalBegin), nIntervalEnd(nIntervalEnd) - { - solutions = vector >(); - } - - void Do() - { - SetThreadPriority(THREAD_PRIORITY_LOWEST); - - // Sha256 result buffer - uint32_t hashProofOfStake[8]; - - // Compute maximum possible target to filter out majority of obviously insufficient hashes - CBigNum bnTargetPerCoinDay; - bnTargetPerCoinDay.SetCompact(nBits); - - uint256 nMaxTarget = (bnTargetPerCoinDay * bnValueIn * nStakeMaxAge / COIN / nOneDay).getuint256(), - *pnHashProofOfStake = (uint256 *)&hashProofOfStake; - - uint8_t data_block[64]; - uint8_t data_block2[64]; - - // Copy static part of kernel - memcpy(&data_block[0], kernel, 24); - - memcpy(&data_block[28], &block1_suffix[0], 9 * sizeof(uint32_t)); - memcpy(&data_block2[32], &block2_suffix[0], 8 * sizeof(uint32_t)); - - // Search forward in time from the given timestamp - // Stopping search in case of shutting down - for (uint32_t nTimeTx=nIntervalBegin, nMaxTarget32 = nMaxTarget.Get32(7); nTimeTx nMaxTarget32) - continue; - - // Swap byte order - for(int i = 0; i < 8; i++) - hashProofOfStake[i] = __builtin_bswap32(hashProofOfStake[i]); - - CBigNum bnCoinDayWeight = bnValueIn * GetWeight((int64_t)nInputTxTime, (int64_t)nTimeTx) / COIN / nOneDay; - CBigNum bnTargetProofOfStake = bnCoinDayWeight * bnTargetPerCoinDay; - - if (bnTargetProofOfStake >= CBigNum(*pnHashProofOfStake)) - solutions.push_back(std::pair(*pnHashProofOfStake, nTimeTx)); - } - } - - vector >& GetSolutions() - { - return solutions; - } - -private: - std::vector > solutions; - - uint8_t *kernel; - uint32_t nBits; - uint32_t nInputTxTime; - CBigNum bnValueIn; - uint32_t nIntervalBegin; - uint32_t nIntervalEnd; -}; - -#else -class ScanMidstateWorker -{ -public: - ScanMidstateWorker() - { } - ScanMidstateWorker(unsigned char *kernel, uint32_t nBits, uint32_t nInputTxTime, int64_t nValueIn, uint32_t nIntervalBegin, uint32_t nIntervalEnd) - : nBits(nBits), nInputTxTime(nInputTxTime), bnValueIn(nValueIn), nIntervalBegin(nIntervalBegin), nIntervalEnd(nIntervalEnd) - { - // Init new sha256 context and update it - // with first 24 bytes of kernel - SHA256_Init(&workerCtx); - SHA256_Update(&workerCtx, kernel, 8 + 16); - solutions = vector >(); - } - - void Do() - { - SetThreadPriority(THREAD_PRIORITY_LOWEST); - SHA256_CTX ctx = workerCtx; - - // Sha256 result buffer - uint32_t hashProofOfStake[8]; - - // Compute maximum possible target to filter out majority of obviously insufficient hashes - CBigNum bnTargetPerCoinDay; - bnTargetPerCoinDay.SetCompact(nBits); - - uint256 nMaxTarget = (bnTargetPerCoinDay * bnValueIn * nStakeMaxAge / COIN / nOneDay).getuint256(), - *pnHashProofOfStake = (uint256 *)&hashProofOfStake; - - // Search forward in time from the given timestamp - // Stopping search in case of shutting down - for (uint32_t nTimeTx=nIntervalBegin, nMaxTarget32 = nMaxTarget.Get32(7); nTimeTx nMaxTarget32) - continue; - - CBigNum bnCoinDayWeight = bnValueIn * GetWeight((int64_t)nInputTxTime, (int64_t)nTimeTx) / COIN / nOneDay; - CBigNum bnTargetProofOfStake = bnCoinDayWeight * bnTargetPerCoinDay; - - if (bnTargetProofOfStake >= CBigNum(*pnHashProofOfStake)) - solutions.push_back(std::pair(*pnHashProofOfStake, nTimeTx)); - } - } - - vector >& GetSolutions() - { - return solutions; - } - -private: - SHA256_CTX workerCtx; - std::vector > solutions; - - uint32_t nBits; - uint32_t nInputTxTime; - CBigNum bnValueIn; - uint32_t nIntervalBegin; - uint32_t nIntervalEnd; -}; - -#endif // Scan given kernel for solution bool ScanKernelForward(unsigned char *kernel, uint32_t nBits, uint32_t nInputTxTime, int64_t nValueIn, std::pair &SearchInterval, std::vector > &solutions) { @@ -599,15 +436,15 @@ bool ScanKernelForward(unsigned char *kernel, uint32_t nBits, uint32_t nInputTxT uint32_t nPart = (SearchInterval.second - SearchInterval.first) / nThreads; - ScanMidstateWorker *workers = new ScanMidstateWorker[nThreads]; + KernelWorker *workers = new KernelWorker[nThreads]; boost::thread_group group; for(size_t i = 0; i < nThreads; i++) { uint32_t nBegin = SearchInterval.first + nPart * i; uint32_t nEnd = SearchInterval.first + nPart * (i + 1); - workers[i] = ScanMidstateWorker(kernel, nBits, nInputTxTime, nValueIn, nBegin, nEnd); - boost::function workerFnc = boost::bind(&ScanMidstateWorker::Do, &workers[i]); + workers[i] = KernelWorker(kernel, nBits, nInputTxTime, nValueIn, nBegin, nEnd); + boost::function workerFnc = boost::bind(&KernelWorker::Do, &workers[i]); group.create_thread(workerFnc); }