// SYSCOIN generate block // This will figure out a valid hash and Nonce if you're // creating a different genesis block: static bool GenerateGenesisBlock(CBlockHeader &genesisBlock, uint256 *phash) { // Write the first 76 bytes of the block header to a double-SHA256 state. genesisBlock.nTime = time(NULL); CHash256 hasher; CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << genesisBlock; assert(ss.size() == 80); hasher.Write((unsigned char*)&ss[0], 76); arith_uint256 hashTarget = arith_uint256().SetCompact(genesisBlock.nBits); while (true) { // Write the last 4 bytes of the block header (the nonce) to a copy of // the double-SHA256 state, and compute the result. CHash256(hasher).Write((unsigned char*)&genesisBlock.nNonce, 4).Finalize((unsigned char*)phash); // Return the nonce if the hash has at least some zero bits, // check if it has enough to reach the target if (((uint16_t*)phash)[15] == 0 && UintToArith256(*phash) <= hashTarget) break; genesisBlock.nNonce++; if (genesisBlock.nNonce == 0) { printf("NONCE WRAPPED, incrementing time\n"); ++genesisBlock.nTime; } // If nothing found after trying for a while, return -1 if ((genesisBlock.nNonce & 0xfff) == 0) printf("nonce %08X: hash = %s (target = %s)\n", genesisBlock.nNonce, (*phash).ToString().c_str(), hashTarget.ToString().c_str()); } printf("genesis.nTime = %u \n", genesisBlock.nTime); printf("genesis.nNonce = %u \n", genesisBlock.nNonce); printf("Generate hash = %s\n", (*phash).ToString().c_str()); printf("genesis.hashMerkleRoot = %s\n", genesisBlock.hashMerkleRoot.ToString().c_str()); }
/* This implements a constant-space merkle root/path calculator, limited to 2^32 leaves. */ static void MerkleComputation(const std::vector<uint256>& leaves, uint256* proot, bool* pmutated, uint32_t branchpos, std::vector<uint256>* pbranch) { if (pbranch) pbranch->clear(); if (leaves.size() == 0) { if (pmutated) *pmutated = false; if (proot) *proot = uint256(); return; } bool mutated = false; // count is the number of leaves processed so far. uint32_t count = 0; // inner is an array of eagerly computed subtree hashes, indexed by tree // level (0 being the leaves). // For example, when count is 25 (11001 in binary), inner[4] is the hash of // the first 16 leaves, inner[3] of the next 8 leaves, and inner[0] equal to // the last leaf. The other inner entries are undefined. uint256 inner[32]; // Which position in inner is a hash that depends on the matching leaf. int matchlevel = -1; // First process all leaves into 'inner' values. while (count < leaves.size()) { uint256 h = leaves[count]; bool matchh = count == branchpos; count++; int level; // For each of the lower bits in count that are 0, do 1 step. Each // corresponds to an inner value that existed before processing the // current leaf, and each needs a hash to combine it. for (level = 0; !(count & (((uint32_t)1) << level)); level++) { if (pbranch) { if (matchh) { pbranch->push_back(inner[level]); } else if (matchlevel == level) { pbranch->push_back(h); matchh = true; } } mutated |= (inner[level] == h); CHash256().Write(inner[level].begin(), 32).Write(h.begin(), 32).Finalize(h.begin()); } // Store the resulting hash at inner position level. inner[level] = h; if (matchh) { matchlevel = level; } } // Do a final 'sweep' over the rightmost branch of the tree to process // odd levels, and reduce everything to a single top value. // Level is the level (counted from the bottom) up to which we've sweeped. int level = 0; // As long as bit number level in count is zero, skip it. It means there // is nothing left at this level. while (!(count & (((uint32_t)1) << level))) { level++; } uint256 h = inner[level]; bool matchh = matchlevel == level; while (count != (((uint32_t)1) << level)) { // If we reach this point, h is an inner value that is not the top. // We combine it with itself (Bitcoin's special rule for odd levels in // the tree) to produce a higher level one. if (pbranch && matchh) { pbranch->push_back(h); } CHash256().Write(h.begin(), 32).Write(h.begin(), 32).Finalize(h.begin()); // Increment count to the value it would have if two entries at this // level had existed. count += (((uint32_t)1) << level); level++; // And propagate the result upwards accordingly. while (!(count & (((uint32_t)1) << level))) { if (pbranch) { if (matchh) { pbranch->push_back(inner[level]); } else if (matchlevel == level) { pbranch->push_back(h); matchh = true; } } CHash256().Write(inner[level].begin(), 32).Write(h.begin(), 32).Finalize(h.begin()); level++; } } // Return result. if (pmutated) *pmutated = mutated; if (proot) *proot = h; }