daily pastebin goal
61%
SHARE
TWEET

Untitled

a guest Jul 25th, 2010 323 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. static const unsigned int SHA256_K[64] = {
  2.         0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
  3.         0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  4.         0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
  5.         0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  6.         0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
  7.         0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  8.         0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
  9.         0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  10.         0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
  11.         0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  12.         0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
  13.         0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  14.         0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
  15.         0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  16.         0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
  17.         0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  18. };
  19.  
  20. #define blk0(i) (W[i] = dat[i])
  21.  
  22. #define blk2(i) (W[i&15]+=s1(W[(i-2)&15])+W[(i-7)&15]+s0(W[(i-15)&15]))
  23.  
  24. #define Ch(x,y,z) (z^(x&(y^z)))
  25. #define Maj(x,y,z) ((x&y)|(z&(x|y)))
  26.  
  27. #define a(i) T[(0-i)&7]
  28. #define b(i) T[(1-i)&7]
  29. #define c(i) T[(2-i)&7]
  30. #define d(i) T[(3-i)&7]
  31. #define e(i) T[(4-i)&7]
  32. #define f(i) T[(5-i)&7]
  33. #define g(i) T[(6-i)&7]
  34. #define h(i) T[(7-i)&7]
  35.  
  36. #define R(i,j) h(i)+=S1(e(i))+Ch(e(i),f(i),g(i))+SHA256_K[i+j]+(j?blk2(i):blk0(i));\
  37.                                                                                  d(i)+=h(i);h(i)+=S0(a(i))+Maj(a(i),b(i),c(i))
  38.  
  39. #define rotrFixed(x,y) ((x>>y) | (x<<(sizeof(unsigned int)*8-y)))
  40.  
  41. // for SHA256
  42. #define S0(x) (rotrFixed(x,2)^rotrFixed(x,13)^rotrFixed(x,22))
  43. #define S1(x) (rotrFixed(x,6)^rotrFixed(x,11)^rotrFixed(x,25))
  44. #define s0(x) (rotrFixed(x,7)^rotrFixed(x,18)^(x>>3))
  45. #define s1(x) (rotrFixed(x,17)^rotrFixed(x,19)^(x>>10))
  46.  
  47. inline void BlockSHA256(const void* pin, void* pout, const void *pinit)
  48. {
  49.         unsigned int* dat = (unsigned int*)pin;
  50.         unsigned int* T = (unsigned int*)pout;
  51.         unsigned int* initstate = (unsigned int*)pinit;
  52.         unsigned int W[16];
  53.  
  54.         R( 0, 0); R( 1, 0); R( 2, 0); R( 3, 0); R( 4, 0); R( 5, 0); R( 6, 0); R( 7, 0); R( 8, 0); R( 9, 0); R(10, 0); R(11, 0); R(12, 0); R(13, 0); R(14, 0); R(15, 0);
  55.         R( 0, 16); R( 1, 16); R( 2, 16); R( 3, 16); R( 4, 16); R( 5, 16); R( 6, 16); R( 7, 16); R( 8, 16); R( 9, 16); R(10, 16); R(11, 16); R(12, 16); R(13, 16); R(14, 16); R(15, 16);
  56.         R( 0, 32); R( 1, 32); R( 2, 32); R( 3, 32); R( 4, 32); R( 5, 32); R( 6, 32); R( 7, 32); R( 8, 32); R( 9, 32); R(10, 32); R(11, 32); R(12, 32); R(13, 32); R(14, 32); R(15, 32);
  57.         R( 0, 48); R( 1, 48); R( 2, 48); R( 3, 48); R( 4, 48); R( 5, 48); R( 6, 48); R( 7, 48); R( 8, 48); R( 9, 48); R(10, 48); R(11, 48); R(12, 48); R(13, 48); R(14, 48); R(15, 48);
  58.  
  59.         T[0] += initstate[0];
  60.         T[1] += initstate[1];
  61.         T[2] += initstate[2];
  62.         T[3] += initstate[3];
  63.         T[4] += initstate[4];
  64.         T[5] += initstate[5];
  65.         T[6] += initstate[6];
  66.         T[7] += initstate[7];
  67. }
  68.  
  69.  
  70. void BitcoinMiner()
  71. {
  72.         printf("BitcoinMiner started\n");
  73.         SetThreadPriority(THREAD_PRIORITY_LOWEST);
  74.  
  75.         CKey key;
  76.         key.MakeNewKey();
  77.         CBigNum bnExtraNonce = 0;
  78.         while (fGenerateBitcoins)
  79.         {
  80.                 Sleep(50);
  81.                 if (fShutdown)
  82.                         return;
  83.                 while (vNodes.empty())
  84.                 {
  85.                         Sleep(1000);
  86.                         if (fShutdown)
  87.                                 return;
  88.                         if (!fGenerateBitcoins)
  89.                                 return;
  90.                 }
  91.  
  92.                 unsigned int nTransactionsUpdatedLast = nTransactionsUpdated;
  93.                 CBlockIndex* pindexPrev = pindexBest;
  94.                 unsigned int nBits = GetNextWorkRequired(pindexPrev);
  95.  
  96.  
  97.                 //
  98.                 // Create coinbase tx
  99.                 //
  100.                 CTransaction txNew;
  101.                 txNew.vin.resize(1);
  102.                 txNew.vin[0].prevout.SetNull();
  103.                 txNew.vin[0].scriptSig << nBits << ++bnExtraNonce;
  104.                 txNew.vout.resize(1);
  105.                 txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG;
  106.  
  107.  
  108.                 //
  109.                 // Create new block
  110.                 //
  111.                 auto_ptr<CBlock> pblock(new CBlock());
  112.                 if (!pblock.get())
  113.                         return;
  114.  
  115.                 // Add our coinbase tx as first transaction
  116.                 pblock->vtx.push_back(txNew);
  117.  
  118.                 // Collect the latest transactions into the block
  119.                 int64 nFees = 0;
  120.                 CRITICAL_BLOCK(cs_main)
  121.                         CRITICAL_BLOCK(cs_mapTransactions)
  122.                         {
  123.                                 CTxDB txdb("r");
  124.                                 map<uint256, CTxIndex> mapTestPool;
  125.                                 vector<char> vfAlreadyAdded(mapTransactions.size());
  126.                                 bool fFoundSomething = true;
  127.                                 unsigned int nBlockSize = 0;
  128.                                 while (fFoundSomething && nBlockSize < MAX_SIZE/2)
  129.                                 {
  130.                                         fFoundSomething = false;
  131.                                         unsigned int n = 0;
  132.                                         for (map<uint256, CTransaction>::iterator mi = mapTransactions.begin(); mi != mapTransactions.end(); ++mi, ++n)
  133.                                         {
  134.                                                 if (vfAlreadyAdded[n])
  135.                                                         continue;
  136.                                                 CTransaction& tx = (*mi).second;
  137.                                                 if (tx.IsCoinBase() || !tx.IsFinal())
  138.                                                         continue;
  139.                                                 unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK);
  140.                                                 if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE - 10000)
  141.                                                         continue;
  142.  
  143.                                                 // Transaction fee based on block size
  144.                                                 int64 nMinFee = tx.GetMinFee(nBlockSize);
  145.  
  146.                                                 map<uint256, CTxIndex> mapTestPoolTmp(mapTestPool);
  147.                                                 if (!tx.ConnectInputs(txdb, mapTestPoolTmp, CDiskTxPos(1,1,1), 0, nFees, false, true, nMinFee))
  148.                                                         continue;
  149.                                                 swap(mapTestPool, mapTestPoolTmp);
  150.  
  151.                                                 pblock->vtx.push_back(tx);
  152.                                                 nBlockSize += nTxSize;
  153.                                                 vfAlreadyAdded[n] = true;
  154.                                                 fFoundSomething = true;
  155.                                         }
  156.                                 }
  157.                         }
  158.                 pblock->nBits = nBits;
  159.                 pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees);
  160.                 printf("Running BitcoinMiner with %d transactions in block\n", pblock->vtx.size());
  161.  
  162.  
  163.                 //
  164.                 // Prebuild hash buffer
  165.                 //
  166.                 struct unnamed1
  167.                 {
  168.                         struct unnamed2
  169.                         {
  170.                                 int nVersion;
  171.                                 uint256 hashPrevBlock;
  172.                                 uint256 hashMerkleRoot;
  173.                                 unsigned int nTime;
  174.                                 unsigned int nBits;
  175.                                 unsigned int nNonce;
  176.                         }
  177.                         block;
  178.                         unsigned char pchPadding0[64];
  179.                         uint256 hash1;
  180.                         unsigned char pchPadding1[64];
  181.                 }
  182.                 tmp;
  183.  
  184.                 tmp.block.nVersion       = pblock->nVersion;
  185.                 tmp.block.hashPrevBlock  = pblock->hashPrevBlock  = (pindexPrev ? pindexPrev->GetBlockHash() : 0);
  186.                 tmp.block.hashMerkleRoot = pblock->hashMerkleRoot = pblock->BuildMerkleTree();
  187.                 tmp.block.nTime          = pblock->nTime          = max((pindexPrev ? pindexPrev->GetMedianTimePast()+1 : 0), GetAdjustedTime());
  188.                 tmp.block.nBits          = pblock->nBits          = nBits;
  189.                 tmp.block.nNonce         = pblock->nNonce         = 0;
  190.  
  191.                 unsigned int nBlocks0 = FormatHashBlocks(&tmp.block, sizeof(tmp.block));
  192.                 unsigned int nBlocks1 = FormatHashBlocks(&tmp.hash1, sizeof(tmp.hash1));
  193.  
  194.                 static const unsigned int init_state[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};
  195.  
  196.                 unsigned int *block1 = (unsigned int*)&tmp.hash1;
  197.                 block1[8] = ByteReverse(block1[8]);
  198.                 block1[9] = ByteReverse(block1[9]);
  199.                 block1[10] = ByteReverse(block1[10]);
  200.                 block1[11] = ByteReverse(block1[11]);
  201.                 block1[12] = ByteReverse(block1[12]);
  202.                 block1[13] = ByteReverse(block1[13]);
  203.                 block1[14] = ByteReverse(block1[14]);
  204.                 block1[15] = ByteReverse(block1[15]);
  205.  
  206.  
  207.                 unsigned int pCache[8];
  208.  
  209.                 //
  210.                 // Search
  211.                 //
  212.  
  213.  
  214.                 unsigned int *block = (unsigned int *)&tmp.block;
  215.                 block[0] = ByteReverse(block[0]);
  216.                 block[1] = ByteReverse(block[1]);
  217.                 block[2] = ByteReverse(block[2]);
  218.                 block[3] = ByteReverse(block[3]);
  219.                 block[4] = ByteReverse(block[4]);
  220.                 block[5] = ByteReverse(block[5]);
  221.                 block[6] = ByteReverse(block[6]);
  222.                 block[7] = ByteReverse(block[7]);
  223.                 block[8] = ByteReverse(block[8]);
  224.                 block[9] = ByteReverse(block[9]);
  225.                 block[10] = ByteReverse(block[10]);
  226.                 block[11] = ByteReverse(block[11]);
  227.                 block[12] = ByteReverse(block[12]);
  228.                 block[13] = ByteReverse(block[13]);
  229.                 block[14] = ByteReverse(block[14]);
  230.                 block[15] = ByteReverse(block[15]);
  231.  
  232.                 block += 16;
  233.  
  234.                 block[0] = ByteReverse(block[0]);
  235.                 block[1] = ByteReverse(block[1]);
  236.                 block[2] = ByteReverse(block[2]);
  237.                 //block[3] = ByteReverse(block[3]); done in loop, holds nonce
  238.                 block[4] = ByteReverse(block[4]);
  239.                 block[5] = ByteReverse(block[5]);
  240.                 block[6] = ByteReverse(block[6]);
  241.                 block[7] = ByteReverse(block[7]);
  242.                 block[8] = ByteReverse(block[8]);
  243.                 block[9] = ByteReverse(block[9]);
  244.                 block[10] = ByteReverse(block[10]);
  245.                 block[11] = ByteReverse(block[11]);
  246.                 block[12] = ByteReverse(block[12]);
  247.                 block[13] = ByteReverse(block[13]);
  248.                 block[14] = ByteReverse(block[14]);
  249.                 block[15] = ByteReverse(block[15]);
  250.  
  251.                 memcpy(&pCache, init_state, sizeof(init_state));
  252.                 BlockSHA256(&tmp.block, &pCache, init_state);
  253.  
  254.                 int64 nStart = GetTime();
  255.                 uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256();
  256.                 uint256 hash;
  257.                 loop
  258.                 {
  259.                         block[3] = ByteReverse(block[3]);
  260.                         ((unsigned long int *)&tmp.hash1)[0] = ((unsigned long int *)&pCache)[0];
  261.                         ((unsigned long int *)&tmp.hash1)[1] = ((unsigned long int *)&pCache)[1];
  262.                         ((unsigned long int *)&tmp.hash1)[2] = ((unsigned long int *)&pCache)[2];
  263.                         ((unsigned long int *)&tmp.hash1)[3] = ((unsigned long int *)&pCache)[3];
  264.  
  265.                         BlockSHA256(block, &tmp.hash1, &pCache);
  266.  
  267.                         ((unsigned long int *)&hash)[0] = ((unsigned long int *)&init_state)[0];
  268.                         ((unsigned long int *)&hash)[1] = ((unsigned long int *)&init_state)[1];
  269.                         ((unsigned long int *)&hash)[2] = ((unsigned long int *)&init_state)[2];
  270.                         ((unsigned long int *)&hash)[3] = ((unsigned long int *)&init_state)[3];
  271.  
  272.                         BlockSHA256(&tmp.hash1, &hash, init_state);
  273.                         ((unsigned int*)&hash)[0] = ByteReverse(((unsigned int*)&hash)[0]);
  274.                         ((unsigned int*)&hash)[1] = ByteReverse(((unsigned int*)&hash)[1]);
  275.                         ((unsigned int*)&hash)[2] = ByteReverse(((unsigned int*)&hash)[2]);
  276.                         ((unsigned int*)&hash)[3] = ByteReverse(((unsigned int*)&hash)[3]);
  277.                         ((unsigned int*)&hash)[4] = ByteReverse(((unsigned int*)&hash)[4]);
  278.                         ((unsigned int*)&hash)[5] = ByteReverse(((unsigned int*)&hash)[5]);
  279.                         ((unsigned int*)&hash)[6] = ByteReverse(((unsigned int*)&hash)[6]);
  280.                         ((unsigned int*)&hash)[7] = ByteReverse(((unsigned int*)&hash)[7]);
  281.  
  282.                         block[3] = ByteReverse(block[3]);
  283.  
  284.                         if (hash <= hashTarget)
  285.                         {
  286.                                 pblock->nNonce = tmp.block.nNonce;
  287.                                 assert(hash == pblock->GetHash());
  288.  
  289.                                 //// debug print
  290.                                 printf("BitcoinMiner:\n");
  291.                                 printf("proof-of-work found  \n  hash: %s  \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str());
  292.                                 pblock->print();
  293.                                 printf("%s ", DateTimeStrFormat("%x %H:%M", GetTime()).c_str());
  294.                                 printf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue).c_str());
  295.  
  296.                                 SetThreadPriority(THREAD_PRIORITY_NORMAL);
  297.                                 CRITICAL_BLOCK(cs_main)
  298.                                 {
  299.                                         if (pindexPrev == pindexBest)
  300.                                         {
  301.                                                 // Save key
  302.                                                 if (!AddKey(key))
  303.                                                         return;
  304.                                                 key.MakeNewKey();
  305.  
  306.                                                 // Track how many getdata requests this block gets
  307.                                                 CRITICAL_BLOCK(cs_mapRequestCount)
  308.                                                         mapRequestCount[pblock->GetHash()] = 0;
  309.  
  310.                                                 // Process this block the same as if we had received it from another node
  311.                                                 if (!ProcessBlock(NULL, pblock.release()))
  312.                                                         printf("ERROR in BitcoinMiner, ProcessBlock, block not accepted\n");
  313.                                         }
  314.                                 }
  315.                                 SetThreadPriority(THREAD_PRIORITY_LOWEST);
  316.  
  317.                                 Sleep(500);
  318.                                 break;
  319.                         }
  320.  
  321.                         tmp.block.nNonce++;
  322.  
  323.                         // Update nTime every few seconds
  324.                         const unsigned int nMask = 0xffff;
  325.                         if ((tmp.block.nNonce & nMask) == 0)
  326.                         {
  327.                         //      printf("nonce: %08x\n", tmp.block.nNonce);
  328.                                 // Meter hashes/sec
  329.                                 static int64 nTimerStart;
  330.                                 static int nHashCounter;
  331.                                 if (nTimerStart == 0)
  332.                                         nTimerStart = GetTimeMillis();
  333.                                 else
  334.                                         nHashCounter++;
  335.                                 if(GetTimeMillis() - nTimerStart > 4000) {
  336.                                         double dHashesPerSec = 1000.0 * (nMask+1) * nHashCounter / (GetTimeMillis() - nTimerStart);
  337.                                         nTimerStart = GetTimeMillis();
  338.                                         nHashCounter = 0;
  339.                                         printf("%.0f khash/s\n", dHashesPerSec/1000.0);
  340.                                 }
  341.  
  342.                                 // Check for stop or if block needs to be rebuilt
  343.                                 if (fShutdown)
  344.                                         return;
  345.                                 if (!fGenerateBitcoins)
  346.                                         return;
  347.                                 if (fLimitProcessors && vnThreadsRunning[3] > nLimitProcessors)
  348.                                         return;
  349.                                 if (vNodes.empty())
  350.                                         break;
  351.                                 if (tmp.block.nNonce == 0)
  352.                                         break;
  353.                                 if (nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60)
  354.                                         break;
  355.  
  356.                                 block[1] = ByteReverse(block[1]);
  357.                                 tmp.block.nTime = pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
  358.                                 block[1] = ByteReverse(block[1]);
  359.                         }
  360.                 }
  361.         }
  362. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top