uint256 CPureBlockHeader::GetPoWHash(int algo, const Consensus::Params& consensusParams) const { switch (algo) { case ALGO_SHA256D: return GetHash(); case ALGO_SCRYPT: { uint256 thash; scrypt_1024_1_1_256(BEGIN(nVersion), BEGIN(thash)); return thash; } case ALGO_GROESTL: return HashGroestl(BEGIN(nVersion), END(nNonce)); case ALGO_SKEIN: return HashSkein(BEGIN(nVersion), END(nNonce)); case ALGO_QUBIT: return HashQubit(BEGIN(nVersion), END(nNonce)); case ALGO_YESCRYPT: { uint256 thash; yescrypt_hash(BEGIN(nVersion), BEGIN(thash)); return thash; } } return GetHash(); }
bool SendSyncCheckpoint(uint256 hashCheckpoint) { CSyncCheckpoint checkpoint; checkpoint.hashCheckpoint = hashCheckpoint; CDataStream sMsg(SER_NETWORK, PROTOCOL_VERSION); sMsg << (CUnsignedSyncCheckpoint)checkpoint; checkpoint.vchMsg = std::vector<unsigned char>(sMsg.begin(), sMsg.end()); if (CSyncCheckpoint::strMasterPrivKey.empty()) return error("SendSyncCheckpoint: Checkpoint master key unavailable."); std::vector<unsigned char> vchPrivKey = ParseHex(CSyncCheckpoint::strMasterPrivKey); CKey key; key.SetPrivKey(CPrivKey(vchPrivKey.begin(), vchPrivKey.end())); // if key is not correct openssl may crash if (!key.Sign(HashGroestl(checkpoint.vchMsg.begin(), checkpoint.vchMsg.end()), checkpoint.vchSig)) return error("SendSyncCheckpoint: Unable to sign checkpoint, check private key?"); if(!checkpoint.ProcessSyncCheckpoint(NULL)) { printf("WARNING: SendSyncCheckpoint: Failed to process checkpoint.\n"); return false; } // Relay checkpoint { LOCK(cs_vNodes); BOOST_FOREACH(CNode* pnode, vNodes) checkpoint.RelayTo(pnode); } return true; }
bool SetCheckpointPrivKey(std::string strPrivKey) { // Test signing a sync-checkpoint with genesis block CSyncCheckpoint checkpoint; checkpoint.hashCheckpoint = !fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet; CDataStream sMsg(SER_NETWORK, PROTOCOL_VERSION); sMsg << (CUnsignedSyncCheckpoint)checkpoint; checkpoint.vchMsg = std::vector<unsigned char>(sMsg.begin(), sMsg.end()); std::vector<unsigned char> vchPrivKey = ParseHex(strPrivKey); CKey key; key.SetPrivKey(CPrivKey(vchPrivKey.begin(), vchPrivKey.end())); // if key is not correct openssl may crash if (!key.Sign(HashGroestl(checkpoint.vchMsg.begin(), checkpoint.vchMsg.end()), checkpoint.vchSig)) return false; // Test signing successful, proceed CSyncCheckpoint::strMasterPrivKey = strPrivKey; return true; }
uint64_t getBirthdayHash(const uint256& midHash, uint32_t a) { uint32_t index = a - (a%8); char hash_tmp[sizeof(midHash)+4]; // std::cerr<<"midHash size:" <<sizeof(midHash)<<"\n"; memcpy(&hash_tmp[4], (char*)&midHash, sizeof(midHash) ); memcpy(&hash_tmp[0], (char*)&index, sizeof(index) ); uint64_t result_hash[8]; // for( uint32_t i = 0; i < sizeof(hash_tmp); ++i ) // { // std::cerr<<" "<<uint16_t((((unsigned char*)hash_tmp)[i])); // } // std::cerr<<"\n"; HashGroestl((unsigned char*)hash_tmp, sizeof(hash_tmp), (unsigned char*)&result_hash); // std::cerr<<"result_hash "<<a<<" "<<a%8<<" --- "; // for( uint32_t i = 0; i < 8; ++i ) std::cerr<<result_hash[i]<<" "; // std::cerr<<"\n"; uint64_t r = result_hash[a%BIRTHDAYS_PER_HASH]>>(64-SEARCH_SPACE_BITS); // std::cerr<<"bdayresult: "<<r<<"\n"; return r; }