From 150828b806da0757f2b67b7356affd8b358043d4 Mon Sep 17 00:00:00 2001 From: Sami Ahmed Date: Fri, 8 May 2026 21:34:24 -0700 Subject: [PATCH] C++20 modernization: nullptr, constexpr, smart pointers, thread safety, enum class - Replace ~320 NULL occurrences with nullptr across 47 files (-184 net lines) - static const -> constexpr for version, coin, utility constants - Collapse 9 PushMessage overloads into 1 variadic template with fold expressions - Convert boost::array -> std::array, boost::type_traits -> std:: equivalents - pwalletMain, pScriptCheckQueue, pScriptCheckThreads -> unique_ptr - mapOrphanBlocks values: raw CBlock* -> unique_ptr - Fix data races: add locks to wallet registration, pindexBest reads, mempool exists - pwalletdbEncryption: raw new/delete -> local unique_ptr, remove exit() calls - PoS reward overflow: CBigNum intermediate for nCoinAge * nRewardCoinYear - memset -> OPENSSL_cleanse for secure zeroing - Fix const-cast UB in SetMerkleBranch - Log silent catch(...) blocks instead of silently swallowing - Enum class: GetMinFeeMode, WalletFeature - std::string_view for 8 utility function parameters - Range-for with structured bindings: 63 iterator loops modernized - std::make_pair -> brace init: 35 sites - Delegating constructors: CWallet, CBlockIndex - Merkle tree caching, std::array for GetMedianTimePast - CScript copy ctor -> = default, operator!= -> = default --- src/addrman.cpp | 31 ++-- src/allocators.h | 8 +- src/bignum.h | 28 ++-- src/bootstrap.cpp | 2 +- src/checkpoints.cpp | 12 +- src/crypter.cpp | 4 +- src/crypto_ecdh.cpp | 2 +- src/db.cpp | 38 ++--- src/db.h | 24 +-- src/init.cpp | 69 ++++----- src/init.h | 3 +- src/key.h | 2 +- src/keystore.cpp | 24 ++- src/keystore.h | 18 +-- src/main.cpp | 309 ++++++++++++++++++------------------- src/main.h | 148 +++++++----------- src/miner.cpp | 13 +- src/net.cpp | 88 +++++------ src/net.h | 145 ++--------------- src/netbase.cpp | 20 +-- src/onionseed.h | 4 +- src/qt/trianglesgui.cpp | 3 +- src/qt/walletmodel.h | 2 +- src/rpcblockchain.cpp | 10 +- src/rpcdump.cpp | 6 +- src/rpcrawtransaction.cpp | 2 +- src/rpcwallet.cpp | 4 +- src/script.cpp | 8 +- src/script.h | 2 +- src/serialize.h | 40 ++--- src/smessage.cpp | 36 ++--- src/smessage.h | 6 +- src/sync.cpp | 6 +- src/sync.h | 6 +- src/tor/onion_v3.cpp | 7 +- src/tor/tor_process.cpp | 28 ++-- src/trianglesrpc.cpp | 24 +-- src/trianglesrpc.h | 2 +- src/txdb-leveldb.cpp | 26 ++-- src/util.cpp | 45 ++++-- src/util.h | 36 +++-- src/utxosnapshot.cpp | 4 +- src/version.h | 22 +-- src/wallet.cpp | 261 ++++++++++++++----------------- src/wallet.h | 54 +++---- src/walletdb.h | 32 ++-- src/zmqpublishnotifier.cpp | 14 +- 47 files changed, 747 insertions(+), 931 deletions(-) diff --git a/src/addrman.cpp b/src/addrman.cpp index e605a91..1fcb9a3 100644 --- a/src/addrman.cpp +++ b/src/addrman.cpp @@ -81,15 +81,14 @@ double CAddrInfo::GetChance(int64_t nNow) const CAddrInfo* CAddrMan::Find(const CNetAddr& addr, int *pnId) { - std::map::iterator it = mapAddr.find(addr); + auto it = mapAddr.find(addr); if (it == mapAddr.end()) - return NULL; + return nullptr; if (pnId) - *pnId = (*it).second; - std::map::iterator it2 = mapInfo.find((*it).second); - if (it2 != mapInfo.end()) - return &(*it2).second; - return NULL; + *pnId = it->second; + if (auto it2 = mapInfo.find(it->second); it2 != mapInfo.end()) + return &it2->second; + return nullptr; } CAddrInfo* CAddrMan::Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId) @@ -177,13 +176,13 @@ int CAddrMan::ShrinkNew(int nUBucket) int n[4] = {GetRandInt(vNew.size()), GetRandInt(vNew.size()), GetRandInt(vNew.size()), GetRandInt(vNew.size())}; int nI = 0; int nOldest = -1; - for (std::set::iterator it = vNew.begin(); it != vNew.end(); it++) + for (const auto& elem : vNew) { if (nI == n[0] || nI == n[1] || nI == n[2] || nI == n[3]) { - assert(nOldest == -1 || mapInfo.count(*it) == 1); - if (nOldest == -1 || mapInfo[*it].nTime < mapInfo[nOldest].nTime) - nOldest = *it; + assert(nOldest == -1 || mapInfo.count(elem) == 1); + if (nOldest == -1 || mapInfo[elem].nTime < mapInfo[nOldest].nTime) + nOldest = elem; } nI++; } @@ -440,10 +439,8 @@ int CAddrMan::Check_() if (vRandom.size() != nTried + nNew) return -7; - for (std::map::iterator it = mapInfo.begin(); it != mapInfo.end(); it++) + for (auto& [n, info] : mapInfo) { - int n = (*it).first; - CAddrInfo &info = (*it).second; if (info.fInTried) { @@ -467,10 +464,10 @@ int CAddrMan::Check_() for (int n=0; n &vTried = vvTried[n]; - for (std::vector::iterator it = vTried.begin(); it != vTried.end(); it++) + for (const auto& elem : vTried) { - if (!setTried.count(*it)) return -11; - setTried.erase(*it); + if (!setTried.count(elem)) return -11; + setTried.erase(elem); } } diff --git a/src/allocators.h b/src/allocators.h index 0795817..9b58c27 100644 --- a/src/allocators.h +++ b/src/allocators.h @@ -66,7 +66,7 @@ public: if(it == histogram.end()) // Newly locked page { locker.Lock(reinterpret_cast(page), page_size); - histogram.insert(std::make_pair(page, 1)); + histogram.insert({page, 1}); } else // Page was already locked; increase counter { @@ -204,14 +204,14 @@ struct secure_allocator : public std::allocator T* allocate(std::size_t n) { T* p = std::allocator::allocate(n); - if (p != NULL) + if (p != nullptr) LockedPageManager::instance.LockRange(p, sizeof(T) * n); return p; } void deallocate(T* p, std::size_t n) { - if (p != NULL) + if (p != nullptr) { memset(p, 0, sizeof(T) * n); LockedPageManager::instance.UnlockRange(p, sizeof(T) * n); @@ -247,7 +247,7 @@ struct zero_after_free_allocator : public std::allocator void deallocate(T* p, std::size_t n) { - if (p != NULL) + if (p != nullptr) memset(p, 0, sizeof(T) * n); std::allocator::deallocate(p, n); } diff --git a/src/bignum.h b/src/bignum.h index ea42ec6..358f76f 100644 --- a/src/bignum.h +++ b/src/bignum.h @@ -37,20 +37,20 @@ public: CAutoBN_CTX() { pctx = BN_CTX_new(); - if (pctx == NULL) + if (pctx == nullptr) throw bignum_error("CAutoBN_CTX : BN_CTX_new() returned NULL"); } ~CAutoBN_CTX() { - if (pctx != NULL) + if (pctx != nullptr) BN_CTX_free(pctx); } operator BN_CTX*() { return pctx; } BN_CTX& operator*() { return *pctx; } BN_CTX** operator&() { return &pctx; } - bool operator!() { return (pctx == NULL); } + bool operator!() { return (pctx == nullptr); } }; @@ -64,14 +64,14 @@ public: CBigNum() { pbn = BN_new(); - if (pbn == NULL) + if (pbn == nullptr) throw bignum_error("CBigNum::CBigNum() : BN_new() returned NULL"); } CBigNum(const CBigNum& b) { pbn = BN_new(); - if (pbn == NULL) + if (pbn == nullptr) throw bignum_error("CBigNum::CBigNum(const CBigNum&) : BN_new() returned NULL"); if (!BN_copy(pbn, b.pbn)) { @@ -89,7 +89,7 @@ public: ~CBigNum() { - if (pbn != NULL) + if (pbn != nullptr) BN_clear_free(pbn); } @@ -220,7 +220,7 @@ public: uint64_t getuint64() { - unsigned int nSize = BN_bn2mpi(pbn, NULL); + unsigned int nSize = BN_bn2mpi(pbn, nullptr); if (nSize < 4) return 0; std::vector vch(nSize); @@ -290,7 +290,7 @@ public: uint256 getuint256() const { - unsigned int nSize = BN_bn2mpi(pbn, NULL); + unsigned int nSize = BN_bn2mpi(pbn, nullptr); if (nSize < 4) return 0; std::vector vch(nSize); @@ -321,7 +321,7 @@ public: std::vector getvch() const { - unsigned int nSize = BN_bn2mpi(pbn, NULL); + unsigned int nSize = BN_bn2mpi(pbn, nullptr); if (nSize <= 4) return std::vector(); std::vector vch(nSize); @@ -345,7 +345,7 @@ public: unsigned int GetCompact() const { - unsigned int nSize = BN_bn2mpi(pbn, NULL); + unsigned int nSize = BN_bn2mpi(pbn, nullptr); std::vector vch(nSize); nSize -= 4; BN_bn2mpi(pbn, &vch[0]); @@ -374,7 +374,7 @@ public: psz++; // hex string to bignum - static const signed char phexdigit[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0 }; + static constexpr signed char phexdigit[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0 }; *this = 0; while (isxdigit(*psz)) { @@ -515,7 +515,7 @@ public: */ static CBigNum generatePrime(const unsigned int numBits, bool safe = false) { CBigNum ret; - if(!BN_generate_prime_ex(ret.pbn, numBits, (safe == true), NULL, NULL, NULL)) + if(!BN_generate_prime_ex(ret.pbn, numBits, (safe == true), nullptr, nullptr, nullptr)) throw bignum_error("CBigNum::generatePrime*= :BN_generate_prime_ex"); return ret; } @@ -541,7 +541,7 @@ public: */ bool isPrime(const int checks=BN_prime_checks) const { CAutoBN_CTX pctx; - int ret = BN_is_prime_ex(pbn, checks, pctx, NULL); + int ret = BN_is_prime_ex(pbn, checks, pctx, nullptr); if(ret < 0){ throw bignum_error("CBigNum::isPrime :BN_is_prime_ex"); } @@ -706,7 +706,7 @@ inline const CBigNum operator/(const CBigNum& a, const CBigNum& b) { CAutoBN_CTX pctx; CBigNum r; - if (!BN_div(r.pbn, NULL, a.pbn, b.pbn, pctx)) + if (!BN_div(r.pbn, nullptr, a.pbn, b.pbn, pctx)) throw bignum_error("CBigNum::operator/ : BN_div failed"); return r; } diff --git a/src/bootstrap.cpp b/src/bootstrap.cpp index ae5682b..d505b3b 100644 --- a/src/bootstrap.cpp +++ b/src/bootstrap.cpp @@ -64,7 +64,7 @@ static SOCKET ConnectDirectTCP(const std::string& host, int port, std::string& s } SOCKET hSocket = INVALID_SOCKET; - for (rp = result; rp != NULL; rp = rp->ai_next) { + for (rp = result; rp != nullptr; rp = rp->ai_next) { hSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (hSocket == INVALID_SOCKET) continue; diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index 4e6e64b..fe89e25 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -132,7 +132,7 @@ namespace Checkpoints if (t != mapBlockIndex.end()) return t->second; } - return NULL; + return nullptr; } // triangles: synchronized checkpoint (centrally broadcasted) @@ -151,7 +151,7 @@ namespace Checkpoints error("GetSyncCheckpoint: block index missing for current sync-checkpoint %s", hashSyncCheckpoint.ToString().c_str()); else return mapBlockIndex[hashSyncCheckpoint]; - return NULL; + return nullptr; } // triangles: only descendant of current sync-checkpoint is allowed @@ -281,8 +281,8 @@ namespace Checkpoints return false; if (hashBlock == hashPendingCheckpoint) return true; - if (mapOrphanBlocks.count(hashPendingCheckpoint) - && hashBlock == WantedByOrphan(mapOrphanBlocks[hashPendingCheckpoint])) + if (mapOrphanBlocks.count(hashPendingCheckpoint) + && hashBlock == WantedByOrphan(mapOrphanBlocks[hashPendingCheckpoint].get())) return true; return false; } @@ -371,7 +371,7 @@ namespace Checkpoints if (!key.Sign(Hash(checkpoint.vchMsg.begin(), checkpoint.vchMsg.end()), checkpoint.vchSig)) return error("SendSyncCheckpoint: Unable to sign checkpoint, check private key?"); - if(!checkpoint.ProcessSyncCheckpoint(NULL)) + if(!checkpoint.ProcessSyncCheckpoint(nullptr)) { printf("WARNING: SendSyncCheckpoint: Failed to process checkpoint.\n"); return false; @@ -432,7 +432,7 @@ bool CSyncCheckpoint::ProcessSyncCheckpoint(CNode* pfrom) pfrom->PushGetBlocks(pindexBest, hashCheckpoint); // ask directly as well in case rejected earlier by duplicate // proof-of-stake because getblocks may not get it this time - pfrom->AskFor(CInv(MSG_BLOCK, mapOrphanBlocks.count(hashCheckpoint)? WantedByOrphan(mapOrphanBlocks[hashCheckpoint]) : hashCheckpoint)); + pfrom->AskFor(CInv(MSG_BLOCK, mapOrphanBlocks.count(hashCheckpoint)? WantedByOrphan(mapOrphanBlocks[hashCheckpoint].get()) : hashCheckpoint)); } return false; } diff --git a/src/crypter.cpp b/src/crypter.cpp index 9f37328..8c198b4 100644 --- a/src/crypter.cpp +++ b/src/crypter.cpp @@ -75,7 +75,7 @@ bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector& vchCiphertext, CKeyingM bool fOk = true; - if (fOk) fOk = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, chKey, chIV); + if (fOk) fOk = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, chKey, chIV); if (fOk) fOk = EVP_DecryptUpdate(ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen); if (fOk) fOk = EVP_DecryptFinal_ex(ctx, (&vchPlaintext[0])+nPLen, &nFLen); EVP_CIPHER_CTX_free(ctx); diff --git a/src/crypto_ecdh.cpp b/src/crypto_ecdh.cpp index fccd6d0..474ffe6 100644 --- a/src/crypto_ecdh.cpp +++ b/src/crypto_ecdh.cpp @@ -26,7 +26,7 @@ secp256k1_context* GetECDHContext() } // Hash function callback that returns the raw X coordinate of the shared -// point. Mirrors OpenSSL's ECDH_compute_key behaviour when the KDF is NULL. +// point. Mirrors OpenSSL's ECDH_compute_key behaviour when the KDF is nullptr. int hash_xonly(unsigned char* output, const unsigned char* x32, const unsigned char* /*y32*/, diff --git a/src/db.cpp b/src/db.cpp index ba5805a..62723de 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -133,7 +133,7 @@ void CDBEnv::MakeMock() #ifdef DB_LOG_IN_MEMORY dbenv.log_set_config(DB_LOG_IN_MEMORY, 1); #endif - int ret = dbenv.open(NULL, + int ret = dbenv.open(nullptr, DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | @@ -155,10 +155,10 @@ CDBEnv::VerifyResult CDBEnv::Verify(std::string strFile, bool (*recoverFunc)(CDB assert(mapFileUseCount.count(strFile) == 0); Db db(&dbenv, 0); - int result = db.verify(strFile.c_str(), NULL, NULL, 0); + int result = db.verify(strFile.c_str(), nullptr, nullptr, 0); if (result == 0) return VERIFY_OK; - else if (recoverFunc == NULL) + else if (recoverFunc == nullptr) return RECOVER_FAIL; // Try to recover: @@ -178,7 +178,7 @@ bool CDBEnv::Salvage(std::string strFile, bool fAggressive, stringstream strDump; Db db(&dbenv, 0); - int result = db.verify(strFile.c_str(), NULL, &strDump, flags); + int result = db.verify(strFile.c_str(), nullptr, &strDump, flags); if (result == DB_VERIFY_BAD) { printf("Error: Salvage found errors, all data may not be recoverable.\n"); @@ -231,10 +231,10 @@ void CDBEnv::CheckpointLSN(std::string strFile) CDB::CDB(const char *pszFile, const char* pszMode) : - pdb(NULL), activeTxn(NULL) + pdb(nullptr), activeTxn(nullptr) { int ret; - if (pszFile == NULL) + if (pszFile == nullptr) return; fReadOnly = (!strchr(pszMode, '+') && !strchr(pszMode, 'w')); @@ -251,7 +251,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) : strFile = pszFile; ++bitdb.mapFileUseCount[strFile]; pdb = bitdb.mapDb[strFile]; - if (pdb == NULL) + if (pdb == nullptr) { pdb = new Db(&bitdb.dbenv, 0); @@ -264,8 +264,8 @@ CDB::CDB(const char *pszFile, const char* pszMode) : throw runtime_error(strprintf("CDB() : failed to configure for no temp file backing for database %s", pszFile)); } - ret = pdb->open(NULL, // Txn pointer - fMockDb ? NULL : pszFile, // Filename + ret = pdb->open(nullptr, // Txn pointer + fMockDb ? nullptr : pszFile, // Filename "main", // Logical db name DB_BTREE, // Database type nFlags, // Flags @@ -274,7 +274,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) : if (ret != 0) { delete pdb; - pdb = NULL; + pdb = nullptr; --bitdb.mapFileUseCount[strFile]; strFile = ""; throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret)); @@ -307,8 +307,8 @@ void CDB::Close() return; if (activeTxn) activeTxn->abort(); - activeTxn = NULL; - pdb = NULL; + activeTxn = nullptr; + pdb = nullptr; // Flush database activity from memory pool to disk log unsigned int nMinutes = 0; @@ -331,13 +331,13 @@ void CDBEnv::CloseDb(const string& strFile) { { LOCK(cs_db); - if (mapDb[strFile] != NULL) + if (mapDb[strFile] != nullptr) { // Close the database handle Db* pdb = mapDb[strFile]; pdb->close(0); delete pdb; - mapDb[strFile] = NULL; + mapDb[strFile] = nullptr; } } } @@ -347,7 +347,7 @@ bool CDBEnv::RemoveDb(const string& strFile) this->CloseDb(strFile); LOCK(cs_db); - int rc = dbenv.dbremove(NULL, strFile.c_str(), NULL, DB_AUTO_COMMIT); + int rc = dbenv.dbremove(nullptr, strFile.c_str(), nullptr, DB_AUTO_COMMIT); return (rc == 0); } @@ -371,7 +371,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip) CDB db(strFile.c_str(), "r"); Db* pdbCopy = new Db(&bitdb.dbenv, 0); - int ret = pdbCopy->open(NULL, // Txn pointer + int ret = pdbCopy->open(nullptr, // Txn pointer strFileRes.c_str(), // Filename "main", // Logical db name DB_BTREE, // Database type @@ -412,7 +412,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip) } Dbt datKey(&ssKey[0], ssKey.size()); Dbt datValue(&ssValue[0], ssValue.size()); - int ret2 = pdbCopy->put(NULL, &datKey, &datValue, DB_NOOVERWRITE); + int ret2 = pdbCopy->put(nullptr, &datKey, &datValue, DB_NOOVERWRITE); if (ret2 > 0) fSuccess = false; } @@ -428,10 +428,10 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip) if (fSuccess) { Db dbA(&bitdb.dbenv, 0); - if (dbA.remove(strFile.c_str(), NULL, 0)) + if (dbA.remove(strFile.c_str(), nullptr, 0)) fSuccess = false; Db dbB(&bitdb.dbenv, 0); - if (dbB.rename(strFileRes.c_str(), NULL, strFile.c_str(), 0)) + if (dbB.rename(strFileRes.c_str(), nullptr, strFile.c_str(), 0)) fSuccess = false; } if (!fSuccess) diff --git a/src/db.h b/src/db.h index e36f1c1..4cfb420 100644 --- a/src/db.h +++ b/src/db.h @@ -84,10 +84,10 @@ public: DbTxn *TxnBegin(int flags=DB_TXN_WRITE_NOSYNC) { - DbTxn* ptxn = NULL; - int ret = dbenv.txn_begin(NULL, &ptxn, flags); + DbTxn* ptxn = nullptr; + int ret = dbenv.txn_begin(nullptr, &ptxn, flags); if (!ptxn || ret != 0) - return NULL; + return nullptr; return ptxn; } }; @@ -130,7 +130,7 @@ protected: datValue.set_flags(DB_DBT_MALLOC); int ret = pdb->get(activeTxn, &datKey, &datValue, 0); memset(datKey.get_data(), 0, datKey.get_size()); - if (datValue.get_data() == NULL) + if (datValue.get_data() == nullptr) return false; // Unserialize value @@ -222,11 +222,11 @@ protected: Dbc* GetCursor() { if (!pdb) - return NULL; - Dbc* pcursor = NULL; - int ret = pdb->cursor(NULL, &pcursor, 0); + return nullptr; + Dbc* pcursor = nullptr; + int ret = pdb->cursor(nullptr, &pcursor, 0); if (ret != 0) - return NULL; + return nullptr; return pcursor; } @@ -250,7 +250,7 @@ protected: int ret = pcursor->get(&datKey, &datValue, fFlags); if (ret != 0) return ret; - else if (datKey.get_data() == NULL || datValue.get_data() == NULL) + else if (datKey.get_data() == nullptr || datValue.get_data() == nullptr) return 99999; // Convert to streams @@ -286,7 +286,7 @@ public: if (!pdb || !activeTxn) return false; int ret = activeTxn->commit(0); - activeTxn = NULL; + activeTxn = nullptr; return (ret == 0); } @@ -295,7 +295,7 @@ public: if (!pdb || !activeTxn) return false; int ret = activeTxn->abort(); - activeTxn = NULL; + activeTxn = nullptr; return (ret == 0); } @@ -310,7 +310,7 @@ public: return Write(std::string("version"), nVersion); } - bool static Rewrite(const std::string& strFile, const char* pszSkip = NULL); + bool static Rewrite(const std::string& strFile, const char* pszSkip = nullptr); }; diff --git a/src/init.cpp b/src/init.cpp index a61b40c..371443a 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -24,6 +24,7 @@ #endif #include "notificationqueue.h" #include "addressindex.h" +#include #include #include #include @@ -51,20 +52,20 @@ using namespace std; using namespace boost; namespace fs = std::filesystem; -CWallet* pwalletMain; +std::unique_ptr pwalletMain; CClientUIInterface uiInterface; std::string strWalletFileName; bool fConfChange; bool fEnforceCanonical; unsigned int nNodeLifespan; unsigned int nDerivationMethodIndex; -//unsigned int nMinerSleep; + bool fUseFastIndex; enum Checkpoints::CPMode CheckpointsMode; static CCriticalSection cs_DeferredStartup; static bool fDeferredStartupRunning = false; -static std::vector* pScriptCheckThreads = nullptr; +static std::unique_ptr> pScriptCheckThreads; static void ThreadScriptCheck() { @@ -109,7 +110,7 @@ fRequestShutdown = true; uiInterface.QueueShutdown(); #else // Without UI, Shutdown() can simply be started in a new thread - NewThread(Shutdown, NULL); + NewThread(Shutdown, nullptr); #endif } @@ -178,7 +179,7 @@ void ThreadDeferredStartup(void* parg) } catch (...) { - PrintExceptionContinue(NULL, "ThreadDeferredStartup()"); + PrintExceptionContinue(nullptr, "ThreadDeferredStartup()"); } { @@ -235,11 +236,9 @@ void Shutdown(void* parg) { for (std::thread& t : *pScriptCheckThreads) if (t.joinable()) t.join(); - delete pScriptCheckThreads; - pScriptCheckThreads = nullptr; + pScriptCheckThreads.reset(); } - delete pScriptCheckQueue; - pScriptCheckQueue = NULL; + pScriptCheckQueue.reset(); } // NOW safe to destroy Tor state - all threads have stopped @@ -251,24 +250,24 @@ void Shutdown(void* parg) { pzmqNotifier->Shutdown(); delete pzmqNotifier; - pzmqNotifier = NULL; + pzmqNotifier = nullptr; } #endif if (pNotificationQueue) { delete pNotificationQueue; - pNotificationQueue = NULL; + pNotificationQueue = nullptr; } // MakeChainDB()->Close(); bitdb.Flush(false); bitdb.Flush(true); fs::remove(GetPidFile()); - UnregisterWallet(pwalletMain); - delete pwalletMain; + UnregisterWallet(pwalletMain.get()); + pwalletMain.reset(); // DB is flushed and wallet saved - safe to force-exit if something hangs - NewThread(ExitTimeout, NULL); + NewThread(ExitTimeout, nullptr); MilliSleep(50); printf("Triangles exited\n\n"); fExit = true; @@ -318,7 +317,7 @@ bool AppInit(int argc, char* argv[]) if (!fs::is_directory(GetDataDir(false))) { fprintf(stderr, "Error: Specified directory does not exist\n"); - Shutdown(NULL); + Shutdown(nullptr); } ReadConfigFile(mapArgs, mapMultiArgs); @@ -354,10 +353,10 @@ bool AppInit(int argc, char* argv[]) catch (std::exception& e) { PrintException(&e, "AppInit()"); } catch (...) { - PrintException(NULL, "AppInit()"); + PrintException(nullptr, "AppInit()"); } if (!fRet) - Shutdown(NULL); + Shutdown(nullptr); return fRet; } @@ -542,7 +541,7 @@ bool AppInit2() #ifdef _MSC_VER // Turn off Microsoft heap dump noise _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); - _CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0)); + _CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, 0)); #endif #if _MSC_VER >= 1400 // Disable confusing "helpful" text message on abort, Ctrl-C @@ -559,7 +558,7 @@ bool AppInit2() #endif typedef BOOL (WINAPI *PSETPROCDEPPOL)(DWORD); PSETPROCDEPPOL setProcDEPPol = (PSETPROCDEPPOL)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "SetProcessDEPPolicy"); - if (setProcDEPPol != NULL) setProcDEPPol(PROCESS_DEP_ENABLE); + if (setProcDEPPol != nullptr) setProcDEPPol(PROCESS_DEP_ENABLE); #endif #ifndef WIN32 umask(077); @@ -569,15 +568,15 @@ bool AppInit2() sa.sa_handler = HandleSIGTERM; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; - sigaction(SIGTERM, &sa, NULL); - sigaction(SIGINT, &sa, NULL); + sigaction(SIGTERM, &sa, nullptr); + sigaction(SIGINT, &sa, nullptr); // Reopen debug.log on SIGHUP struct sigaction sa_hup; sa_hup.sa_handler = HandleSIGHUP; sigemptyset(&sa_hup.sa_mask); sa_hup.sa_flags = 0; - sigaction(SIGHUP, &sa_hup, NULL); + sigaction(SIGHUP, &sa_hup, nullptr); #endif // ********************************************************* Step 2: parameter interactions @@ -706,8 +705,8 @@ bool AppInit2() nScriptCheckThreads = 16; if (nScriptCheckThreads > 1) { - pScriptCheckQueue = new CCheckQueue(32); - pScriptCheckThreads = new std::vector(); + pScriptCheckQueue = std::make_unique>(32); + pScriptCheckThreads = std::make_unique>(); for (int i = 0; i < nScriptCheckThreads - 1; ++i) pScriptCheckThreads->emplace_back(&ThreadScriptCheck); printf("Script verification threads: %d workers + main thread\n", nScriptCheckThreads - 1); @@ -1142,7 +1141,7 @@ bool AppInit2() printf("Loading wallet...\n"); nStart = GetTimeMillis(); bool fFirstRun = true; - pwalletMain = new CWallet(strWalletFileName); + pwalletMain = std::make_unique(strWalletFileName); // Auto-backup wallet.dat before loading (protects against corruption during load/flush) { @@ -1186,9 +1185,9 @@ bool AppInit2() int nMaxVersion = GetArg("-upgradewallet", 0); if (nMaxVersion == 0) // the -upgradewallet without argument case { - printf("Performing wallet upgrade to %i\n", FEATURE_LATEST); + printf("Performing wallet upgrade to %i\n", static_cast(WalletFeature::Latest)); nMaxVersion = CLIENT_VERSION; - pwalletMain->SetMinVersion(FEATURE_LATEST); // permanently upgrade the wallet immediately + pwalletMain->SetMinVersion(WalletFeature::Latest); // permanently upgrade the wallet immediately } else printf("Allowing wallet upgrade up to %i\n", nMaxVersion); @@ -1214,7 +1213,7 @@ bool AppInit2() printf(" wallet %15" PRId64 "ms\n", GetTimeMillis() - nStart); StartupPerfLog("wallet_load", GetTimeMillis() - nStart, strprintf("firstrun=%d", fFirstRun)); - RegisterWallet(pwalletMain); + RegisterWallet(pwalletMain.get()); CBlockIndex *pindexRescan = pindexBest; if (GetBoolArg("-rescan")) @@ -1404,7 +1403,7 @@ bool AppInit2() // Launch background thread for Tor health monitoring and seeder maintenance if (torStarted) { - if (!NewThread(ThreadTorMaintenance, NULL)) + if (!NewThread(ThreadTorMaintenance, nullptr)) printf("Warning: ThreadTorMaintenance could not be started\n"); } } @@ -1472,11 +1471,11 @@ bool AppInit2() printf("mapWallet.size() = %" PRIszu "\n", pwalletMain->mapWallet.size()); printf("mapAddressBook.size() = %" PRIszu "\n", pwalletMain->mapAddressBook.size()); - if (!NewThread(StartNode, NULL)) + if (!NewThread(StartNode, nullptr)) InitError(_("Error: could not start node")); if (fServer) - NewThread(ThreadRPCServer, NULL); + NewThread(ThreadRPCServer, nullptr); // ********************************************************* Step 11.6: P2P UTXO snapshot fetch // If the chain is empty and snapshot mode is enabled (default), spawn a @@ -1492,7 +1491,7 @@ bool AppInit2() if (snapshotMode && needsSnapshot && !haveSnapshotFile && Checkpoints::GetBestSnapshotHeight() > 0) { - NewThread(ThreadSnapshotFetch, NULL); + NewThread(ThreadSnapshotFetch, nullptr); } } @@ -1500,10 +1499,10 @@ bool AppInit2() LOCK(cs_DeferredStartup); fDeferredStartupRunning = true; } - if (!NewThread(ThreadDeferredStartup, NULL)) + if (!NewThread(ThreadDeferredStartup, nullptr)) { printf("Warning: deferred startup thread could not be started, running inline\n"); - ThreadDeferredStartup(NULL); + ThreadDeferredStartup(nullptr); } StartupPerfLog("start_services", GetTimeMillis() - nStart); @@ -1522,7 +1521,7 @@ bool AppInit2() { printf("ZMQ: Failed to initialize publisher on %s\n", zmqAddr.c_str()); delete pzmqNotifier; - pzmqNotifier = NULL; + pzmqNotifier = nullptr; } } } diff --git a/src/init.h b/src/init.h index 486966a..4f91850 100644 --- a/src/init.h +++ b/src/init.h @@ -7,8 +7,9 @@ #include "wallet.h" #include "tor_embed_hooks.h" +#include -extern CWallet* pwalletMain; +extern std::unique_ptr pwalletMain; extern std::string strWalletFileName; void StartShutdown(); bool ShutdownRequested(); diff --git a/src/key.h b/src/key.h index dafa62d..93d8c8a 100644 --- a/src/key.h +++ b/src/key.h @@ -68,7 +68,7 @@ public: CPubKey() { } CPubKey(const std::vector &vchPubKeyIn) : vchPubKey(vchPubKeyIn) { } friend bool operator==(const CPubKey &a, const CPubKey &b) { return a.vchPubKey == b.vchPubKey; } - friend bool operator!=(const CPubKey &a, const CPubKey &b) { return a.vchPubKey != b.vchPubKey; } + friend bool operator!=(const CPubKey &a, const CPubKey &b) = default; friend bool operator<(const CPubKey &a, const CPubKey &b) { return a.vchPubKey < b.vchPubKey; } IMPLEMENT_SERIALIZE( diff --git a/src/keystore.cpp b/src/keystore.cpp index 41eb329..dbbd51c 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -50,10 +50,9 @@ bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut) { { LOCK(cs_KeyStore); - ScriptMap::const_iterator mi = mapScripts.find(hash); - if (mi != mapScripts.end()) + if (auto mi = mapScripts.find(hash); mi != mapScripts.end()) { - redeemScriptOut = (*mi).second; + redeemScriptOut = mi->second; return true; } } @@ -94,11 +93,10 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn) if (!SetCrypted()) return false; - CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin(); - for (; mi != mapCryptedKeys.end(); ++mi) + for (const auto& [key, val] : mapCryptedKeys) { - const CPubKey &vchPubKey = (*mi).second.first; - const std::vector &vchCryptedSecret = (*mi).second.second; + const CPubKey &vchPubKey = val.first; + const std::vector &vchCryptedSecret = val.second; CSecret vchSecret; if(!DecryptSecret(vMasterKeyIn, vchCryptedSecret, vchPubKey.GetHash(), vchSecret)) return false; @@ -159,11 +157,10 @@ bool CCryptoKeyStore::GetKey(const CKeyID &address, CKey& keyOut) const if (!IsCrypted()) return CBasicKeyStore::GetKey(address, keyOut); - CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); - if (mi != mapCryptedKeys.end()) + if (auto mi = mapCryptedKeys.find(address); mi != mapCryptedKeys.end()) { - const CPubKey &vchPubKey = (*mi).second.first; - const std::vector &vchCryptedSecret = (*mi).second.second; + const CPubKey &vchPubKey = mi->second.first; + const std::vector &vchCryptedSecret = mi->second.second; CSecret vchSecret; if (!DecryptSecret(vMasterKey, vchCryptedSecret, vchPubKey.GetHash(), vchSecret)) return false; @@ -184,10 +181,9 @@ bool CCryptoKeyStore::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) co if (!IsCrypted()) return CKeyStore::GetPubKey(address, vchPubKeyOut); - CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); - if (mi != mapCryptedKeys.end()) + if (auto mi = mapCryptedKeys.find(address); mi != mapCryptedKeys.end()) { - vchPubKeyOut = (*mi).second.first; + vchPubKeyOut = mi->second.first; return true; } } diff --git a/src/keystore.h b/src/keystore.h index 9034a14..789c16c 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -70,11 +70,9 @@ public: setAddress.clear(); { LOCK(cs_KeyStore); - KeyMap::const_iterator mi = mapKeys.begin(); - while (mi != mapKeys.end()) + for (const auto& [key, val] : mapKeys) { - setAddress.insert((*mi).first); - mi++; + setAddress.insert(key); } } } @@ -82,11 +80,10 @@ public: { { LOCK(cs_KeyStore); - KeyMap::const_iterator mi = mapKeys.find(address); - if (mi != mapKeys.end()) + if (auto mi = mapKeys.find(address); mi != mapKeys.end()) { keyOut.Reset(); - keyOut.SetSecret((*mi).second.first, (*mi).second.second); + keyOut.SetSecret(mi->second.first, mi->second.second); return true; } } @@ -160,17 +157,16 @@ public: bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const; void GetKeys(std::set &setAddress) const { + LOCK(cs_KeyStore); if (!IsCrypted()) { CBasicKeyStore::GetKeys(setAddress); return; } setAddress.clear(); - CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin(); - while (mi != mapCryptedKeys.end()) + for (const auto& [key, val] : mapCryptedKeys) { - setAddress.insert((*mi).first); - mi++; + setAddress.insert(key); } } diff --git a/src/main.cpp b/src/main.cpp index 9fa22f1..af20602 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,6 +23,7 @@ #include "snapshotnet.h" #include #include +#include #include #include #include @@ -43,12 +44,11 @@ CCriticalSection cs_main; CTxMemPool mempool; unsigned int nTransactionsUpdated = 0; -CCheckQueue* pScriptCheckQueue = NULL; +std::unique_ptr> pScriptCheckQueue; map mapBlockIndex; set > setStakeSeen; -//libzerocoin::Params* ZCParams; -//uint256 hashGenesisBlock = hashGenesisBlockOfficial; + static CBigNum bnProofOfWorkLimit(~uint256(0) >> 8); static CBigNum bnProofOfStakeLimit(~uint256(0) >> 8); @@ -63,7 +63,7 @@ unsigned int nModifierInterval = 5 * 60 ; // .5 time to elapse before new modif int64_t nChainStartTime = 1405500418; int nCoinbaseMaturity = 7; //overall maturity: currently 7 blocks, maybe subject to increase -CBlockIndex* pindexGenesisBlock = NULL; +CBlockIndex* pindexGenesisBlock = nullptr; int nBestHeight = -1; int nHighestInvWalk = 0; // height of walk-forward progress through already-have inv uint256 hashHighestInvWalk = 0; // hash of that block @@ -72,8 +72,8 @@ uint256 nBestChainTrust = 0; uint256 nBestInvalidTrust = 0; uint256 hashBestChain = 0; -CBlockIndex* pindexBest = NULL; -CBlockIndex* pindexFinalized = NULL; // auto-checkpoint: deepest finalized block +CBlockIndex* pindexBest = nullptr; +CBlockIndex* pindexFinalized = nullptr; // auto-checkpoint: deepest finalized block bool fAddressIndex = false; int64_t nTimeBestReceived = 0; @@ -81,10 +81,10 @@ CMedianFilter cPeerBlockCounts(5, 0); // Amount of blocks that other nodes CScriptVerifyCache scriptVerifyCache; -map mapOrphanBlocks; +map> mapOrphanBlocks; multimap mapOrphanBlocksByPrev; set > setStakeSeenOrphan; -//map mapProofOfStake; + map mapOrphanTransactions; map > mapOrphanTransactionsByPrev; @@ -107,8 +107,7 @@ CScript COINBASE_FLAGS; const string strMessageMagic = "Triangles Signed Message:\n"; -//double dHashesPerSec; -//int64_t nHPSTimerStart; + // Settings int64_t nTransactionFee = MIN_TX_FEE; @@ -193,7 +192,7 @@ static void ThreadPostIbdWork(void* parg) } catch (...) { - PrintExceptionContinue(NULL, "ThreadPostIbdWork()"); + PrintExceptionContinue(nullptr, "ThreadPostIbdWork()"); } } @@ -210,16 +209,14 @@ static uint256 GetHeaderSyncTrust(unsigned int nBits) static bool GetKnownHeaderState(const uint256& hash, int& nHeight, uint256& nChainTrust) { - std::map::const_iterator miBlock = mapBlockIndex.find(hash); - if (miBlock != mapBlockIndex.end()) + if (auto miBlock = mapBlockIndex.find(hash); miBlock != mapBlockIndex.end()) { nHeight = miBlock->second->nHeight; nChainTrust = miBlock->second->nChainTrust; return true; } - std::map::const_iterator miHeader = mapHeaderSync.find(hash); - if (miHeader != mapHeaderSync.end()) + if (auto miHeader = mapHeaderSync.find(hash); miHeader != mapHeaderSync.end()) { nHeight = miHeader->second.nHeight; nChainTrust = miHeader->second.nChainTrust; @@ -231,15 +228,13 @@ static bool GetKnownHeaderState(const uint256& hash, int& nHeight, uint256& nCha static bool GetHeaderSyncPrevHash(const uint256& hash, uint256& hashPrev) { - std::map::const_iterator miHeader = mapHeaderSync.find(hash); - if (miHeader != mapHeaderSync.end()) + if (auto miHeader = mapHeaderSync.find(hash); miHeader != mapHeaderSync.end()) { hashPrev = miHeader->second.header.hashPrevBlock; return true; } - std::map::const_iterator miBlock = mapBlockIndex.find(hash); - if (miBlock != mapBlockIndex.end() && miBlock->second->pprev) + if (auto miBlock = mapBlockIndex.find(hash); miBlock != mapBlockIndex.end() && miBlock->second->pprev) { hashPrev = miBlock->second->pprev->GetBlockHash(); return true; @@ -253,12 +248,12 @@ static void RecomputeBestHeaderSync() hashBestHeaderSync = 0; uint256 nBestTrust = 0; - for (std::map::const_iterator it = mapHeaderSync.begin(); it != mapHeaderSync.end(); ++it) + for (const auto& [hash, node] : mapHeaderSync) { - if (hashBestHeaderSync == 0 || it->second.nChainTrust > nBestTrust) + if (hashBestHeaderSync == 0 || node.nChainTrust > nBestTrust) { - hashBestHeaderSync = it->first; - nBestTrust = it->second.nChainTrust; + hashBestHeaderSync = hash; + nBestTrust = node.nChainTrust; } } } @@ -354,7 +349,7 @@ static bool AddHeaderSyncNode(const CBlock& header, const uint256& hashHeader) node.nFirstRequestTime = 0; node.nInsertTime = GetTime() * 1000000; - mapHeaderSync.insert(std::make_pair(hashHeader, node)); + mapHeaderSync.insert({hashHeader, node}); if (hashBestHeaderSync == 0 || node.nChainTrust > mapHeaderSync[hashBestHeaderSync].nChainTrust) hashBestHeaderSync = hashHeader; @@ -398,7 +393,7 @@ static std::vector GetHeaderSyncDownloadPath(uint256 hashTip) while (hashTip != 0 && !mapBlockIndex.count(hashTip)) { - std::map::const_iterator mi = mapHeaderSync.find(hashTip); + auto mi = mapHeaderSync.find(hashTip); if (mi == mapHeaderSync.end()) break; @@ -414,9 +409,9 @@ static unsigned int CountHeaderSyncInFlight() { const int64_t nNow = GetTime() * 1000000; unsigned int nInFlight = 0; - for (std::map::const_iterator it = mapHeaderSync.begin(); it != mapHeaderSync.end(); ++it) + for (const auto& [hash, node] : mapHeaderSync) { - if (it->second.fRequested && nNow - it->second.nLastRequestTime < HEADER_REQUEST_TIMEOUT_MICROS) + if (node.fRequested && nNow - node.nLastRequestTime < HEADER_REQUEST_TIMEOUT_MICROS) ++nInFlight; } return nInFlight; @@ -435,7 +430,7 @@ static int GetHeaderSyncPlannerHeight() if (hashBestHeaderSync == 0) return pindexBest ? pindexBest->nHeight : -1; - std::map::const_iterator mi = mapHeaderSync.find(hashBestHeaderSync); + auto mi = mapHeaderSync.find(hashBestHeaderSync); if (mi == mapHeaderSync.end()) return pindexBest ? pindexBest->nHeight : -1; @@ -455,19 +450,19 @@ static unsigned int QueueHeaderSyncBlocks(CNode* pfrom, unsigned int nWindow) unsigned int nInFlight = CountHeaderSyncInFlight(); unsigned int nQueued = 0; - for (std::vector::const_iterator it = vPath.begin(); it != vPath.end(); ++it) + for (const auto& hash : vPath) { if (nInFlight + nQueued >= nWindow) break; - std::map::iterator mi = mapHeaderSync.find(*it); + auto mi = mapHeaderSync.find(hash); if (mi == mapHeaderSync.end()) continue; if (mi->second.fRequested && nNow - mi->second.nLastRequestTime < HEADER_REQUEST_TIMEOUT_MICROS) continue; - pfrom->AskFor(CInv(MSG_BLOCK, *it)); + pfrom->AskFor(CInv(MSG_BLOCK, hash)); mi->second.fRequested = true; mi->second.nLastRequestTime = nNow; ++nQueued; @@ -479,7 +474,7 @@ static unsigned int QueueHeaderSyncBlocks(CNode* pfrom, unsigned int nWindow) // Returns the first request time (microseconds) for a block in the header sync cache, or 0 static int64_t GetHeaderSyncRequestTime(const uint256& hashBlock) { - std::map::const_iterator mi = mapHeaderSync.find(hashBlock); + auto mi = mapHeaderSync.find(hashBlock); if (mi == mapHeaderSync.end()) return 0; return mi->second.nFirstRequestTime; @@ -487,7 +482,7 @@ static int64_t GetHeaderSyncRequestTime(const uint256& hashBlock) static void MarkHeaderSyncBlockAccepted(const uint256& hashBlock) { - std::map::iterator mi = mapHeaderSync.find(hashBlock); + auto mi = mapHeaderSync.find(hashBlock); if (mi == mapHeaderSync.end()) return; @@ -534,7 +529,7 @@ static bool RequestHeaderSyncRefill(CNode* pfrom, uint256 hashTip, int64_t nMinI if (!pindexBest) return false; - pfrom->pindexLastGetHeadersBegin = NULL; + pfrom->pindexLastGetHeadersBegin = nullptr; pfrom->PushGetHeaders(pindexBest, uint256(0)); hashLocatorTip = pindexBest->GetBlockHash(); } @@ -636,46 +631,35 @@ static unsigned int QueueHeaderSyncBlocksParallel(unsigned int nWindow) } // Distribute blocks across peers using speed-weighted assignment - for (std::vector::const_iterator it = vPath.begin(); it != vPath.end(); ++it) + for (const auto& hash : vPath) { if (nInFlight + nQueued >= nWindow) break; - std::map::iterator mi = mapHeaderSync.find(*it); + auto mi = mapHeaderSync.find(hash); if (mi == mapHeaderSync.end()) continue; - // Check if already requested recently (using adaptive timeout) bool fNeedsRequest = false; if (!mi->second.fRequested) { - // Never requested - request now fNeedsRequest = true; } else if (nNow - mi->second.nLastRequestTime >= nAdaptiveTimeout) { - // Adaptive timeout expired - retry fNeedsRequest = true; } else if (nNow - mi->second.nLastRequestTime >= HEADER_REDUNDANT_REQUEST_MICROS) { - // Redundant request: ask another peer if original is slow - // This creates parallel downloads for slow blocks fNeedsRequest = true; } if (!fNeedsRequest) continue; - // Speed-weighted assignment across peers CNode* pnode = vWeightedPeers[nPeerIndex % vWeightedPeers.size()]; - pnode->AskFor(CInv(MSG_BLOCK, *it)); + pnode->AskFor(CInv(MSG_BLOCK, hash)); - // During IBD with few peers: also request from a second peer immediately. - // Doubles bandwidth but halves worst-case latency when one peer is slow. - // When peer count is large, skip the redundancy and rely on adaptive-timeout - // retry instead — pure parallel distribution gives higher aggregate throughput - // and avoids burning Tor bandwidth on duplicate fetches. if (IsInitialBlockDownload() && vWeightedPeers.size() >= 2 && vWeightedPeers.size() < HEADER_REDUNDANT_PEER_THRESHOLD && @@ -683,10 +667,9 @@ static unsigned int QueueHeaderSyncBlocksParallel(unsigned int nWindow) { CNode* pnode2 = vWeightedPeers[(nPeerIndex + 1) % vWeightedPeers.size()]; if (pnode2 != pnode) - pnode2->AskFor(CInv(MSG_BLOCK, *it)); + pnode2->AskFor(CInv(MSG_BLOCK, hash)); } - // Update tracking (only on first request, not redundant) if (!mi->second.fRequested || nNow - mi->second.nLastRequestTime >= HEADER_REQUEST_TIMEOUT_MICROS) { if (!mi->second.fRequested) @@ -735,6 +718,7 @@ void UnregisterWallet(CWallet* pwalletIn) // check whether the passed transaction is from us bool static IsFromMe(CTransaction& tx) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) if (pwallet->IsFromMe(tx)) return true; @@ -744,6 +728,7 @@ bool static IsFromMe(CTransaction& tx) // get the wallet transaction with the given hash (if it exists) bool static GetTransaction(const uint256& hashTx, CWalletTx& wtx) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) if (pwallet->GetTransaction(hashTx,wtx)) return true; @@ -753,6 +738,7 @@ bool static GetTransaction(const uint256& hashTx, CWalletTx& wtx) // erases transaction with the given hash from all wallets void static EraseFromWallets(uint256 hash) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) pwallet->EraseFromWallet(hash); } @@ -765,6 +751,7 @@ void SyncWithWallets(const CTransaction& tx, const CBlock* pblock, bool fUpdate, // triangles: wallets need to refund inputs when disconnecting coinstake if (tx.IsCoinStake()) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) if (pwallet->IsFromMe(tx)) pwallet->DisableTransaction(tx); @@ -772,6 +759,7 @@ void SyncWithWallets(const CTransaction& tx, const CBlock* pblock, bool fUpdate, return; } + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) pwallet->AddToWalletIfInvolvingMe(tx, pblock, fUpdate); } @@ -779,13 +767,14 @@ void SyncWithWallets(const CTransaction& tx, const CBlock* pblock, bool fUpdate, // notify wallets about a new best chain void static SetBestChain(const CBlockLocator& loc) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) pwallet->SetBestChain(loc); } static bool UpdateAddressIndexSyncState(CTxDBBase& txdb, const CBlockIndex* pindexNew) { - if (!fAddressIndex || pindexNew == NULL) + if (!fAddressIndex || pindexNew == nullptr) return true; int nStartHeight = 0; @@ -801,6 +790,7 @@ static bool UpdateAddressIndexSyncState(CTxDBBase& txdb, const CBlockIndex* pind // notify wallets about an updated transaction void static UpdatedTransaction(const uint256& hashTx) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) pwallet->UpdatedTransaction(hashTx); } @@ -808,6 +798,7 @@ void static UpdatedTransaction(const uint256& hashTx) // dump all wallets void static PrintWallets(const CBlock& block) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) pwallet->PrintWallet(block); } @@ -815,6 +806,7 @@ void static PrintWallets(const CBlock& block) // notify wallets about an incoming inventory (for request counts) void static Inventory(const uint256& hash) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) pwallet->Inventory(hash); } @@ -822,6 +814,7 @@ void static Inventory(const uint256& hash) // ask wallets to resend their transactions void ResendWalletTransactions(bool fForce) { + LOCK(cs_setpwalletRegistered); for (CWallet* pwallet : setpwalletRegistered) pwallet->ResendWalletTransactions(fForce); } @@ -889,7 +882,7 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) { // Evict a random orphan: uint256 randomhash = GetRandHash(); - map::iterator it = mapOrphanTransactions.lower_bound(randomhash); + auto it = mapOrphanTransactions.lower_bound(randomhash); if (it == mapOrphanTransactions.end()) it = mapOrphanTransactions.begin(); EraseOrphanTx(it->first); @@ -985,7 +978,7 @@ bool CTransaction::AreInputsStandard(const MapPrevTx& mapInputs) const for (unsigned int i = 0; i < vin.size(); i++) { - MapPrevTx::const_iterator mi = mapInputs.find(vin[i].prevout); + auto mi = mapInputs.find(vin[i].prevout); if (mi == mapInputs.end()) return false; const CUtxoEntry& entry = mi->second; @@ -1061,7 +1054,7 @@ int CMerkleTx::SetMerkleBranch(const CBlock* pblock) else { CBlock blockTmp; - if (pblock == NULL) + if (pblock == nullptr) { // Load the block this tx is in CTxIndex txindex; @@ -1077,7 +1070,7 @@ int CMerkleTx::SetMerkleBranch(const CBlock* pblock) // Locate the transaction for (nIndex = 0; nIndex < (int)pblock->vtx.size(); nIndex++) - if (pblock->vtx[nIndex] == *(CTransaction*)this) + if (pblock->vtx[nIndex] == (const CTransaction&)*this) break; if (nIndex == (int)pblock->vtx.size()) { @@ -1092,10 +1085,10 @@ int CMerkleTx::SetMerkleBranch(const CBlock* pblock) } // Is the tx in a block that's in the main chain - map::iterator mi = mapBlockIndex.find(hashBlock); + auto mi = mapBlockIndex.find(hashBlock); if (mi == mapBlockIndex.end()) return 0; - CBlockIndex* pindex = (*mi).second; + CBlockIndex* pindex = mi->second; if (!pindex || !pindex->IsInMainChain()) return 0; @@ -1159,10 +1152,10 @@ bool CTransaction::CheckTransaction() const return true; } -int64_t CTransaction::GetMinFee(unsigned int nBlockSize, enum GetMinFee_mode mode, unsigned int nBytes) const +int64_t CTransaction::GetMinFee(unsigned int nBlockSize, GetMinFeeMode mode, unsigned int nBytes) const { // Base fee is either MIN_TX_FEE or MIN_RELAY_TX_FEE - int64_t nBaseFee = (mode == GMF_RELAY) ? MIN_RELAY_TX_FEE : MIN_TX_FEE; + int64_t nBaseFee = (mode == GetMinFeeMode::Relay) ? MIN_RELAY_TX_FEE : MIN_TX_FEE; unsigned int nNewBlockSize = nBlockSize + nBytes; int64_t nMinFee = (1 + (int64_t)nBytes / 1000) * nBaseFee; @@ -1227,7 +1220,7 @@ bool CTxMemPool::accept(CTxDBBase& txdb, CTransaction &tx, bool fCheckInputs, return false; // Check for conflicts with in-memory transactions - CTransaction* ptxOld = NULL; + CTransaction* ptxOld = nullptr; for (unsigned int i = 0; i < tx.vin.size(); i++) { COutPoint outpoint = tx.vin[i].prevout; @@ -1280,7 +1273,7 @@ bool CTxMemPool::accept(CTxDBBase& txdb, CTransaction &tx, bool fCheckInputs, unsigned int nSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); // Don't accept it if it can't get into a block - int64_t txMinFee = tx.GetMinFee(1000, GMF_RELAY, nSize); + int64_t txMinFee = tx.GetMinFee(1000, GetMinFeeMode::Relay, nSize); if (nFees < txMinFee) return error("CTxMemPool::accept() : not enough fees %s, %" PRId64 " < %" PRId64 , hash.ToString().c_str(), @@ -1380,7 +1373,7 @@ bool CTxMemPool::remove(const CTransaction &tx, bool fRecursive) { if (fRecursive) { for (unsigned int i = 0; i < tx.vout.size(); i++) { - std::map::iterator it = mapNextTx.find(COutPoint(hash, i)); + auto it = mapNextTx.find(COutPoint(hash, i)); if (it != mapNextTx.end()) remove(*it->second.ptx, true); } @@ -1399,7 +1392,7 @@ bool CTxMemPool::removeConflicts(const CTransaction &tx) // Remove transactions which depend on inputs of tx, recursively LOCK(cs); for (const CTxIn &txin : tx.vin) { - std::map::iterator it = mapNextTx.find(txin.prevout); + auto it = mapNextTx.find(txin.prevout); if (it != mapNextTx.end()) { const CTransaction &txConflict = *it->second.ptx; if (txConflict != tx) @@ -1423,8 +1416,8 @@ void CTxMemPool::queryHashes(std::vector& vtxid) LOCK(cs); vtxid.reserve(mapTx.size()); - for (map::iterator mi = mapTx.begin(); mi != mapTx.end(); ++mi) - vtxid.push_back((*mi).first); + for (const auto& [hash, tx] : mapTx) + vtxid.push_back(hash); } @@ -1436,14 +1429,13 @@ int CMerkleTx::GetDepthInMainChainINTERNAL(CBlockIndex* &pindexRet) const return 0; // Find the block it claims to be in - map::iterator mi = mapBlockIndex.find(hashBlock); + auto mi = mapBlockIndex.find(hashBlock); if (mi == mapBlockIndex.end()) return 0; - CBlockIndex* pindex = (*mi).second; + CBlockIndex* pindex = mi->second; if (!pindex || !pindex->IsInMainChain()) return 0; - // Make sure the merkle branch connects to this block if (!fMerkleVerified) { if (CBlock::CheckMerkleBranch(GetHash(), vMerkleBranch, nIndex) != pindex->hashMerkleRoot) @@ -1527,10 +1519,10 @@ int CTxIndex::GetDepthInMainChain() const if (!block.ReadFromDisk(pos.nFile, pos.nBlockPos, false)) return 0; // Find the block in the index - map::iterator mi = mapBlockIndex.find(block.GetHash()); + auto mi = mapBlockIndex.find(block.GetHash()); if (mi == mapBlockIndex.end()) return 0; - CBlockIndex* pindex = (*mi).second; + CBlockIndex* pindex = mi->second; if (!pindex || !pindex->IsInMainChain()) return 0; return 1 + nBestHeight - pindex->nHeight; @@ -1610,7 +1602,7 @@ uint256 static GetOrphanRoot(const CBlock* pblock) { // Work back to the first block in the orphan chain while (mapOrphanBlocks.count(pblock->hashPrevBlock)) - pblock = mapOrphanBlocks[pblock->hashPrevBlock]; + pblock = mapOrphanBlocks[pblock->hashPrevBlock].get(); return pblock->GetHash(); } @@ -1619,7 +1611,7 @@ uint256 WantedByOrphan(const CBlock* pblockOrphan) { // Work back to the first block in the orphan chain while (mapOrphanBlocks.count(pblockOrphan->hashPrevBlock)) - pblockOrphan = mapOrphanBlocks[pblockOrphan->hashPrevBlock]; + pblockOrphan = mapOrphanBlocks[pblockOrphan->hashPrevBlock].get(); return pblockOrphan->hashPrevBlock; } @@ -1649,7 +1641,7 @@ unsigned int LimitOrphanBlocks(unsigned int nMaxOrphans) if (it == mapOrphanBlocks.end()) continue; - CBlock* pblockEvict = it->second; + CBlock* pblockEvict = it->second.get(); // Remove from by-prev index for (auto range = mapOrphanBlocksByPrev.equal_range(pblockEvict->hashPrevBlock); @@ -1662,7 +1654,6 @@ unsigned int LimitOrphanBlocks(unsigned int nMaxOrphans) } setStakeSeenOrphan.erase(pblockEvict->GetProofOfStake()); - delete pblockEvict; mapOrphanBlocks.erase(evictHash); nEvicted++; } @@ -1702,7 +1693,14 @@ int64_t GetProofOfStakeReward(int64_t nCoinAge, int64_t nFees) nRewardCoinYear = MAX_TRI_PROOF_OF_STAKE; - int64_t nSubsidy = nCoinAge * nRewardCoinYear / 365 / COIN; + CBigNum bnSubsidy; + bnSubsidy.SetCompact(0); + bnSubsidy = nCoinAge; + bnSubsidy *= nRewardCoinYear; + bnSubsidy /= 365; + bnSubsidy /= COIN; + + int64_t nSubsidy = bnSubsidy.getint64(); if (fDebug && GetBoolArg("-printcreation")) @@ -1763,18 +1761,18 @@ static unsigned int GetNextTargetRequired_(const CBlockIndex* pindexLast, bool f { CBigNum bnTargetLimit = fProofOfStake ? bnProofOfStakeLimit : bnProofOfWorkLimit; - if (pindexLast == NULL) + if (pindexLast == nullptr) return bnTargetLimit.GetCompact(); // genesis block const CBlockIndex* pindexPrev = GetLastBlockIndex(pindexLast, fProofOfStake); - if (pindexPrev == NULL) + if (pindexPrev == nullptr) return bnTargetLimit.GetCompact(); // no previous block of this type - if (pindexPrev->pprev == NULL) + if (pindexPrev->pprev == nullptr) return bnTargetLimit.GetCompact(); // first block const CBlockIndex* pindexPrevPrev = GetLastBlockIndex(pindexPrev->pprev, fProofOfStake); - if (pindexPrevPrev == NULL) + if (pindexPrevPrev == nullptr) return bnTargetLimit.GetCompact(); // no second previous block of this type - if (pindexPrevPrev->pprev == NULL) + if (pindexPrevPrev->pprev == nullptr) return bnTargetLimit.GetCompact(); // second block int64_t nActualSpacing = pindexPrev->GetBlockTime() - pindexPrevPrev->GetBlockTime(); @@ -1808,7 +1806,7 @@ static unsigned int GetNextTargetRequired_(const CBlockIndex* pindexLast, bool f unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake) { // At fork height, reset PoS difficulty to minimum so staking can restart - if (pindexLast != NULL && pindexLast->nHeight + 1 == FORK_HEIGHT_V5 && fProofOfStake) + if (pindexLast != nullptr && pindexLast->nHeight + 1 == FORK_HEIGHT_V5 && fProofOfStake) return bnProofOfStakeLimit.GetCompact(); return GetNextTargetRequired_(pindexLast, fProofOfStake); @@ -1841,10 +1839,10 @@ bool IsInitialBlockDownload() // Bootstrap escape hatch: when the network has stalled and every node // thinks it is in IBD because the tip is older than 24h, -forcestaking // lets a single operator mint the first block to unstick the chain. - if (GetBoolArg("-forcestaking", false) && pindexBest != NULL && + if (GetBoolArg("-forcestaking", false) && pindexBest != nullptr && nBestHeight >= Checkpoints::GetTotalBlocksEstimate()) return false; - if (pindexBest == NULL || nBestHeight < Checkpoints::GetTotalBlocksEstimate()) + if (pindexBest == nullptr || nBestHeight < Checkpoints::GetTotalBlocksEstimate()) return true; static int64_t nLastUpdate; static CBlockIndex* pindexLastBest; @@ -1933,7 +1931,7 @@ bool CTransaction::FetchInputs(CTxDBBase& txdb, const MapPrevTx& mapPendingUtxos continue; // Got it already // Check pending UTXOs from earlier transactions in the same block - MapPrevTx::const_iterator mi = mapPendingUtxos.find(prevout); + auto mi = mapPendingUtxos.find(prevout); if (mi != mapPendingUtxos.end()) { inputsRet[prevout] = mi->second; @@ -1970,8 +1968,7 @@ bool CTransaction::FetchInputs(CTxDBBase& txdb, const MapPrevTx& mapPendingUtxos CBlock blockHeader; if (blockHeader.ReadFromDisk(txindex.pos.nFile, txindex.pos.nBlockPos, false)) { - std::map::iterator bmi = mapBlockIndex.find(blockHeader.GetHash()); - if (bmi != mapBlockIndex.end()) + if (auto bmi = mapBlockIndex.find(blockHeader.GetHash()); bmi != mapBlockIndex.end()) backfill.nHeight = bmi->second->nHeight; } @@ -2045,7 +2042,7 @@ int64_t CTransaction::GetValueIn(const MapPrevTx& inputs) const int64_t nResult = 0; for (unsigned int i = 0; i < vin.size(); i++) { - MapPrevTx::const_iterator mi = inputs.find(vin[i].prevout); + auto mi = inputs.find(vin[i].prevout); if (mi == inputs.end()) throw std::runtime_error("CTransaction::GetValueIn() : input not found"); nResult += mi->second.nValue; @@ -2061,7 +2058,7 @@ unsigned int CTransaction::GetP2SHSigOpCount(const MapPrevTx& inputs) const unsigned int nSigOps = 0; for (unsigned int i = 0; i < vin.size(); i++) { - MapPrevTx::const_iterator mi = inputs.find(vin[i].prevout); + auto mi = inputs.find(vin[i].prevout); if (mi == inputs.end()) continue; const CScript& scriptPubKey = mi->second.scriptPubKey; @@ -2085,7 +2082,7 @@ bool CTransaction::ConnectInputs(CTxDBBase& txdb, const MapPrevTx& inputs, for (unsigned int i = 0; i < vin.size(); i++) { COutPoint prevout = vin[i].prevout; - MapPrevTx::const_iterator mi = inputs.find(prevout); + auto mi = inputs.find(prevout); if (mi == inputs.end()) return DoS(100, error("ConnectInputs() : %s input %s:%d not found", GetHash().ToString().substr(0,10).c_str(), prevout.hash.ToString().substr(0,10).c_str(), prevout.n)); const CUtxoEntry& entry = mi->second; @@ -2393,7 +2390,7 @@ bool CBlock::ConnectBlock(CTxDBBase& txdb, CBlockIndex* pindex, bool fJustCheck) map mapQueuedChanges; // tx position index (for getrawtransaction) MapPrevTx mapPendingUtxos; // in-block UTXO tracking std::vector vChecks; - CCheckQueueControl scriptcheckcontrol(pScriptCheckQueue); + CCheckQueueControl scriptcheckcontrol(pScriptCheckQueue.get()); int64_t nFees = 0; int64_t nValueIn = 0; int64_t nValueOut = 0; @@ -2424,7 +2421,7 @@ bool CBlock::ConnectBlock(CTxDBBase& txdb, CBlockIndex* pindex, bool fJustCheck) for (const CTxIn& txin : tx.vin) { // Check in-block pending UTXOs first, then UTXO database - MapPrevTx::iterator it = mapPendingUtxos.find(txin.prevout); + auto it = mapPendingUtxos.find(txin.prevout); if (it != mapPendingUtxos.end()) nTxValueIn += it->second.nValue; else @@ -2501,7 +2498,7 @@ bool CBlock::ConnectBlock(CTxDBBase& txdb, CBlockIndex* pindex, bool fJustCheck) nStakeReward = nTxValueOut - nTxValueIn; if (!tx.ConnectInputs(txdb, mapInputs, pindex, true, false, - pScriptCheckQueue ? &vChecks : NULL)) + pScriptCheckQueue ? &vChecks : nullptr)) return false; if (pScriptCheckQueue && vChecks.size() >= 32) { @@ -2571,9 +2568,9 @@ bool CBlock::ConnectBlock(CTxDBBase& txdb, CBlockIndex* pindex, bool fJustCheck) return true; // Write queued txindex changes - for (map::iterator mi = mapQueuedChanges.begin(); mi != mapQueuedChanges.end(); ++mi) + for (const auto& [hash, txindex] : mapQueuedChanges) { - if (!txdb.UpdateTxIndex((*mi).first, (*mi).second)) + if (!txdb.UpdateTxIndex(hash, txindex)) return error("ConnectBlock() : UpdateTxIndex failed"); } @@ -2840,7 +2837,7 @@ bool static Reorganize(CTxDBBase& txdb, CBlockIndex* pindexNew) // Disconnect shorter branch (in-memory only) for (CBlockIndex* pindex : vDisconnect) if (pindex->pprev) - pindex->pprev->pnext = NULL; + pindex->pprev->pnext = nullptr; // Connect longer branch (in-memory only) for (CBlockIndex* pindex : vConnect) @@ -2909,7 +2906,7 @@ bool CBlock::SetBestChain(CTxDBBase& txdb, CBlockIndex* pindexNew) if (!txdb.TxnBegin()) return error("SetBestChain() : TxnBegin failed"); - if (pindexGenesisBlock == NULL && hash == (!fTestNet ? hashGenesisBlockOfficial : hashGenesisBlockTestNet)) + if (pindexGenesisBlock == nullptr && hash == (!fTestNet ? hashGenesisBlockOfficial : hashGenesisBlockTestNet)) { txdb.WriteHashBestChain(hash); if (!UpdateAddressIndexSyncState(txdb, pindexNew)) @@ -2982,7 +2979,7 @@ bool CBlock::SetBestChain(CTxDBBase& txdb, CBlockIndex* pindexNew) // New best block hashBestChain = hash; pindexBest = pindexNew; - pblockindexFBBHLast = NULL; + pblockindexFBBHLast = nullptr; nBestHeight = pindexBest->nHeight; nBestChainTrust = pindexNew->nChainTrust; nTimeBestReceived = GetTime(); @@ -3034,7 +3031,7 @@ bool CBlock::SetBestChain(CTxDBBase& txdb, CBlockIndex* pindexNew) { int nUpgraded = 0; const CBlockIndex* pindex = pindexBest; - for (int i = 0; i < 100 && pindex != NULL; i++) + for (int i = 0; i < 100 && pindex != nullptr; i++) { if (pindex->nVersion > CBlock::CURRENT_VERSION) ++nUpgraded; @@ -3097,7 +3094,7 @@ bool CBlock::SetBestChain(CTxDBBase& txdb, CBlockIndex* pindexNew) } } - if (fStartPostIbdWork && !NewThread(ThreadPostIbdWork, NULL)) + if (fStartPostIbdWork && !NewThread(ThreadPostIbdWork, nullptr)) { LOCK(cs_PostIbdWork); fPostIbdWorkStarted = false; @@ -3211,10 +3208,10 @@ bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos, const u if (!pindexNew) return error("AddToBlockIndex() : new CBlockIndex failed"); pindexNew->phashBlock = &hash; - map::iterator miPrev = mapBlockIndex.find(hashPrevBlock); + auto miPrev = mapBlockIndex.find(hashPrevBlock); if (miPrev != mapBlockIndex.end()) { - pindexNew->pprev = (*miPrev).second; + pindexNew->pprev = miPrev->second; pindexNew->nHeight = pindexNew->pprev->nHeight + 1; } @@ -3255,10 +3252,10 @@ bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos, const u } // Add to mapBlockIndex - map::iterator mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; + auto mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; if (pindexNew->IsProofOfStake()) setStakeSeen.insert(make_pair(pindexNew->prevoutStake, pindexNew->nStakeTime)); - pindexNew->phashBlock = &((*mi).first); + pindexNew->phashBlock = &mi->first; // Write to disk block index auto txdb_holder = MakeChainDB(); CTxDBBase& txdb = *txdb_holder; @@ -3427,10 +3424,10 @@ bool CBlock::AcceptBlock() return error("AcceptBlock() : block already in mapBlockIndex"); // Get prev block index - map::iterator mi = mapBlockIndex.find(hashPrevBlock); + auto mi = mapBlockIndex.find(hashPrevBlock); if (mi == mapBlockIndex.end()) return DoS(10, error("AcceptBlock() : prev block not found")); - CBlockIndex* pindexPrev = (*mi).second; + CBlockIndex* pindexPrev = mi->second; int nHeight = pindexPrev->nHeight+1; if (IsProofOfWork() && nHeight > CUTOFF_POW_BLOCK) @@ -3580,7 +3577,7 @@ uint256 CBlockIndex::GetBlockTrust() const bool CBlockIndex::IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned int nRequired, unsigned int nToCheck) { unsigned int nFound = 0; - for (unsigned int i = 0; i < nToCheck && nFound < nRequired && pstart != NULL; i++) + for (unsigned int i = 0; i < nToCheck && nFound < nRequired && pstart != nullptr; i++) { if (pstart->nVersion >= minVersion) ++nFound; @@ -3653,7 +3650,7 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) if (!mapBlockIndex.count(pblock->hashPrevBlock)) { printf("ProcessBlock: ORPHAN BLOCK, prev=%s\n", pblock->hashPrevBlock.ToString().substr(0,20).c_str()); - CBlock* pblock2 = new CBlock(*pblock); + std::unique_ptr pblock2 = std::make_unique(*pblock); // triangles: check proof-of-stake if (pblock2->IsProofOfStake()) { @@ -3664,8 +3661,8 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) else setStakeSeenOrphan.insert(pblock2->GetProofOfStake()); } - mapOrphanBlocks.insert(make_pair(hash, pblock2)); - mapOrphanBlocksByPrev.insert(make_pair(pblock2->hashPrevBlock, pblock2)); + mapOrphanBlocks.insert(make_pair(hash, std::move(pblock2))); + mapOrphanBlocksByPrev.insert(make_pair(pblock2->hashPrevBlock, pblock2.get())); dequeOrphanOrder.push_back(hash); // track insertion order for FIFO eviction // Limit orphan blocks to prevent memory exhaustion. @@ -3677,11 +3674,11 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) // Ask this guy to fill in what we're missing if (pfrom && pindexBest) { - pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock2)); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock2.get())); // triangles: getblocks may not obtain the ancestor block rejected // earlier by duplicate-stake check so we ask for it again directly if (!IsInitialBlockDownload()) - pfrom->AskFor(CInv(MSG_BLOCK, WantedByOrphan(pblock2))); + pfrom->AskFor(CInv(MSG_BLOCK, WantedByOrphan(pblock2.get()))); } return true; } @@ -3698,11 +3695,11 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) for (unsigned int i = 0; i < vWorkQueue.size(); i++) { uint256 hashPrev = vWorkQueue[i]; - for (multimap::iterator mi = mapOrphanBlocksByPrev.lower_bound(hashPrev); - mi != mapOrphanBlocksByPrev.upper_bound(hashPrev); - ++mi) - { - CBlock* pblockOrphan = (*mi).second; + for (auto mi = mapOrphanBlocksByPrev.lower_bound(hashPrev); + mi != mapOrphanBlocksByPrev.upper_bound(hashPrev); + ++mi) + { + CBlock* pblockOrphan = mi->second; if (pblockOrphan->AcceptBlock()) { vWorkQueue.push_back(pblockOrphan->GetHash()); @@ -3710,7 +3707,6 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) } mapOrphanBlocks.erase(pblockOrphan->GetHash()); setStakeSeenOrphan.erase(pblockOrphan->GetProofOfStake()); - delete pblockOrphan; } mapOrphanBlocksByPrev.erase(hashPrev); } @@ -3847,16 +3843,16 @@ static fs::path BlockFilePath(unsigned int nFile) FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode) { if ((nFile < 1) || (nFile == (unsigned int) -1)) - return NULL; + return nullptr; FILE* file = fopen(BlockFilePath(nFile).string().c_str(), pszMode); if (!file) - return NULL; + return nullptr; if (nBlockPos != 0 && !strchr(pszMode, 'a') && !strchr(pszMode, 'w')) { if (fseek(file, nBlockPos, SEEK_SET) != 0) { fclose(file); - return NULL; + return nullptr; } } return file; @@ -3871,9 +3867,9 @@ FILE* AppendBlockFile(unsigned int& nFileRet) { FILE* file = OpenBlockFile(nCurrentBlockFile, 0, "ab"); if (!file) - return NULL; + return nullptr; if (fseek(file, 0, SEEK_END) != 0) - return NULL; + return nullptr; // FAT32 file size max 4GB, fseek and ftell max 2GB, so we must stay under 2GB if (ftell(file) < (long)(0x7F000000 - MAX_SIZE)) { @@ -4005,9 +4001,8 @@ void PrintBlockTree() { // pre-compute tree structure map > mapNext; - for (map::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi) + for (const auto& [hash, pindex] : mapBlockIndex) { - CBlockIndex* pindex = (*mi).second; mapNext[pindex->pprev].push_back(pindex); // test //while (rand() % 3 == 0) @@ -4133,7 +4128,7 @@ bool LoadExternalBlockFile(FILE* fileIn) { // Already indexed - skip silently } - else if (ProcessBlock(NULL,&block)) + else if (ProcessBlock(nullptr,&block)) nLoaded++; nPos += 4 + nSize; } @@ -4255,10 +4250,10 @@ bool FastImportBlockFile() break; // Link to previous block - map::iterator miPrev = mapBlockIndex.find(block.hashPrevBlock); + auto miPrev = mapBlockIndex.find(block.hashPrevBlock); if (miPrev != mapBlockIndex.end()) { - pindexNew->pprev = (*miPrev).second; + pindexNew->pprev = miPrev->second; pindexNew->nHeight = pindexNew->pprev->nHeight + 1; } @@ -4288,8 +4283,8 @@ bool FastImportBlockFile() setStakeSeen.insert(make_pair(pindexNew->prevoutStake, pindexNew->nStakeTime)); // Insert into mapBlockIndex - map::iterator mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; - pindexNew->phashBlock = &((*mi).first); + auto mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; + pindexNew->phashBlock = &mi->first; // Link pnext for previous block if (pindexNew->pprev) @@ -4355,14 +4350,14 @@ bool FastImportBlockFile() { hashBestChain = hash; pindexBest = pindexNew; - pblockindexFBBHLast = NULL; + pblockindexFBBHLast = nullptr; nBestHeight = pindexNew->nHeight; nBestChainTrust = pindexNew->nChainTrust; nTimeBestReceived = GetTime(); } // Set genesis block - if (pindexGenesisBlock == NULL && pindexNew->nHeight == 0) + if (pindexGenesisBlock == nullptr && pindexNew->nHeight == 0) pindexGenesisBlock = pindexNew; nLoaded++; @@ -4717,8 +4712,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) } // Small network: relay to more peers so addresses propagate quickly int nRelayNodes = fReachable ? (int)mapMix.size() : 1; - for (multimap::iterator mi = mapMix.begin(); mi != mapMix.end() && nRelayNodes-- > 0; ++mi) - ((*mi).second)->PushAddress(addr); + for (auto mi = mapMix.begin(); mi != mapMix.end() && nRelayNodes-- > 0; ++mi) + mi->second->PushAddress(addr); } } // Do not store addresses outside our network @@ -4770,8 +4765,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (inv.type == MSG_BLOCK) { if (fAlreadyHave) { nAlready++; - std::map::iterator mi = mapBlockIndex.find(inv.hash); - if (mi != mapBlockIndex.end()) { + if (auto mi = mapBlockIndex.find(inv.hash); mi != mapBlockIndex.end()) { int h = mi->second->nHeight; if (nFirstInvHeight == -1) nFirstInvHeight = h; nLastInvHeight = h; @@ -4787,7 +4781,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (!fAlreadyHave) pfrom->AskFor(inv); else if (inv.type == MSG_BLOCK && mapOrphanBlocks.count(inv.hash)) { - pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(mapOrphanBlocks[inv.hash])); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(mapOrphanBlocks[inv.hash].get())); } else if (nInv == nLastBlock) { // Continuation: walk forward from the last inv block. // Don't jump to pindexBest — its CBlockLocator exponential @@ -4799,7 +4793,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) nHighestInvWalk = nInvH; hashHighestInvWalk = inv.hash; } - pfrom->pindexLastGetBlocksBegin = NULL; // reset dedup + pfrom->pindexLastGetBlocksBegin = nullptr; // reset dedup pfrom->PushGetBlocks(mapBlockIndex[inv.hash], uint256(0)); printf("SYNC-DIAG: inv walk-forward from %d (best=%d, walk=%d)\n", nInvH, nBestHeight, nHighestInvWalk); @@ -4839,11 +4833,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (inv.type == MSG_BLOCK) { // Send block from disk - map::iterator mi = mapBlockIndex.find(inv.hash); + auto mi = mapBlockIndex.find(inv.hash); if (mi != mapBlockIndex.end()) { CBlock block; - block.ReadFromDisk((*mi).second); + block.ReadFromDisk(mi->second); pfrom->PushMessage("block", block); // Trigger them to send a getblocks request for the next batch of inventory @@ -4866,9 +4860,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) bool pushed = false; { LOCK(cs_mapRelay); - map::iterator mi = mapRelay.find(inv); - if (mi != mapRelay.end()) { - pfrom->PushMessage(inv.GetCommand(), (*mi).second); + if (auto mi = mapRelay.find(inv); mi != mapRelay.end()) { + pfrom->PushMessage(inv.GetCommand(), mi->second); pushed = true; } } @@ -4962,14 +4955,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) uint256 hashStop; vRecv >> locator >> hashStop; - CBlockIndex* pindex = NULL; + CBlockIndex* pindex = nullptr; if (locator.IsNull()) { // If locator is null, return the hashStop block - map::iterator mi = mapBlockIndex.find(hashStop); + auto mi = mapBlockIndex.find(hashStop); if (mi == mapBlockIndex.end()) return true; - pindex = (*mi).second; + pindex = mi->second; } else { @@ -5028,7 +5021,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) } else { - map::iterator miPrev = mapBlockIndex.find(header.hashPrevBlock); + auto miPrev = mapBlockIndex.find(header.hashPrevBlock); if (miPrev == mapBlockIndex.end() && !mapHeaderSync.count(header.hashPrevBlock)) break; } @@ -5104,7 +5097,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) bool fMissingInputs = false; if (tx.AcceptToMemoryPool(txdb, true, &fMissingInputs)) { - SyncWithWallets(tx, NULL, true); + SyncWithWallets(tx, nullptr, true); RelayTransaction(tx, inv.hash); mapAlreadyAskedFor.erase(inv); vWorkQueue.push_back(inv.hash); @@ -5114,7 +5107,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) for (unsigned int i = 0; i < vWorkQueue.size(); i++) { uint256 hashPrev = vWorkQueue[i]; - for (set::iterator mi = mapOrphanTransactionsByPrev[hashPrev].begin(); + for (auto mi = mapOrphanTransactionsByPrev[hashPrev].begin(); mi != mapOrphanTransactionsByPrev[hashPrev].end(); ++mi) { @@ -5125,7 +5118,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (orphanTx.AcceptToMemoryPool(txdb, true, &fMissingInputs2)) { printf(" accepted orphan tx %s\n", orphanTxHash.ToString().substr(0,10).c_str()); - SyncWithWallets(tx, NULL, true); + SyncWithWallets(tx, nullptr, true); RelayTransaction(orphanTx, orphanTxHash); mapAlreadyAskedFor.erase(CInv(MSG_TX, orphanTxHash)); vWorkQueue.push_back(orphanTxHash); @@ -5219,9 +5212,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) { if (!pnode->fClient && pnode->nVersion != 0) { - pnode->pindexLastGetBlocksBegin = NULL; + pnode->pindexLastGetBlocksBegin = nullptr; pnode->PushGetBlocks(pindexBest, uint256(0)); - pnode->pindexLastGetHeadersBegin = NULL; + pnode->pindexLastGetHeadersBegin = nullptr; pnode->PushGetHeaders(pindexBest, uint256(0)); } } @@ -5371,7 +5364,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) vRecv >> req; // Look up the block and send requested transactions - map::iterator mi = mapBlockIndex.find(req.blockhash); + auto mi = mapBlockIndex.find(req.blockhash); if (mi != mapBlockIndex.end()) { CBlock block; @@ -5725,7 +5718,7 @@ bool ProcessMessages(CNode* pfrom) catch (std::exception& e) { PrintExceptionContinue(&e, "ProcessMessages()"); } catch (...) { - PrintExceptionContinue(NULL, "ProcessMessages()"); + PrintExceptionContinue(nullptr, "ProcessMessages()"); } if (!fRet && fDebug) @@ -5914,7 +5907,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) GetTime() - pto->nLastTipCheck > 45) { pto->nLastTipCheck = GetTime(); - pto->pindexLastGetBlocksBegin = NULL; // reset dedup to force request + pto->pindexLastGetBlocksBegin = nullptr; // reset dedup to force request pto->PushGetBlocks(pindexBest, uint256(0)); } @@ -5930,7 +5923,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) if (GetTime() - nLastEvictionCheck > 5 * 60) { nLastEvictionCheck = GetTime(); - CNode* pWorst = NULL; + CNode* pWorst = nullptr; int nWorstBlocks = INT_MAX; int nOutbound = 0; { @@ -6003,7 +5996,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) // advances from the newest known header state. if (IsInitialBlockDownload()) { - pto->pindexLastGetHeadersBegin = NULL; + pto->pindexLastGetHeadersBegin = nullptr; uint256 hashLocatorTip = hashBestHeaderSync; if (hashLocatorTip == 0 && nHighestInvWalk > nBestHeight && @@ -6027,7 +6020,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) { // Outside IBD, preserve the older walk-forward getblocks // behavior since we're no longer building out a header planner. - pto->pindexLastGetBlocksBegin = NULL; + pto->pindexLastGetBlocksBegin = nullptr; if (nHighestInvWalk > nBestHeight && hashHighestInvWalk != 0 && mapBlockIndex.count(hashHighestInvWalk)) { @@ -6040,7 +6033,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) pto->PushGetBlocks(pindexBest, uint256(0)); } - pto->pindexLastGetHeadersBegin = NULL; + pto->pindexLastGetHeadersBegin = nullptr; pto->PushGetHeaders(pindexBest, uint256(0)); } nLastBlockReceived = GetTime(); diff --git a/src/main.h b/src/main.h index 0546880..584cbae 100644 --- a/src/main.h +++ b/src/main.h @@ -15,6 +15,8 @@ #include "sigcache.h" #include +#include +#include class CWallet; class CBlock; @@ -29,29 +31,29 @@ class CRequestTracker; class CNode; class CScriptCheck; -static const int CUTOFF_POW_BLOCK = 9000; -static const int CRAPCHAIN_CUTOFF_BLOCK = 17691; // pre-Pharao (version 4) blockchain until block 17691 -static const int FORK_HEIGHT_V5 = 17651; // v5 hard fork: decentralization + Tor v3 (next block after last checkpoint) -static const int FORK_HEIGHT_V5_4 = 2186941; // v5.4: tighter timestamps, deterministic fork resolution +constexpr int CUTOFF_POW_BLOCK = 9000; +constexpr int CRAPCHAIN_CUTOFF_BLOCK = 17691; // pre-Pharao (version 4) blockchain until block 17691 +constexpr int FORK_HEIGHT_V5 = 17651; // v5 hard fork: decentralization + Tor v3 (next block after last checkpoint) +constexpr int FORK_HEIGHT_V5_4 = 2186941; // v5.4: tighter timestamps, deterministic fork resolution -static const unsigned int MAX_BLOCK_SIZE = 1000000; -static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2; -static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50; -static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100; -static const unsigned int MAX_ORPHAN_BLOCKS = 750; -static const unsigned int MAX_ORPHAN_BLOCKS_IBD = 1500; -static const unsigned int MAX_REORG_DEPTH = 100; // reject reorgs deeper than this (finality) -static const unsigned int MAX_INV_SZ = 50000; -static const int64_t MIN_TX_FEE = (1 * CENT) / 100; -static const int64_t MIN_RELAY_TX_FEE = (1 * CENT) / 100; -static const int64_t MAX_MONEY = 2222222 * COIN; -static const int64_t COIN_YEAR_REWARD = 33 * CENT; // 33% per year -static const int64_t MAX_TRI_PROOF_OF_STAKE = 0.33 * COIN; -static const int MODIFIER_INTERVAL_SWITCH = 1; +constexpr unsigned int MAX_BLOCK_SIZE = 1000000; +constexpr unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2; +constexpr unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50; +constexpr unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100; +constexpr unsigned int MAX_ORPHAN_BLOCKS = 750; +constexpr unsigned int MAX_ORPHAN_BLOCKS_IBD = 1500; +constexpr unsigned int MAX_REORG_DEPTH = 100; // reject reorgs deeper than this (finality) +constexpr unsigned int MAX_INV_SZ = 50000; +constexpr int64_t MIN_TX_FEE = (1 * CENT) / 100; +constexpr int64_t MIN_RELAY_TX_FEE = (1 * CENT) / 100; +constexpr int64_t MAX_MONEY = 2222222 * COIN; +constexpr int64_t COIN_YEAR_REWARD = 33 * CENT; // 33% per year +constexpr int64_t MAX_TRI_PROOF_OF_STAKE = 0.33 * COIN; +constexpr int MODIFIER_INTERVAL_SWITCH = 1; inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); } // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp. -static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC +constexpr unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC #ifdef USE_UPNP static const int fHaveUPnP = true; @@ -95,7 +97,7 @@ extern int64_t nTimeBestReceived; extern CCriticalSection cs_setpwalletRegistered; extern std::set setpwalletRegistered; extern unsigned char pchMessageStart[4]; -extern std::map mapOrphanBlocks; +extern std::map> mapOrphanBlocks; // Settings extern int64_t nTransactionFee; @@ -107,7 +109,7 @@ extern unsigned int nDerivationMethodIndex; extern bool fEnforceCanonical; // Minimum disk space required - used in CheckDiskSpace() -static const uint64_t nMinDiskSpace = 52428800; +constexpr uint64_t nMinDiskSpace = 52428800; class CReserveKey; class CTxDBBase; @@ -115,7 +117,7 @@ class CTxIndex; void RegisterWallet(CWallet* pwalletIn); void UnregisterWallet(CWallet* pwalletIn); -void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true); +void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = nullptr, bool fUpdate = false, bool fConnect = true); bool ProcessBlock(CNode* pfrom, CBlock* pblock); bool CheckDiskSpace(uint64_t nAdditionalBytes=0); FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb"); @@ -186,10 +188,7 @@ public: a.nTxPos == b.nTxPos); } - friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b) - { - return !(a == b); - } + friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b) = default; std::string ToString() const @@ -217,8 +216,8 @@ public: CInPoint() { SetNull(); } CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; } - void SetNull() { ptx = NULL; n = (unsigned int) -1; } - bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); } + void SetNull() { ptx = nullptr; n = (unsigned int) -1; } + bool IsNull() const { return (ptx == nullptr && n == (unsigned int) -1); } }; @@ -246,10 +245,7 @@ public: return (a.hash == b.hash && a.n == b.n); } - friend bool operator!=(const COutPoint& a, const COutPoint& b) - { - return !(a == b); - } + friend bool operator!=(const COutPoint& a, const COutPoint& b) = default; std::string ToString() const { @@ -314,10 +310,7 @@ public: a.nSequence == b.nSequence); } - friend bool operator!=(const CTxIn& a, const CTxIn& b) - { - return !(a == b); - } + friend bool operator!=(const CTxIn& a, const CTxIn& b) = default; std::string ToStringShort() const { @@ -407,10 +400,7 @@ public: a.scriptPubKey == b.scriptPubKey); } - friend bool operator!=(const CTxOut& a, const CTxOut& b) - { - return !(a == b); - } + friend bool operator!=(const CTxOut& a, const CTxOut& b) = default; std::string ToStringShort() const { @@ -434,11 +424,11 @@ public: -enum GetMinFee_mode +enum class GetMinFeeMode : int { - GMF_BLOCK, - GMF_RELAY, - GMF_SEND, + Block, + Relay, + Send, }; /** A single unspent transaction output entry in the UTXO database. @@ -647,9 +637,9 @@ public: */ int64_t GetValueIn(const MapPrevTx& mapInputs) const; - int64_t GetMinFee(unsigned int nBlockSize=1, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const; + int64_t GetMinFee(unsigned int nBlockSize=1, GetMinFeeMode mode=GetMinFeeMode::Block, unsigned int nBytes = 0) const; - bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL) + bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=nullptr) { CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION); if (!filein) @@ -685,10 +675,7 @@ public: a.nLockTime == b.nLockTime); } - friend bool operator!=(const CTransaction& a, const CTransaction& b) - { - return !(a == b); - } + friend bool operator!=(const CTransaction& a, const CTransaction& b) = default; std::string ToStringShort() const { @@ -749,10 +736,10 @@ public: */ bool ConnectInputs(CTxDBBase& txdb, const MapPrevTx& inputs, const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, - std::vector* pvChecks = NULL); + std::vector* pvChecks = nullptr); bool ClientConnectInputs(); bool CheckTransaction() const; - bool AcceptToMemoryPool(CTxDBBase& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL); + bool AcceptToMemoryPool(CTxDBBase& txdb, bool fCheckInputs=true, bool* pfMissingInputs=nullptr); bool GetCoinAge(CTxDBBase& txdb, uint64_t& nCoinAge) const; // triangles: get transaction coin age protected: @@ -805,7 +792,7 @@ public: ) - int SetMerkleBranch(const CBlock* pblock=NULL); + int SetMerkleBranch(const CBlock* pblock=nullptr); // Return depth of transaction in blockchain: // -1 : not in blockchain, and not in memory pool (conflicted transaction) @@ -869,10 +856,7 @@ public: a.vSpent == b.vSpent); } - friend bool operator!=(const CTxIndex& a, const CTxIndex& b) - { - return !(a == b); - } + friend bool operator!=(const CTxIndex& a, const CTxIndex& b) = default; int GetDepthInMainChain() const; }; @@ -957,6 +941,7 @@ public: vMerkleTree.clear(); nDoS = 0; fCachedHash = false; + fMerkleTreeCached = false; } bool IsNull() const @@ -966,6 +951,7 @@ public: mutable uint256 cachedHash; mutable bool fCachedHash; + mutable bool fMerkleTreeCached; uint256 GetHash() const { @@ -1007,7 +993,7 @@ public: std::pair GetProofOfStake() const { - return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0); + return IsProofOfStake()? std::pair{vtx[1].vin[0].prevout, vtx[1].nTime} : std::pair{COutPoint(), (unsigned int)0}; } // triangles: get max transaction timestamp @@ -1021,6 +1007,9 @@ public: uint256 BuildMerkleTree() const { + if (fMerkleTreeCached) + return (vMerkleTree.empty() ? 0 : vMerkleTree.back()); + vMerkleTree.clear(); for (const CTransaction& tx : vtx) vMerkleTree.push_back(tx.GetHash()); @@ -1035,6 +1024,7 @@ public: } j += nSize; } + fMerkleTreeCached = true; return (vMerkleTree.empty() ? 0 : vMerkleTree.back()); } @@ -1212,9 +1202,9 @@ public: CBlockIndex() { - phashBlock = NULL; - pprev = NULL; - pnext = NULL; + phashBlock = nullptr; + pprev = nullptr; + pnext = nullptr; nFile = 0; nBlockPos = 0; nHeight = 0; @@ -1235,32 +1225,16 @@ public: nNonce = 0; } - CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block) + CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block) : CBlockIndex() { - phashBlock = NULL; - pprev = NULL; - pnext = NULL; nFile = nFileIn; nBlockPos = nBlockPosIn; - nHeight = 0; - nChainTrust = 0; - nMint = 0; - nMoneySupply = 0; - nFlags = 0; - nStakeModifier = 0; - nStakeModifierChecksum = 0; - hashProofOfStake = 0; if (block.IsProofOfStake()) { SetProofOfStake(); prevoutStake = block.vtx[1].vin[0].prevout; nStakeTime = block.vtx[1].nTime; } - else - { - prevoutStake.SetNull(); - nStakeTime = 0; - } nVersion = block.nVersion; hashMerkleRoot = block.hashMerkleRoot; @@ -1313,9 +1287,9 @@ public: int64_t GetMedianTimePast() const { - int64_t pmedian[nMedianTimeSpan]; - int64_t* pbegin = &pmedian[nMedianTimeSpan]; - int64_t* pend = &pmedian[nMedianTimeSpan]; + std::array pmedian{}; + auto pbegin = pmedian.end(); + auto pend = pmedian.end(); const CBlockIndex* pindex = this; for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev) @@ -1541,10 +1515,7 @@ public: Set((*mi).second); } - CBlockLocator(const std::vector& vHaveIn) - { - vHave = vHaveIn; - } + CBlockLocator(std::vector vHaveIn) : vHave(std::move(vHaveIn)) {} IMPLEMENT_SERIALIZE ( @@ -1678,6 +1649,7 @@ public: bool exists(uint256 hash) { + LOCK(cs); return (mapTx.count(hash) != 0); } @@ -1744,7 +1716,7 @@ public: { if (i <= 1) { // Always prefill coinbase (idx 0) and coinstake (idx 1) - vPrefilledTxn.push_back(std::make_pair(i, block.vtx[i])); + vPrefilledTxn.push_back({i, block.vtx[i]}); } else { vShortTxIds.push_back(GetShortTxId(block.vtx[i].GetHash(), nShortIdNonce)); } @@ -1818,7 +1790,7 @@ private: int nHashType; public: - CScriptCheck() : ptxTo(NULL), nIn(0), nHashType(0) {} + CScriptCheck() : ptxTo(nullptr), nIn(0), nHashType(0) {} CScriptCheck(const CScript& scriptPubKeyIn, const CScript& scriptSigIn, const CTransaction& txToIn, unsigned int nInIn, int nHashTypeIn) @@ -1845,6 +1817,6 @@ public: } }; -extern CCheckQueue* pScriptCheckQueue; +extern std::unique_ptr> pScriptCheckQueue; #endif diff --git a/src/miner.cpp b/src/miner.cpp index 675c272..570a558 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -79,7 +79,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake, int64_t* pFees) // Create new block unique_ptr pblock(new CBlock()); if (!pblock.get()) - return NULL; + return nullptr; CBlockIndex* pindexPrev = pindexBest; @@ -145,13 +145,12 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake, int64_t* pFees) // This vector will be sorted into a priority queue: vector vecPriority; vecPriority.reserve(mempool.mapTx.size()); - for (map::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi) + for (auto& [hash, tx] : mempool.mapTx) { - CTransaction& tx = (*mi).second; if (tx.IsCoinBase() || tx.IsCoinStake() || !tx.IsFinal()) continue; - COrphan* porphan = NULL; + COrphan* porphan = nullptr; double dPriority = 0; int64_t nTotalIn = 0; bool fMissingInputs = false; @@ -210,7 +209,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake, int64_t* pFees) porphan->dFeePerKb = dFeePerKb; } else - vecPriority.push_back(TxPriority(dPriority, dFeePerKb, &(*mi).second)); + vecPriority.push_back(TxPriority(dPriority, dFeePerKb, &tx)); } // Collect transactions into block @@ -247,7 +246,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake, int64_t* pFees) continue; // Transaction fee - int64_t nMinFee = tx.GetMinFee(nBlockSize, GMF_BLOCK); + int64_t nMinFee = tx.GetMinFee(nBlockSize, GetMinFeeMode::Block); // Skip free transactions if we're past the minimum block size: if (fSortedByFee && (dFeePerKb < nMinTxFee) && (nBlockSize + nTxSize >= nBlockMinSize)) @@ -372,7 +371,7 @@ bool CheckStake(CBlock* pblock, CWallet& wallet) } // Process this block the same as if we had received it from another node - if (!ProcessBlock(NULL, pblock)) + if (!ProcessBlock(nullptr, pblock)) return error("CheckStake() : ProcessBlock, block not accepted"); } diff --git a/src/net.cpp b/src/net.cpp index ab7b94e..c0d9db2 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -47,7 +47,7 @@ void ThreadMapPort2(void* parg); #endif void ThreadHTTPSeedFetch(void* parg); bool ThreadHTTPSeedFetch2(void* parg); -bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false); +bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = nullptr, const char *strDest = nullptr, bool fOneShot = false); struct LocalServiceInfo { @@ -59,7 +59,7 @@ struct LocalServiceInfo { // Global state variables // bool fClient = false; -//bool fDiscover = true; + #ifdef USE_UPNP bool fUseUPnP = GetBoolArg("-upnp", USE_UPNP); @@ -71,10 +71,10 @@ static CCriticalSection cs_mapLocalHost; static map mapLocalHost; static bool vfReachable[NET_MAX] = {}; static bool vfLimited[NET_MAX] = {}; -static CNode* pnodeLocalHost = NULL; +static CNode* pnodeLocalHost = nullptr; CAddress addrSeenByPeer(CService("0.0.0.0", 0), nLocalServices); uint64_t nLocalHostNonce = 0; -boost::array vnThreadsRunning; +std::array vnThreadsRunning; static std::vector vhListenSocket; CAddrMan addrman; @@ -91,7 +91,7 @@ CCriticalSection cs_vOneShots; set setservAddNodeAddresses; CCriticalSection cs_setservAddNodeAddresses; -static CSemaphore *semOutbound = NULL; +static CSemaphore *semOutbound = nullptr; void AddOneShot(string strDest) { @@ -347,7 +347,7 @@ bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const cha closesocket(hSocket); return false; } - if (pszKeyword == NULL) + if (pszKeyword == nullptr) break; if (strLine.find(pszKeyword) != string::npos) { @@ -423,7 +423,7 @@ bool GetMyExternalIP(CNetAddr& ipRet) "Connection: close\r\n" "\r\n"; - pszKeyword = NULL; // Returns just IP address + pszKeyword = nullptr; // Returns just IP address } if (GetMyExternalIP2(addrConnect, pszGet, pszKeyword, ipRet)) @@ -469,7 +469,7 @@ CNode* FindNode(const CNetAddr& ip) if ((CNetAddr)pnode->addr == ip) return (pnode); } - return NULL; + return nullptr; } CNode* FindNode(std::string addrName) @@ -478,7 +478,7 @@ CNode* FindNode(std::string addrName) for (CNode* pnode : vNodes) if (pnode->addrName == addrName) return (pnode); - return NULL; + return nullptr; } CNode* FindNode(const CService& addr) @@ -489,7 +489,7 @@ CNode* FindNode(const CService& addr) if ((CService)pnode->addr == addr) return (pnode); } - return NULL; + return nullptr; } CNode* ConnectNode(CAddress addrConnect, const char *pszDest) @@ -499,12 +499,12 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest) if (addrStr.find(".onion") == std::string::npos) { if (fDebug) printf("ConnectNode(): REJECTED non-onion address: %s (Tor-native mode)\n", addrStr.c_str()); - return NULL; + return nullptr; } - if (pszDest == NULL) { + if (pszDest == nullptr) { if (IsLocal(addrConnect)) - return NULL; + return nullptr; // Look for an existing connection CNode* pnode = FindNode((CService)addrConnect); @@ -557,7 +557,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest) } else { - return NULL; + return nullptr; } } @@ -1042,7 +1042,7 @@ void ThreadSocketHandler2(void* parg) bool fIsSeed = false; static const char *(*strOnionSeedCheck)[1] = fTestNet ? strTestNetOnionSeed : strMainNetOnionSeed; std::string incomingAddr = addr.ToStringIP(); - for (unsigned int si = 0; strOnionSeedCheck[si][0] != NULL; si++) { + for (unsigned int si = 0; strOnionSeedCheck[si][0] != nullptr; si++) { if (incomingAddr.find(strOnionSeedCheck[si][0]) != std::string::npos) { fIsSeed = true; break; @@ -1204,7 +1204,7 @@ void ThreadMapPort(void* parg) PrintException(&e, "ThreadMapPort()"); } catch (...) { vnThreadsRunning[THREAD_UPNP]--; - PrintException(NULL, "ThreadMapPort()"); + PrintException(nullptr, "ThreadMapPort()"); } printf("ThreadMapPort exited\n"); } @@ -1325,7 +1325,7 @@ void MapPort() printf("MapPort()...\n"); if (fUseUPnP && vnThreadsRunning[THREAD_UPNP] < 1) { - if (!NewThread(ThreadMapPort, NULL)) + if (!NewThread(ThreadMapPort, nullptr)) printf("Error: ThreadMapPort(ThreadMapPort) failed\n"); } } @@ -1403,7 +1403,7 @@ void ThreadOnionSeed(void* parg) static const char *(*strOnionSeed)[1] = fTestNet ? strTestNetOnionSeed : strMainNetOnionSeed; int found = 0; - for (unsigned int seed_idx = 0; strOnionSeed[seed_idx][0] != NULL; seed_idx++) { + for (unsigned int seed_idx = 0; strOnionSeed[seed_idx][0] != nullptr; seed_idx++) { CNetAddr parsed; if (!parsed.SetSpecial(strOnionSeed[seed_idx][0])) throw runtime_error("ThreadOnionSeed() : invalid .onion seed"); @@ -1441,7 +1441,7 @@ void ThreadOnionSeed(void* parg) MilliSleep(1000); } if (!fShutdown) - ok = ThreadHTTPSeedFetch2(NULL); + ok = ThreadHTTPSeedFetch2(nullptr); } if (!ok && !fShutdown) printf("ThreadOnionSeed: all HTTPS seed fetch attempts failed\n"); @@ -1499,10 +1499,10 @@ void ThreadOnionSeed(void* parg) else printf("ThreadOnionSeed: low outbound peers (%d), re-seeding...\n", nOutbound); - ThreadHTTPSeedFetch2(NULL); + ThreadHTTPSeedFetch2(nullptr); // Re-queue hardcoded seeds for direct connection - for (unsigned int seed_idx = 0; strOnionSeed[seed_idx][0] != NULL; seed_idx++) { + for (unsigned int seed_idx = 0; strOnionSeed[seed_idx][0] != nullptr; seed_idx++) { std::string oneShotAddr = std::string(strOnionSeed[seed_idx][0]) + ":" + std::to_string(GetDefaultPort()); AddOneShot(oneShotAddr); @@ -1587,8 +1587,8 @@ bool ThreadHTTPSeedFetch2(void* parg) printf("Fetching seed list from https://%s%s (via Tor)...\n", seedHost.c_str(), seedPath.c_str()); - SSL_CTX* ctx = NULL; - SSL* ssl = NULL; + SSL_CTX* ctx = nullptr; + SSL* ssl = nullptr; SOCKET hSocket = INVALID_SOCKET; try { @@ -1611,7 +1611,7 @@ bool ThreadHTTPSeedFetch2(void* parg) // Use system default CA certificates for verification SSL_CTX_set_default_verify_paths(ctx); - SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); + SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, nullptr); ssl = SSL_new(ctx); if (!ssl) { @@ -1677,8 +1677,8 @@ bool ThreadHTTPSeedFetch2(void* parg) SSL_free(ssl); SSL_CTX_free(ctx); closesocket(hSocket); - ssl = NULL; - ctx = NULL; + ssl = nullptr; + ctx = nullptr; hSocket = INVALID_SOCKET; if (response.empty()) { @@ -1785,7 +1785,7 @@ void ThreadHTTPSeedFetch(void* parg) PrintException(&e, "ThreadHTTPSeedFetch()"); } catch (...) { vnThreadsRunning[THREAD_HTTPSEED]--; - PrintException(NULL, "ThreadHTTPSeedFetch()"); + PrintException(nullptr, "ThreadHTTPSeedFetch()"); } printf("ThreadHTTPSeedFetch exited\n"); } @@ -1806,7 +1806,7 @@ void ThreadOpenConnections(void* parg) PrintException(&e, "ThreadOpenConnections()"); } catch (...) { vnThreadsRunning[THREAD_OPENCONNECTIONS]--; - PrintException(NULL, "ThreadOpenConnections()"); + PrintException(nullptr, "ThreadOpenConnections()"); } printf("ThreadOpenConnections exited\n"); } @@ -1880,7 +1880,7 @@ void ThreadOpenConnections2(void* parg) for (string strAddr : mapMultiArgs["-connect"]) { CAddress addr; - OpenNetworkConnection(addr, NULL, strAddr.c_str()); + OpenNetworkConnection(addr, nullptr, strAddr.c_str()); for (int i = 0; i < 10 && i < nLoop; i++) { MilliSleep(500); @@ -1988,7 +1988,7 @@ void ThreadOpenAddedConnections(void* parg) PrintException(&e, "ThreadOpenAddedConnections()"); } catch (...) { vnThreadsRunning[THREAD_ADDEDCONNECTIONS]--; - PrintException(NULL, "ThreadOpenAddedConnections()"); + PrintException(nullptr, "ThreadOpenAddedConnections()"); } printf("ThreadOpenAddedConnections exited\n"); } @@ -2120,7 +2120,7 @@ void ThreadMessageHandler(void* parg) PrintException(&e, "ThreadMessageHandler()"); } catch (...) { vnThreadsRunning[THREAD_MESSAGEHANDLER]--; - PrintException(NULL, "ThreadMessageHandler()"); + PrintException(nullptr, "ThreadMessageHandler()"); } printf("ThreadMessageHandler exited\n"); } @@ -2141,7 +2141,7 @@ void ThreadMessageHandler2(void* parg) } // Poll the connected nodes for messages - CNode* pnodeTrickle = NULL; + CNode* pnodeTrickle = nullptr; if (!vNodesCopy.empty()) pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())]; for (CNode* pnode : vNodesCopy) @@ -2386,7 +2386,7 @@ void StartNode(void* parg) // Make this thread recognisable as the startup thread RenameThread("Triangles-start"); - if (semOutbound == NULL) { + if (semOutbound == nullptr) { // initialize semaphore — use -maxoutbound if specified, else default int nMaxOutbound = (int)GetArg("-maxoutbound", MAX_OUTBOUND_CONNECTIONS); nMaxOutbound = min(nMaxOutbound, (int)GetArg("-maxconnections", 125)); @@ -2395,7 +2395,7 @@ void StartNode(void* parg) semOutbound = new CSemaphore(nMaxOutbound); } - if (pnodeLocalHost == NULL) + if (pnodeLocalHost == nullptr) pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress(CService("127.0.0.1", 0), nLocalServices)); printf("StartNode(): pnodeLocalHost addr: %s\n", @@ -2411,7 +2411,7 @@ void StartNode(void* parg) if (!GetBoolArg("-onionseed", true)) printf(".onion seeding disabled\n"); else - if (!NewThread(ThreadOnionSeed, NULL)) + if (!NewThread(ThreadOnionSeed, nullptr)) printf("Error: NewThread(ThreadOnionSeed) failed\n"); // Map ports with UPnP (default) @@ -2424,34 +2424,34 @@ void StartNode(void* parg) printf("HTTP seed fetch handled by onion seed thread\n"); else if (GetBoolArg("-noseedurl", false)) printf("HTTP seed fetch disabled\n"); - else if (!NewThread(ThreadHTTPSeedFetch, NULL)) + else if (!NewThread(ThreadHTTPSeedFetch, nullptr)) printf("Error: NewThread(ThreadHTTPSeedFetch) failed\n"); // Send and receive from sockets, accept connections - if (!NewThread(ThreadSocketHandler, NULL)) + if (!NewThread(ThreadSocketHandler, nullptr)) printf("Error: NewThread(ThreadSocketHandler) failed\n"); // Initiate outbound connections from -addnode - if (!NewThread(ThreadOpenAddedConnections, NULL)) + if (!NewThread(ThreadOpenAddedConnections, nullptr)) printf("Error: NewThread(ThreadOpenAddedConnections) failed\n"); // Initiate outbound connections - if (!NewThread(ThreadOpenConnections, NULL)) + if (!NewThread(ThreadOpenConnections, nullptr)) printf("Error: NewThread(ThreadOpenConnections) failed\n"); // Process messages - if (!NewThread(ThreadMessageHandler, NULL)) + if (!NewThread(ThreadMessageHandler, nullptr)) printf("Error: NewThread(ThreadMessageHandler) failed\n"); // Dump network addresses - if (!NewThread(ThreadDumpAddress, NULL)) + if (!NewThread(ThreadDumpAddress, nullptr)) printf("Error; NewThread(ThreadDumpAddress) failed\n"); // Mine proof-of-stake blocks in the background if (!GetBoolArg("-stake", true)) printf("Staking disabled at startup (stake=0).\n"); else - if (!NewThread(ThreadStakeMiner, pwalletMain)) + if (!NewThread(ThreadStakeMiner, pwalletMain.get())) printf("Error: NewThread(ThreadStakeMiner) failed\n"); } @@ -2567,8 +2567,8 @@ void RelayTransaction(const CTransaction& tx, const uint256& hash, const CDataSt } // Save original serialized message so newer versions are preserved - mapRelay.insert(std::make_pair(inv, ss)); - vRelayExpiration.push_back(std::make_pair(GetTime() + 15 * 60, inv)); + mapRelay.insert({inv, ss}); + vRelayExpiration.push_back({GetTime() + 15 * 60, inv}); } RelayInventory(inv); diff --git a/src/net.h b/src/net.h index f045e4c..e5349db 100644 --- a/src/net.h +++ b/src/net.h @@ -6,7 +6,7 @@ #define TRIANGLES_NET_H #include -#include +#include #include #ifndef WIN32 @@ -34,7 +34,7 @@ bool GetMyExternalIP(CNetAddr& ipRet); void AddressCurrentlyConnected(const CService& addr); CNode* FindNode(const CNetAddr& ip); CNode* FindNode(const CService& ip); -CNode* ConnectNode(CAddress addrConnect, const char *strDest = NULL); +CNode* ConnectNode(CAddress addrConnect, const char *strDest = nullptr); void MapPort(); unsigned short GetListenPort(); bool BindListenPort(const CService &bindAddr, std::string& strError=REF(std::string())); @@ -63,10 +63,10 @@ bool AddLocal(const CService& addr, int nScore = LOCAL_NONE); bool AddLocal(const CNetAddr& addr, int nScore = LOCAL_NONE); bool SeenLocal(const CService& addr); bool IsLocal(const CService& addr); -bool GetLocal(CService &addr, const CNetAddr *paddrPeer = NULL); +bool GetLocal(CService &addr, const CNetAddr *paddrPeer = nullptr); bool IsReachable(const CNetAddr &addr); void SetReachable(enum Network net, bool fFlag = true); -CAddress GetLocalAddress(const CNetAddr *paddrPeer = NULL); +CAddress GetLocalAddress(const CNetAddr *paddrPeer = nullptr); enum @@ -98,7 +98,7 @@ extern bool fUseUPnP; extern uint64_t nLocalServices; extern uint64_t nLocalHostNonce; extern CAddress addrSeenByPeer; -extern boost::array vnThreadsRunning; +extern std::array vnThreadsRunning; extern CAddrMan addrman; extern std::vector vNodes; @@ -444,7 +444,7 @@ public: nRequestTime = nNow; else nRequestTime = std::max(nRequestTime + 2 * 60 * 1000000, nNow); - mapAskFor.insert(std::make_pair(nRequestTime, inv)); + mapAskFor.insert({nRequestTime, inv}); } @@ -523,141 +523,14 @@ public: } } - template - void PushMessage(const char* pszCommand, const T1& a1) + template + void PushMessage(const char* pszCommand, const T1& a1, const Args&... args) { try { BeginMessage(pszCommand); ssSend << a1; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2, const T3& a3) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2 << a3; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2, const T3& a3, const T4& a4) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2 << a3 << a4; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2 << a3 << a4 << a5; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2 << a3 << a4 << a5 << a6; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2 << a3 << a4 << a5 << a6 << a7; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; - EndMessage(); - } - catch (...) - { - AbortMessage(); - throw; - } - } - - template - void PushMessage(const char* pszCommand, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8, const T9& a9) - { - try - { - BeginMessage(pszCommand); - ssSend << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9; + (ssSend << ... << args); EndMessage(); } catch (...) diff --git a/src/netbase.cpp b/src/netbase.cpp index b4cb950..82e11db 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -42,7 +42,7 @@ void SplitHostPort(std::string in, int &portOut, std::string &hostOut) { bool fBracketed = fHaveColon && (in[0]=='[' && in[colon-1]==']'); // if there is a colon, and in[0]=='[', colon is not 0, so in[colon-1] is safe bool fMultiColon = fHaveColon && (in.find_last_of(':',colon-1) != in.npos); if (fHaveColon && (colon==0 || fBracketed || !fMultiColon)) { - char *endp = NULL; + char *endp = nullptr; int n = strtol(in.c_str() + colon + 1, &endp, 10); if (endp && *endp == 0 && n >= 0) { in = in.substr(0, colon); @@ -88,13 +88,13 @@ bool static LookupIntern(const char *pszName, std::vector& vIP, unsign # endif aiHint.ai_flags = fAllowLookup ? AI_ADDRCONFIG : AI_NUMERICHOST; #endif - struct addrinfo *aiRes = NULL; - int nErr = getaddrinfo(pszName, NULL, &aiHint, &aiRes); + struct addrinfo *aiRes = nullptr; + int nErr = getaddrinfo(pszName, nullptr, &aiHint, &aiRes); if (nErr) return false; struct addrinfo *aiTrav = aiRes; - while (aiTrav != NULL && (nMaxSolutions == 0 || vIP.size() < nMaxSolutions)) + while (aiTrav != nullptr && (nMaxSolutions == 0 || vIP.size() < nMaxSolutions)) { if (aiTrav->ai_family == AF_INET) { @@ -384,7 +384,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe fd_set fdset; FD_ZERO(&fdset); FD_SET(hSocket, &fdset); - int nRet = select(hSocket + 1, NULL, &fdset, NULL, &timeout); + int nRet = select(hSocket + 1, nullptr, &fdset, nullptr, &timeout); if (nRet == 0) { printf("connection timeout\n"); @@ -454,7 +454,7 @@ bool SetProxy(enum Network net, CService addrProxy, int nSocksVersion) { if (nSocksVersion != 0 && !addrProxy.IsValid()) return false; LOCK(cs_proxyInfos); - proxyInfo[net] = std::make_pair(addrProxy, nSocksVersion); + proxyInfo[net] = {addrProxy, nSocksVersion}; return true; } @@ -473,7 +473,7 @@ bool SetNameProxy(CService addrProxy, int nSocksVersion) { if (nSocksVersion != 0 && !addrProxy.IsValid()) return false; LOCK(cs_proxyInfos); - nameproxyInfo = std::make_pair(addrProxy, nSocksVersion); + nameproxyInfo = {addrProxy, nSocksVersion}; return true; } @@ -868,7 +868,7 @@ std::string CNetAddr::ToStringIP() const unsigned char sha3hash[32]; unsigned int sha3len = 0; EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); - EVP_DigestInit_ex(mdctx, EVP_sha3_256(), NULL); + EVP_DigestInit_ex(mdctx, EVP_sha3_256(), nullptr); EVP_DigestUpdate(mdctx, checksumInput, 48); EVP_DigestFinal_ex(mdctx, sha3hash, &sha3len); EVP_MD_CTX_free(mdctx); @@ -890,7 +890,7 @@ std::string CNetAddr::ToStringIP() const socklen_t socklen = sizeof(sockaddr); if (serv.GetSockAddr((struct sockaddr*)&sockaddr, &socklen)) { char name[1025] = ""; - if (!getnameinfo((const struct sockaddr*)&sockaddr, socklen, name, sizeof(name), NULL, 0, NI_NUMERICHOST)) + if (!getnameinfo((const struct sockaddr*)&sockaddr, socklen, name, sizeof(name), nullptr, 0, NI_NUMERICHOST)) return std::string(name); } if (IsIPv4()) @@ -1043,7 +1043,7 @@ static const int NET_UNKNOWN = NET_MAX + 0; static const int NET_TEREDO = NET_MAX + 1; int static GetExtNetwork(const CNetAddr *addr) { - if (addr == NULL) + if (addr == nullptr) return NET_UNKNOWN; if (addr->IsRFC4380()) return NET_TEREDO; diff --git a/src/onionseed.h b/src/onionseed.h index 2a93d7f..a8cea83 100644 --- a/src/onionseed.h +++ b/src/onionseed.h @@ -18,11 +18,11 @@ static const char *strMainNetOnionSeed[][1] = { {"on4noksywc7b6cdbbxsp535l7j4cugunvlyz3iyhf6sfcg2qzaoy3eqd.onion"}, // Contabo seed 4 {"3uyzltm5cy7xzunncp3d7ariw75erabdnj4l3cxwvsxb6h4orc7eiqad.onion"}, - {NULL} + {nullptr} }; static const char *strTestNetOnionSeed[][1] = { - {NULL} + {nullptr} }; #endif diff --git a/src/qt/trianglesgui.cpp b/src/qt/trianglesgui.cpp index 183ead9..d29fc6f 100644 --- a/src/qt/trianglesgui.cpp +++ b/src/qt/trianglesgui.cpp @@ -89,7 +89,8 @@ #include -extern CWallet* pwalletMain; +#include +extern std::unique_ptr pwalletMain; extern int64_t nLastCoinStakeSearchInterval; extern unsigned int nTargetSpacing; double GetPoSKernelPS(); diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 02b00c9..9e588de 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -93,7 +93,7 @@ public: }; // Send coins to a list of recipients - SendCoinsReturn sendCoins(const QList &recipients, const CCoinControl *coinControl=NULL); + SendCoinsReturn sendCoins(const QList &recipients, const CCoinControl *coinControl=nullptr); // Wallet encryption bool setWalletEncrypted(bool encrypted, const SecureString &passphrase); diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 0bd2f2f..950299e 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -34,15 +34,15 @@ double GetDifficulty(const CBlockIndex* blockindex) { // Floating point number that is a multiple of the minimum difficulty, // minimum difficulty = 1.0. - if (blockindex == NULL) + if (blockindex == nullptr) { - if (pindexBest == NULL) + if (pindexBest == nullptr) return 1.0; else blockindex = GetLastBlockIndex(pindexBest, false); } - if (blockindex == NULL) + if (blockindex == nullptr) return 1.0; int nShift = (blockindex->nBits >> 24) & 0xff; @@ -98,7 +98,7 @@ double GetPoSKernelPS() int nStakesHandled = 0, nStakesTime = 0; CBlockIndex* pindex = pindexBest;; - CBlockIndex* pindexPrevStake = NULL; + CBlockIndex* pindexPrevStake = nullptr; while (pindex && nStakesHandled < nPoSInterval) { @@ -1042,7 +1042,7 @@ Value invalidateblock(const Array& params, bool fHelp) setStakeSeen.erase(make_pair(pindexWalk->prevoutStake, pindexWalk->nStakeTime)); } - pindexWalk->pprev->pnext = NULL; + pindexWalk->pprev->pnext = nullptr; pindexWalk = pindexWalk->pprev; } diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp index 33e0538..d686d17 100644 --- a/src/rpcdump.cpp +++ b/src/rpcdump.cpp @@ -94,9 +94,9 @@ public: bool fSpent; CWalletTx* ptx; int nOut; - CTxDump(CWalletTx* ptx = NULL, int nOut = -1) + CTxDump(CWalletTx* ptx = nullptr, int nOut = -1) { - pindex = NULL; + pindex = nullptr; nValue = 0; fSpent = false; this->ptx = ptx; @@ -281,7 +281,7 @@ Value dumpwallet(const Array& params, bool fHelp) // sort time/key pairs std::vector > vKeyBirth; for (std::map::const_iterator it = mapKeyBirth.begin(); it != mapKeyBirth.end(); it++) { - vKeyBirth.push_back(std::make_pair(it->second, it->first)); + vKeyBirth.push_back({it->second, it->first}); } mapKeyBirth.clear(); std::sort(vKeyBirth.begin(), vKeyBirth.end()); diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 0d9523e..b827c0a 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -552,7 +552,7 @@ Value sendrawtransaction(const Array& params, bool fHelp) if (!tx.AcceptToMemoryPool(txdb)) throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX rejected"); - SyncWithWallets(tx, NULL, true); + SyncWithWallets(tx, nullptr, true); } RelayTransaction(tx, hashTx); diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index c9361c3..bfda2be 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -1284,7 +1284,7 @@ Value listsinceblock(const Array& params, bool fHelp) "listsinceblock [blockhash] [target-confirmations]\n" "Get all transactions in blocks since block [blockhash], or all transactions if omitted"); - CBlockIndex *pindex = NULL; + CBlockIndex *pindex = nullptr; int target_confirms = 1; if (params.size() > 0) @@ -1535,7 +1535,7 @@ Value walletpassphrase(const Array& params, bool fHelp) "walletpassphrase \n" "Stores the wallet decryption key in memory for seconds."); - NewThread(ThreadTopUpKeyPool, NULL); + NewThread(ThreadTopUpKeyPool, nullptr); int64_t* pnSleepTime = new int64_t(params[1].get_int64()); NewThread(ThreadCleanWalletPassphrase, pnSleepTime); diff --git a/src/script.cpp b/src/script.cpp index 969fbc8..9123031 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -16,7 +16,7 @@ using namespace std; #include "sync.h" #include "util.h" -bool CheckSig(vector vchSig, vector vchPubKey, CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); +bool CheckSig(const vector& vchSig, const vector& vchPubKey, const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); static const valtype vchFalse(0); static const valtype vchZero(0); @@ -103,7 +103,7 @@ const char* GetTxnOutputType(txnouttype t) case TX_SCRIPTHASH: return "scripthash"; case TX_MULTISIG: return "multisig"; } - return NULL; + return nullptr; } @@ -893,7 +893,7 @@ bool EvalScript(vector >& stack, const CScript& script, co break; case OP_DIV: - if (!BN_div(bn.get(), NULL, bn1.get(), bn2.get(), pctx)) + if (!BN_div(bn.get(), nullptr, bn1.get(), bn2.get(), pctx)) return false; break; @@ -1271,7 +1271,7 @@ public: } }; -bool CheckSig(vector vchSig, vector vchPubKey, CScript scriptCode, +bool CheckSig(const vector& vchSig, const vector& vchPubKey, const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType) { static CSignatureCache signatureCache; diff --git a/src/script.h b/src/script.h index 7a63e25..dd46a21 100644 --- a/src/script.h +++ b/src/script.h @@ -267,7 +267,7 @@ protected: public: CScript() { } - CScript(const CScript& b) : std::vector(b.begin(), b.end()) { } + CScript(const CScript& b) = default; CScript(const_iterator pbegin, const_iterator pend) : std::vector(pbegin, pend) { } #ifndef _MSC_VER CScript(const unsigned char* pbegin, const unsigned char* pend) : std::vector(pbegin, pend) { } diff --git a/src/serialize.h b/src/serialize.h index 07d0fa9..c9fc9d6 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include "allocators.h" @@ -288,14 +288,14 @@ template void Serialize(Stream& os, const std::basi template void Unserialize(Stream& is, std::basic_string& str, int, int=0); // vector -template unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const boost::true_type&); -template unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const boost::false_type&); +template unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const std::true_type&); +template unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const std::false_type&); template inline unsigned int GetSerializeSize(const std::vector& v, int nType, int nVersion); -template void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const boost::true_type&); -template void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const boost::false_type&); +template void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const std::true_type&); +template void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const std::false_type&); template inline void Serialize(Stream& os, const std::vector& v, int nType, int nVersion); -template void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const boost::true_type&); -template void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const boost::false_type&); +template void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const std::true_type&); +template void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const std::false_type&); template inline void Unserialize(Stream& is, std::vector& v, int nType, int nVersion); // others derived from vector @@ -392,13 +392,13 @@ void Unserialize(Stream& is, std::basic_string& str, int, int) // vector // template -unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const boost::true_type&) +unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const std::true_type&) { return (GetSizeOfCompactSize(v.size()) + v.size() * sizeof(T)); } template -unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const boost::false_type&) +unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const std::false_type&) { unsigned int nSize = GetSizeOfCompactSize(v.size()); for (typename std::vector::const_iterator vi = v.begin(); vi != v.end(); ++vi) @@ -409,12 +409,12 @@ unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nV template inline unsigned int GetSerializeSize(const std::vector& v, int nType, int nVersion) { - return GetSerializeSize_impl(v, nType, nVersion, boost::is_fundamental()); + return GetSerializeSize_impl(v, nType, nVersion, std::is_fundamental_v); } template -void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const boost::true_type&) +void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const std::true_type&) { WriteCompactSize(os, v.size()); if (!v.empty()) @@ -422,7 +422,7 @@ void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVers } template -void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const boost::false_type&) +void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const std::false_type&) { WriteCompactSize(os, v.size()); for (typename std::vector::const_iterator vi = v.begin(); vi != v.end(); ++vi) @@ -432,12 +432,12 @@ void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVers template inline void Serialize(Stream& os, const std::vector& v, int nType, int nVersion) { - Serialize_impl(os, v, nType, nVersion, boost::is_fundamental()); + Serialize_impl(os, v, nType, nVersion, std::is_fundamental_v); } template -void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const boost::true_type&) +void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const std::true_type&) { // Limit size per read so bogus size value won't cause out of memory v.clear(); @@ -453,7 +453,7 @@ void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, } template -void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const boost::false_type&) +void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const std::false_type&) { v.clear(); unsigned int nSize = ReadCompactSize(is); @@ -473,7 +473,7 @@ void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, template inline void Unserialize(Stream& is, std::vector& v, int nType, int nVersion) { - Unserialize_impl(is, v, nType, nVersion, boost::is_fundamental()); + Unserialize_impl(is, v, nType, nVersion, std::is_fundamental_v); } @@ -1060,18 +1060,18 @@ public: void fclose() { - if (file != NULL && file != stdin && file != stdout && file != stderr) + if (file != nullptr && file != stdin && file != stdout && file != stderr) ::fclose(file); - file = NULL; + file = nullptr; } - FILE* release() { FILE* ret = file; file = NULL; return ret; } + FILE* release() { FILE* ret = file; file = nullptr; return ret; } operator FILE*() { return file; } FILE* operator->() { return file; } FILE& operator*() { return *file; } FILE** operator&() { return &file; } FILE* operator=(FILE* pnew) { return file = pnew; } - bool operator!() { return (file == NULL); } + bool operator!() { return (file == nullptr); } // diff --git a/src/smessage.cpp b/src/smessage.cpp index c443a65..bd27cf0 100644 --- a/src/smessage.cpp +++ b/src/smessage.cpp @@ -99,7 +99,7 @@ uint32_t nPeerIdCounter = 1; CCriticalSection cs_smsg; CCriticalSection cs_smsgDB; -rocksdb::DB *smsgDB = NULL; +rocksdb::DB *smsgDB = nullptr; namespace fs = std::filesystem; @@ -366,7 +366,7 @@ void SecureMsgGetBucketFiles(const fs::path& pathSmsgDir, int64_t bucket, bool f || fFileWalletLocked != fWalletLocked) continue; - bucketFiles.push_back(std::make_pair(fileIndex, (*itd).path())); + bucketFiles.push_back({fileIndex, (*itd).path()}); }; std::sort(bucketFiles.begin(), bucketFiles.end(), @@ -471,7 +471,7 @@ bool SecMsgCrypter::Encrypt(unsigned char* chPlaintext, uint32_t nPlain, std::ve bool fOk = true; - if (fOk) fOk = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, &chKey[0], &chIV[0]); + if (fOk) fOk = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, &chKey[0], &chIV[0]); if (fOk) fOk = EVP_EncryptUpdate(ctx, &vchCiphertext[0], &nCLen, chPlaintext, nLen); if (fOk) fOk = EVP_EncryptFinal_ex(ctx, (&vchCiphertext[0])+nCLen, &nFLen); EVP_CIPHER_CTX_free(ctx); @@ -500,7 +500,7 @@ bool SecMsgCrypter::Decrypt(unsigned char* chCiphertext, uint32_t nCipher, std:: bool fOk = true; - if (fOk) fOk = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, &chKey[0], &chIV[0]); + if (fOk) fOk = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, &chKey[0], &chIV[0]); if (fOk) fOk = EVP_DecryptUpdate(ctx, &vchPlaintext[0], &nPLen, &chCiphertext[0], nCipher); if (fOk) fOk = EVP_DecryptFinal_ex(ctx, (&vchPlaintext[0])+nPLen, &nFLen); EVP_CIPHER_CTX_free(ctx); @@ -626,7 +626,7 @@ bool SecMsgDB::TxnCommit() writeOptions.sync = true; rocksdb::Status status = pdb->Write(writeOptions, activeBatch); delete activeBatch; - activeBatch = NULL; + activeBatch = nullptr; pendingBatch.clear(); if (!status.ok()) @@ -641,7 +641,7 @@ bool SecMsgDB::TxnCommit() bool SecMsgDB::TxnAbort() { delete activeBatch; - activeBatch = NULL; + activeBatch = nullptr; pendingBatch.clear(); return true; }; @@ -1344,7 +1344,7 @@ int SecureMsgReadIni() continue; if (!(pName = strtok(cLine, "=")) - || !(pValue = strtok(NULL, "="))) + || !(pValue = strtok(nullptr, "="))) continue; if (strcmp(pName, "newAddressRecv") == 0) @@ -1478,8 +1478,8 @@ bool SecureMsgStart(bool fDontStart, bool fScanChain) }; // -- start threads - if (!NewThread(ThreadSecureMsg, NULL) - || !NewThread(ThreadSecureMsgPow, NULL)) + if (!NewThread(ThreadSecureMsg, nullptr) + || !NewThread(ThreadSecureMsgPow, nullptr)) { printf("SecureMsg could not start threads, secure messaging disabled.\n"); fSecMsgEnabled = false; @@ -1509,7 +1509,7 @@ bool SecureMsgShutdown() { LOCK(cs_smsgDB); delete smsgDB; - smsgDB = NULL; + smsgDB = nullptr; }; // -- main program will wait 5 seconds for threads to terminate. @@ -1553,8 +1553,8 @@ bool SecureMsgEnable() }; // LOCK(cs_smsg); // -- start threads - if (!NewThread(ThreadSecureMsg, NULL) - || !NewThread(ThreadSecureMsgPow, NULL)) + if (!NewThread(ThreadSecureMsg, nullptr) + || !NewThread(ThreadSecureMsgPow, nullptr)) { printf("SecureMsgEnable could not start threads, secure messaging disabled.\n"); fSecMsgEnabled = false; @@ -1624,7 +1624,7 @@ bool SecureMsgDisable() { LOCK(cs_smsgDB); delete smsgDB; - smsgDB = NULL; + smsgDB = nullptr; }; @@ -2455,7 +2455,7 @@ bool SecureMsgScanBlockChain() if (lockMain) { CBlockIndex *pindexScan = pindexGenesisBlock; - if (pindexScan == NULL) + if (pindexScan == nullptr) { printf("Error: pindexGenesisBlock not set.\n"); return false; @@ -3521,7 +3521,7 @@ int SecureMsgValidate(unsigned char *pHeader, unsigned char *pPayload, uint32_t HMAC_CTX *ctx = HMAC_CTX_new(); unsigned int nBytes; - if (!HMAC_Init_ex(ctx, &civ[0], 32, EVP_sha256(), NULL) + if (!HMAC_Init_ex(ctx, &civ[0], 32, EVP_sha256(), nullptr) || !HMAC_Update(ctx, (unsigned char*) pHeader+4, SMSG_HDR_LEN-4) || !HMAC_Update(ctx, (unsigned char*) pPayload, nPayload) || !HMAC_Update(ctx, pPayload, nPayload) @@ -3598,7 +3598,7 @@ int SecureMsgSetHash(unsigned char *pHeader, unsigned char *pPayload, uint32_t n memcpy(civ+i, &nonse, 4); unsigned int nBytes; - if (!HMAC_Init_ex(ctx, &civ[0], 32, EVP_sha256(), NULL) + if (!HMAC_Init_ex(ctx, &civ[0], 32, EVP_sha256(), nullptr) || !HMAC_Update(ctx, (unsigned char*) pHeader+4, SMSG_HDR_LEN-4) || !HMAC_Update(ctx, (unsigned char*) pPayload, nPayload) || !HMAC_Update(ctx, pPayload, nPayload) @@ -3923,7 +3923,7 @@ int SecureMsgEncrypt(SecureMessage& smsg, std::string& addressFrom, std::string& unsigned int nBytes = 32; HMAC_CTX *ctx = HMAC_CTX_new(); - if (!HMAC_Init_ex(ctx, &key_m[0], 32, EVP_sha256(), NULL) + if (!HMAC_Init_ex(ctx, &key_m[0], 32, EVP_sha256(), nullptr) || !HMAC_Update(ctx, (unsigned char*) &smsg.timestamp, sizeof(smsg.timestamp)) || !HMAC_Update(ctx, &vchCiphertext[0], vchCiphertext.size()) || !HMAC_Final(ctx, smsg.mac, &nBytes) @@ -4233,7 +4233,7 @@ int SecureMsgDecrypt(bool fTestOnly, std::string& address, unsigned char *pHeade unsigned int nBytes = 32; HMAC_CTX *ctx = HMAC_CTX_new(); - if (!HMAC_Init_ex(ctx, &key_m[0], 32, EVP_sha256(), NULL) + if (!HMAC_Init_ex(ctx, &key_m[0], 32, EVP_sha256(), nullptr) || !HMAC_Update(ctx, (unsigned char*) &psmsg->timestamp, sizeof(psmsg->timestamp)) || !HMAC_Update(ctx, pPayload, nPayload) || !HMAC_Final(ctx, MAC, &nBytes) diff --git a/src/smessage.h b/src/smessage.h index 41b98a6..3ceb671 100644 --- a/src/smessage.h +++ b/src/smessage.h @@ -74,14 +74,14 @@ public: SecureMessage() { nPayload = 0; - pPayload = NULL; + pPayload = nullptr; }; ~SecureMessage() { if (pPayload) delete[] pPayload; - pPayload = NULL; + pPayload = nullptr; }; unsigned char hash[4]; @@ -294,7 +294,7 @@ class SecMsgDB public: SecMsgDB() { - activeBatch = NULL; + activeBatch = nullptr; }; ~SecMsgDB() diff --git a/src/sync.cpp b/src/sync.cpp index a68ccee..41c7c70 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -80,18 +80,18 @@ static void push_lock(void* c, const CLockLocation& locklocation, bool fTry) if (fDebug) printf("Locking: %s\n", locklocation.ToString().c_str()); dd_mutex.lock(); - (*lockstack).push_back(std::make_pair(c, locklocation)); + (*lockstack).push_back({c, locklocation}); if (!fTry) { for (const auto& i : (*lockstack)) { if (i.first == c) break; - std::pair p1 = std::make_pair(i.first, c); + std::pair p1 = {i.first, c}; if (lockorders.count(p1)) continue; lockorders[p1] = (*lockstack); - std::pair p2 = std::make_pair(c, i.first); + std::pair p2 = {c, i.first}; if (lockorders.count(p2)) { potential_deadlock_detected(p1, lockorders[p2], lockorders[p1]); diff --git a/src/sync.h b/src/sync.h index 59e23e2..0232d80 100644 --- a/src/sync.h +++ b/src/sync.h @@ -26,7 +26,7 @@ void static inline LeaveCritical() {} void PrintLockContention(const char* pszName, const char* pszFile, int nLine); #endif -/** Wrapper around boost::unique_lock */ +/** Wrapper around std::unique_lock */ template class CMutexLock { @@ -182,11 +182,11 @@ public: grant.Release(); grant.sem = sem; grant.fHaveGrant = fHaveGrant; - sem = NULL; + sem = nullptr; fHaveGrant = false; } - CSemaphoreGrant() : sem(NULL), fHaveGrant(false) {} + CSemaphoreGrant() : sem(nullptr), fHaveGrant(false) {} CSemaphoreGrant(CSemaphore &sema, bool fTry = false) : sem(&sema), fHaveGrant(false) { if (fTry) diff --git a/src/tor/onion_v3.cpp b/src/tor/onion_v3.cpp index 6b75855..6b2c0b6 100644 --- a/src/tor/onion_v3.cpp +++ b/src/tor/onion_v3.cpp @@ -54,7 +54,8 @@ #endif // Ensure we have the global wallet pointer -extern CWallet* pwalletMain; +#include +extern std::unique_ptr pwalletMain; // Static instance CTorV3Manager* CTorV3Manager::instance = nullptr; @@ -997,7 +998,7 @@ bool CTorV3Service::ValidateOnionAddress(const std::string& address) bool CTorV3Service::ExtractKeysFromHex(const std::string& privKeyHex, unsigned char* privKey, unsigned char* pubKey) { if (!privKey || !pubKey) { - printf("ERROR: NULL pointers passed to ExtractKeysFromHex\n"); + printf("ERROR: nullptr pointers passed to ExtractKeysFromHex\n"); return false; } @@ -1063,7 +1064,7 @@ bool CTorV3Service::ExtractKeysFromHex(const std::string& privKeyHex, unsigned c bool CTorV3Service::DerivePublicKeyFromPrivate(const unsigned char* privateKey, unsigned char* publicKey) { if (!privateKey || !publicKey) { - printf("ERROR: NULL pointer passed to DerivePublicKeyFromPrivate\n"); + printf("ERROR: nullptr pointer passed to DerivePublicKeyFromPrivate\n"); return false; } diff --git a/src/tor/tor_process.cpp b/src/tor/tor_process.cpp index 79960a4..6f556fa 100644 --- a/src/tor/tor_process.cpp +++ b/src/tor/tor_process.cpp @@ -75,8 +75,8 @@ CTorProcess::CTorProcess() , hiddenServiceEnabled(true) , running(false) #ifdef WIN32 - , hProcess(NULL) - , hJob(NULL) + , hProcess(nullptr) + , hJob(nullptr) , processId(0) #else , processId(0) @@ -97,7 +97,7 @@ std::string CTorProcess::FindTorBinary() #ifdef WIN32 // Same directory as the wallet executable char exePath[MAX_PATH]; - if (GetModuleFileNameA(NULL, exePath, MAX_PATH)) { + if (GetModuleFileNameA(nullptr, exePath, MAX_PATH)) { fs::path exeDir = fs::path(exePath).parent_path(); candidates.push_back((exeDir / "tor.exe").string()); candidates.push_back((exeDir / "tor" / "tor.exe").string()); @@ -381,12 +381,12 @@ bool CTorProcess::Start(const std::string& dataDir, int socks, int hsPort, bool std::string cmdLine = "\"" + torBinaryPath + "\" -f \"" + torrcPath + "\""; if (!CreateProcessA( - NULL, + nullptr, (LPSTR)cmdLine.c_str(), - NULL, NULL, + nullptr, nullptr, FALSE, CREATE_NO_WINDOW, - NULL, NULL, + nullptr, nullptr, &si, &pi)) { DWORD err = ::GetLastError(); @@ -403,7 +403,7 @@ bool CTorProcess::Start(const std::string& dataDir, int socks, int hsPort, bool // killed via Task Manager. JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE means // all processes in the job die when the last handle to the job closes // (i.e. when our process exits for any reason). - hJob = CreateJobObject(NULL, NULL); + hJob = CreateJobObject(nullptr, nullptr); if (hJob) { JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = {}; jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; @@ -428,7 +428,7 @@ bool CTorProcess::Start(const std::string& dataDir, int socks, int hsPort, bool freopen("/dev/null", "w", stdout); freopen("/dev/null", "w", stderr); execl(torBinaryPath.c_str(), torBinaryPath.c_str(), - "-f", torrcPath.c_str(), (char*)NULL); + "-f", torrcPath.c_str(), (char*)nullptr); // If exec fails, exit child _exit(1); } @@ -490,16 +490,16 @@ void CTorProcess::Stop() if (!running) return; #ifdef WIN32 - if (hProcess != NULL) { + if (hProcess != nullptr) { printf("Stopping Tor process (PID %lu)...\n", processId); TerminateProcess(hProcess, 0); WaitForSingleObject(hProcess, 5000); CloseHandle(hProcess); - hProcess = NULL; + hProcess = nullptr; } - if (hJob != NULL) { + if (hJob != nullptr) { CloseHandle(hJob); - hJob = NULL; + hJob = nullptr; } #else if (processId > 0) { @@ -514,7 +514,7 @@ void CTorProcess::Stop() } // Force kill if still running kill(processId, SIGKILL); - waitpid(processId, NULL, 0); + waitpid(processId, nullptr, 0); } #endif @@ -528,7 +528,7 @@ bool CTorProcess::IsRunning() if (!running) return false; #ifdef WIN32 - if (hProcess == NULL) return false; + if (hProcess == nullptr) return false; DWORD exitCode; if (GetExitCodeProcess(hProcess, &exitCode)) { return (exitCode == STILL_ACTIVE); diff --git a/src/trianglesrpc.cpp b/src/trianglesrpc.cpp index c69e74f..b440ac1 100644 --- a/src/trianglesrpc.cpp +++ b/src/trianglesrpc.cpp @@ -44,7 +44,7 @@ static std::string strRPCUserColonPass; const Object emptyobj; -CNotificationQueue* pNotificationQueue = NULL; +CNotificationQueue* pNotificationQueue = nullptr; void ThreadRPCServer3(void* parg); @@ -367,7 +367,7 @@ const CRPCCommand *CRPCTable::operator[](string name) const { map::const_iterator it = mapCommands.find(name); if (it == mapCommands.end()) - return NULL; + return nullptr; return (*it).second; } @@ -401,7 +401,7 @@ string rfc1123Time() time_t now; time(&now); struct tm* now_gmt = gmtime(&now); - string locale(setlocale(LC_TIME, NULL)); + string locale(setlocale(LC_TIME, nullptr)); setlocale(LC_TIME, "C"); // we want POSIX (aka "C") weekday/month strings strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt); setlocale(LC_TIME, locale.c_str()); @@ -466,7 +466,7 @@ int ReadHTTPStatus(std::basic_istream& stream, int &proto, return HTTP_INTERNAL_SERVER_ERROR; proto = 0; const char *ver = strstr(str.c_str(), "HTTP/1."); - if (ver != NULL) + if (ver != nullptr) proto = atoi(ver+7); // Detect request line (GET/POST/...) vs response line (HTTP/1.x ...) @@ -741,7 +741,7 @@ void ThreadRPCServer(void* parg) PrintException(&e, "ThreadRPCServer()"); } catch (...) { vnThreadsRunning[THREAD_RPCLISTENER]--; - PrintException(NULL, "ThreadRPCServer()"); + PrintException(nullptr, "ThreadRPCServer()"); } printf("ThreadRPCServer exited\n"); } @@ -1483,7 +1483,7 @@ int CommandLineRPC(int argc, char *argv[]) } catch (...) { - PrintException(NULL, "CommandLineRPC()"); + PrintException(nullptr, "CommandLineRPC()"); } if (strPrint != "") @@ -1502,18 +1502,18 @@ int main(int argc, char *argv[]) #ifdef _MSC_VER // Turn off Microsoft heap dump noise _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); - _CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0)); + _CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, 0)); #endif - setbuf(stdin, NULL); - setbuf(stdout, NULL); - setbuf(stderr, NULL); + setbuf(stdin, nullptr); + setbuf(stdout, nullptr); + setbuf(stderr, nullptr); try { if (argc >= 2 && string(argv[1]) == "-server") { printf("server ready\n"); - ThreadRPCServer(NULL); + ThreadRPCServer(nullptr); } else { @@ -1523,7 +1523,7 @@ int main(int argc, char *argv[]) catch (std::exception& e) { PrintException(&e, "main()"); } catch (...) { - PrintException(NULL, "main()"); + PrintException(nullptr, "main()"); } return 0; } diff --git a/src/trianglesrpc.h b/src/trianglesrpc.h index 2f1b025..cb45c3f 100644 --- a/src/trianglesrpc.h +++ b/src/trianglesrpc.h @@ -126,7 +126,7 @@ extern const CRPCTable tableRPC; extern int64_t nWalletUnlockTime; extern int64_t AmountFromValue(const json_spirit::Value& value); extern json_spirit::Value ValueFromAmount(int64_t amount); -extern double GetDifficulty(const CBlockIndex* blockindex = NULL); +extern double GetDifficulty(const CBlockIndex* blockindex = nullptr); extern double GetPoWMHashPS(); extern double GetPoSKernelPS(); diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp index e3a3ef0..22459ff 100644 --- a/src/txdb-leveldb.cpp +++ b/src/txdb-leveldb.cpp @@ -70,7 +70,7 @@ void init_blockindex(leveldb::Options& options, bool fRemoveOld = false) { CTxDB::CTxDB(const char* pszMode) { assert(pszMode); - activeBatch = NULL; + activeBatch = nullptr; fReadOnly = (!strchr(pszMode, '+') && !strchr(pszMode, 'w')); if (txdb) { @@ -97,9 +97,9 @@ CTxDB::CTxDB(const char* pszMode) printf("Required index version is %d, removing old database\n", DATABASE_VERSION); delete txdb; - txdb = pdb = NULL; + txdb = pdb = nullptr; delete activeBatch; - activeBatch = NULL; + activeBatch = nullptr; init_blockindex(options, true); pdb = txdb; @@ -124,13 +124,13 @@ CTxDB::CTxDB(const char* pszMode) void CTxDB::Close() { delete txdb; - txdb = pdb = NULL; + txdb = pdb = nullptr; delete options.filter_policy; - options.filter_policy = NULL; + options.filter_policy = nullptr; delete options.block_cache; - options.block_cache = NULL; + options.block_cache = nullptr; delete activeBatch; - activeBatch = NULL; + activeBatch = nullptr; } bool CTxDB::TxnBegin() @@ -149,7 +149,7 @@ bool CTxDB::TxnCommit() assert(activeBatch); leveldb::Status status = pdb->Write(leveldb::WriteOptions(), activeBatch); delete activeBatch; - activeBatch = NULL; + activeBatch = nullptr; if (!status.ok()) { printf("ERROR: LevelDB batch commit failure: %s\n", status.ToString().c_str()); printf("ERROR: This may indicate disk full, corruption, or permissions issue.\n"); @@ -291,7 +291,7 @@ std::unique_ptr CTxDB::NewIterator() const static CBlockIndex *InsertBlockIndex(uint256 hash) { if (hash == 0) - return NULL; + return nullptr; map::iterator mi = mapBlockIndex.find(hash); if (mi != mapBlockIndex.end()) @@ -372,7 +372,7 @@ bool CTxDB::LoadBlockIndex() pindexNew->nNonce = diskindex.nNonce; pindexNew->nChainTrust = diskindex.nChainTrust; - if (pindexGenesisBlock == NULL && blockHash == (!fTestNet ? hashGenesisBlockOfficial : hashGenesisBlockTestNet)) + if (pindexGenesisBlock == nullptr && blockHash == (!fTestNet ? hashGenesisBlockOfficial : hashGenesisBlockTestNet)) pindexGenesisBlock = pindexNew; if (!pindexNew->CheckIndex()) { @@ -504,7 +504,7 @@ bool CTxDB::LoadBlockIndex() nPhaseStart = GetTimeMillis(); if (!ReadHashBestChain(hashBestChain)) { - if (pindexGenesisBlock == NULL) + if (pindexGenesisBlock == nullptr) return true; return error("CTxDB::LoadBlockIndex() : hashBestChain not loaded"); } @@ -539,7 +539,7 @@ bool CTxDB::LoadBlockIndex() // Re-evaluate best chain: scan for competing tips with equal or greater trust. { - CBlockIndex* pindexBetter = NULL; + CBlockIndex* pindexBetter = nullptr; for (const auto& item : mapBlockIndex) { CBlockIndex* pindex = item.second; @@ -602,7 +602,7 @@ bool CTxDB::LoadBlockIndex() if (nCheckDepth > nBestHeight) nCheckDepth = nBestHeight; printf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel); - CBlockIndex* pindexFork = NULL; + CBlockIndex* pindexFork = nullptr; map, CBlockIndex*> mapBlockPos; for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev) { diff --git a/src/util.cpp b/src/util.cpp index bd2a452..3910931 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -127,7 +127,7 @@ public: { #if OPENSSL_VERSION_NUMBER < 0x10100000L // Shutdown OpenSSL library multithreading support (pre-1.1.0 only) - CRYPTO_set_locking_callback(NULL); + CRYPTO_set_locking_callback(nullptr); for (int i = 0; i < CRYPTO_num_locks(); i++) delete ppmutexOpenSSL[i]; OPENSSL_free(ppmutexOpenSSL); @@ -148,7 +148,7 @@ void RandAddSeed() // Seed with CPU performance counter int64_t nCounter = GetPerformanceCounter(); RAND_add(&nCounter, sizeof(nCounter), 1.5); - memset(&nCounter, 0, sizeof(nCounter)); + OPENSSL_cleanse(&nCounter, sizeof(nCounter)); } void RandAddSeedPerfmon() @@ -167,12 +167,12 @@ void RandAddSeedPerfmon() unsigned char pdata[250000]; memset(pdata, 0, sizeof(pdata)); unsigned long nSize = sizeof(pdata); - long ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, pdata, &nSize); + long ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", nullptr, nullptr, pdata, &nSize); RegCloseKey(HKEY_PERFORMANCE_DATA); if (ret == ERROR_SUCCESS) { RAND_add(pdata, nSize, nSize/100.0); - memset(pdata, 0, nSize); + OPENSSL_cleanse(pdata, nSize); printf("RandAddSeed() %lu bytes\n", nSize); } #endif @@ -210,7 +210,7 @@ uint256 GetRandHash() -static FILE* fileout = NULL; +static FILE* fileout = nullptr; inline int OutputDebugStringF(const char* pszFormat, ...) { @@ -231,7 +231,7 @@ inline int OutputDebugStringF(const char* pszFormat, ...) { std::filesystem::path pathDebug = GetDataDir() / "debug.log"; fileout = fopen(pathDebug.string().c_str(), "a"); - if (fileout) setbuf(fileout, NULL); // unbuffered + if (fileout) setbuf(fileout, nullptr); // unbuffered } if (fileout) { @@ -241,22 +241,22 @@ inline int OutputDebugStringF(const char* pszFormat, ...) // Since the order of destruction of static/global objects is undefined, // allocate mutexDebugLog on the heap the first time this routine // is called to avoid crashes during shutdown. - static std::mutex* mutexDebugLog = NULL; - if (mutexDebugLog == NULL) mutexDebugLog = new std::mutex(); + static std::mutex* mutexDebugLog = nullptr; + if (mutexDebugLog == nullptr) mutexDebugLog = new std::mutex(); std::lock_guard scoped_lock(*mutexDebugLog); // reopen the log file, if requested if (fReopenDebugLog) { fReopenDebugLog = false; std::filesystem::path pathDebug = GetDataDir() / "debug.log"; - if (freopen(pathDebug.string().c_str(),"a",fileout) != NULL) - setbuf(fileout, NULL); // unbuffered + if (freopen(pathDebug.string().c_str(),"a",fileout) != nullptr) + setbuf(fileout, nullptr); // unbuffered } // Debug print useful for profiling if (fLogTimestamps && fStartedNewLine) fprintf(fileout, "%s ", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str()); - if (pszFormat[strlen(pszFormat) - 1] == '\n') + if (pszFormat[0] != '\0' && pszFormat[strlen(pszFormat) - 1] == '\n') fStartedNewLine = true; else fStartedNewLine = false; @@ -318,7 +318,7 @@ string vstrprintf(const char *format, va_list ap) delete[] p; limit *= 2; p = new char[limit]; - if (p == NULL) + if (p == nullptr) throw std::bad_alloc(); } string str(p, p+ret); @@ -970,7 +970,7 @@ static std::string FormatException(std::exception* pex, const char* pszThread) { #ifdef WIN32 char pszModule[MAX_PATH] = ""; - GetModuleFileNameA(NULL, pszModule, sizeof(pszModule)); + GetModuleFileNameA(nullptr, pszModule, sizeof(pszModule)); #else const char* pszModule = "Triangles"; #endif @@ -1031,7 +1031,7 @@ std::filesystem::path GetDefaultDataDir() #else fs::path pathRet; char* pszHome = getenv("HOME"); - if (pszHome == NULL || strlen(pszHome) == 0) + if (pszHome == nullptr || strlen(pszHome) == 0) pathRet = fs::path("/"); else pathRet = fs::path(pszHome); @@ -1188,7 +1188,7 @@ int64_t GetTime() { if (nMockTime) return nMockTime; - return time(NULL); + return time(nullptr); } void SetMockTime(int64_t nMockTimeIn) @@ -1300,7 +1300,7 @@ std::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate) char pszPath[MAX_PATH] = ""; - if(SHGetSpecialFolderPathA(NULL, pszPath, nFolder, fCreate)) + if(SHGetSpecialFolderPathA(nullptr, pszPath, nFolder, fCreate)) { return fs::path(pszPath); } @@ -1349,3 +1349,16 @@ bool NewThread(void(*pfn)(void*), void* parg) } return true; } + +template +bool NewThreadT(Callable&& fn, Args&&... args) +{ + try + { + std::thread(std::forward(fn), std::forward(args)...).detach(); + } catch(const std::system_error& e) { + printf("Error creating thread: %s\n", e.what()); + return false; + } + return true; +} diff --git a/src/util.h b/src/util.h index 5935731..7685be0 100644 --- a/src/util.h +++ b/src/util.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -33,8 +34,8 @@ #include #include -static const int64_t COIN = 1000000; -static const int64_t CENT = 10000; +constexpr int64_t COIN = 1000000; +constexpr int64_t CENT = 10000; #define BEGIN(a) ((char*)&(a)) #define END(a) ((char*)&((&(a))[1])) @@ -177,24 +178,24 @@ bool ATTR_WARN_PRINTF(1,2) error(const char *format, ...); void LogException(std::exception* pex, const char* pszThread); void PrintException(std::exception* pex, const char* pszThread); void PrintExceptionContinue(std::exception* pex, const char* pszThread); -void ParseString(const std::string& str, char c, std::vector& v); +void ParseString(std::string_view str, char c, std::vector& v); std::string FormatMoney(int64_t n, bool fPlus=false); bool ParseMoney(const std::string& str, int64_t& nRet); bool ParseMoney(const char* pszIn, int64_t& nRet); std::vector ParseHex(const char* psz); std::vector ParseHex(const std::string& str); bool IsHex(const std::string& str); -std::vector DecodeBase64(const char* p, bool* pfInvalid = NULL); +std::vector DecodeBase64(const char* p, bool* pfInvalid = nullptr); std::string DecodeBase64(const std::string& str); std::string EncodeBase64(const unsigned char* pch, size_t len); std::string EncodeBase64(const std::string& str); -std::vector DecodeBase32(const char* p, bool* pfInvalid = NULL); +std::vector DecodeBase32(const char* p, bool* pfInvalid = nullptr); std::string DecodeBase32(const std::string& str); std::string EncodeBase32(const unsigned char* pch, size_t len); std::string EncodeBase32(const std::string& str); void ParseParameters(int argc, const char*const argv[]); bool WildcardMatch(const char* psz, const char* mask); -bool WildcardMatch(const std::string& str, const std::string& mask); +bool WildcardMatch(std::string_view str, std::string_view mask); void FileCommit(FILE *fileout); bool RenameOver(std::filesystem::path src, std::filesystem::path dest); std::filesystem::path GetDefaultDataDir(); @@ -244,7 +245,7 @@ inline int64_t atoi64(const char* psz) #ifdef _MSC_VER return _atoi64(psz); #else - return strtoll(psz, NULL, 10); + return strtoll(psz, nullptr, 10); #endif } @@ -253,7 +254,7 @@ inline int64_t atoi64(const std::string& str) #ifdef _MSC_VER return _atoi64(str.c_str()); #else - return strtoll(str.c_str(), NULL, 10); + return strtoll(str.c_str(), nullptr, 10); #endif } @@ -291,7 +292,7 @@ template std::string HexStr(const T itbegin, const T itend, bool fSpaces=false) { std::string rv; - static const char hexmap[16] = { '0', '1', '2', '3', '4', '5', '6', '7', + static constexpr char hexmap[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; rv.reserve((itend-itbegin)*3); for(T it = itbegin; it < itend; ++it) @@ -329,7 +330,7 @@ inline int64_t GetPerformanceCounter() QueryPerformanceCounter((LARGE_INTEGER*)&nCounter); #else timeval t; - gettimeofday(&t, NULL); + gettimeofday(&t, nullptr); nCounter = (int64_t) t.tv_sec * 1000000 + t.tv_usec; #endif return nCounter; @@ -356,7 +357,7 @@ inline std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) return pszTime; } -static const std::string strTimestampFormat = "%Y-%m-%d %H:%M:%S UTC"; +constexpr std::string_view strTimestampFormat = "%Y-%m-%d %H:%M:%S UTC"; inline std::string DateTimeStrFormat(int64_t nTime) { return DateTimeStrFormat(strTimestampFormat.c_str(), nTime); @@ -386,7 +387,7 @@ inline bool IsSwitchChar(char c) * @param default (e.g. "1") * @return command-line argument or default value */ -std::string GetArg(const std::string& strArg, const std::string& strDefault); +std::string GetArg(std::string_view strArg, std::string_view strDefault); /** * Return integer argument or default value @@ -395,7 +396,7 @@ std::string GetArg(const std::string& strArg, const std::string& strDefault); * @param default (e.g. 1) * @return command-line argument (0 if invalid number) or default value */ -int64_t GetArg(const std::string& strArg, int64_t nDefault); +int64_t GetArg(std::string_view strArg, int64_t nDefault); /** * Return boolean argument or default value @@ -404,7 +405,7 @@ int64_t GetArg(const std::string& strArg, int64_t nDefault); * @param default (true or false) * @return command-line argument or default value */ -bool GetBoolArg(const std::string& strArg, bool fDefault=false); +bool GetBoolArg(std::string_view strArg, bool fDefault=false); /** * Set an argument if it doesn't already have a value @@ -413,7 +414,7 @@ bool GetBoolArg(const std::string& strArg, bool fDefault=false); * @param strValue Value (e.g. "1") * @return true if argument gets set, false if it already had a value */ -bool SoftSetArg(const std::string& strArg, const std::string& strValue); +bool SoftSetArg(std::string_view strArg, std::string_view strValue); /** * Set a boolean argument if it doesn't already have a value @@ -422,7 +423,7 @@ bool SoftSetArg(const std::string& strArg, const std::string& strValue); * @param fValue Value (e.g. false) * @return true if argument gets set, false if it already had a value */ -bool SoftSetBoolArg(const std::string& strArg, bool fValue); +bool SoftSetBoolArg(std::string_view strArg, bool fValue); @@ -607,6 +608,9 @@ public: bool NewThread(void(*pfn)(void*), void* parg); +template +bool NewThreadT(Callable&& fn, Args&&... args); + #ifdef WIN32 inline void SetThreadPriority(int nPriority) { diff --git a/src/utxosnapshot.cpp b/src/utxosnapshot.cpp index f86a518..5df1233 100644 --- a/src/utxosnapshot.cpp +++ b/src/utxosnapshot.cpp @@ -44,7 +44,7 @@ bool DumpSnapshot(const fs::path& destPath, unsigned int nCollected = 0; while (pindex && nCollected < nHeaders) { CDiskBlockIndex diskindex(pindex); - vHeaders.push_back(std::make_pair(*pindex->phashBlock, diskindex)); + vHeaders.push_back({*pindex->phashBlock, diskindex}); pindex = pindex->pprev; nCollected++; } @@ -123,7 +123,7 @@ bool DumpSnapshot(const fs::path& destPath, // documented on CTxDBIteratorBase guarantees a stable view of committed state. { CDataStream ssKeyPrefix(SER_DISK, CLIENT_VERSION); - ssKeyPrefix << std::make_pair(std::string("u"), std::make_pair(uint256(0), (unsigned int)0)); + ssKeyPrefix << std::pair{std::string("u"), std::pair{uint256(0), (unsigned int)0}}; std::string strPrefixBegin = ssKeyPrefix.str(); auto it = txdbRead.NewIterator(); diff --git a/src/version.h b/src/version.h index 64f8cdd..dd9c5af 100644 --- a/src/version.h +++ b/src/version.h @@ -11,7 +11,7 @@ // client versioning // -static const int CLIENT_VERSION = +constexpr int CLIENT_VERSION = 1000000 * CLIENT_VERSION_MAJOR + 10000 * CLIENT_VERSION_MINOR + 100 * CLIENT_VERSION_REVISION @@ -24,35 +24,35 @@ extern const std::string CLIENT_DATE; // // database format versioning // -static const int DATABASE_VERSION = 70509; +constexpr int DATABASE_VERSION = 70509; // // network protocol versioning // -static const int PROTOCOL_VERSION = 70206; +constexpr int PROTOCOL_VERSION = 70206; // v5 hard fork: require new protocol version (disconnects old nodes) -static const int MIN_PROTO_VERSION = 70205; +constexpr int MIN_PROTO_VERSION = 70205; // Peers >= this version support the P2P UTXO snapshot protocol // (getsnap/snap/getsnapchunk/snapchunk and the NODE_SNAPSHOT service flag). -static const int SNAPSHOT_PROTO_VERSION = 70206; +constexpr int SNAPSHOT_PROTO_VERSION = 70206; -static const int INIT_PROTO_VERSION = 209; +constexpr int INIT_PROTO_VERSION = 209; // nTime field added to CAddress, starting with this version; // if possible, avoid requesting addresses nodes older than this -static const int CADDR_TIME_VERSION = 70200; +constexpr int CADDR_TIME_VERSION = 70200; // only request blocks from nodes outside this range of versions -static const int NOBLKS_VERSION_START = 0; -static const int NOBLKS_VERSION_END = 70203; +constexpr int NOBLKS_VERSION_START = 0; +constexpr int NOBLKS_VERSION_END = 70203; // BIP 0031, pong message, is enabled for all versions AFTER this one -static const int BIP0031_VERSION = 60000; +constexpr int BIP0031_VERSION = 60000; // "mempool" command, enhanced "getdata" behavior starts with this version: -static const int MEMPOOL_GD_VERSION = 60002; +constexpr int MEMPOOL_GD_VERSION = 60002; #endif diff --git a/src/wallet.cpp b/src/wallet.cpp index 7c68105..0d49e47 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -54,15 +54,19 @@ static CBlockIndex* GetWalletRescanStart(const CWallet& wallet) } } - if (wallet.nTimeFirstKey > 1 && pindexBest) + if (wallet.nTimeFirstKey > 1) { - int64_t nTimeWindowStart = wallet.nTimeFirstKey - 7200; - CBlockIndex* pindexBirthday = pindexBest; - while (pindexBirthday->pprev && pindexBirthday->GetBlockTime() > nTimeWindowStart) - pindexBirthday = pindexBirthday->pprev; + LOCK(cs_main); + if (pindexBest) + { + int64_t nTimeWindowStart = wallet.nTimeFirstKey - 7200; + CBlockIndex* pindexBirthday = pindexBest; + while (pindexBirthday->pprev && pindexBirthday->GetBlockTime() > nTimeWindowStart) + pindexBirthday = pindexBirthday->pprev; - if (!pindexStart || pindexBirthday->nHeight < pindexStart->nHeight) - pindexStart = pindexBirthday; + if (!pindexStart || pindexBirthday->nHeight < pindexStart->nHeight) + pindexStart = pindexBirthday; + } } return pindexStart ? pindexStart : pindexGenesisBlock; @@ -94,11 +98,11 @@ static bool GetIndexedWalletTxHeight(const CTxIndex& txindex, int& nHeight) if (!block.ReadFromDisk(txindex.pos.nFile, txindex.pos.nBlockPos, false)) return false; - map::iterator mi = mapBlockIndex.find(block.GetHash()); + auto mi = mapBlockIndex.find(block.GetHash()); if (mi == mapBlockIndex.end()) return false; - nHeight = (*mi).second->nHeight; + nHeight = mi->second->nHeight; return true; } @@ -121,7 +125,7 @@ static bool ReadIndexedWalletTransaction(CTxDBBase& txdb, const CDiskTxPos& txPo CPubKey CWallet::GenerateNewKey() { - bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY); // default to compressed public keys if we want 0.6.0 wallets + bool fCompressed = CanSupportFeature(WalletFeature::ComprPubKey); // default to compressed public keys if we want 0.6.0 wallets RandAddSeedPerfmon(); CKey key; @@ -129,7 +133,7 @@ CPubKey CWallet::GenerateNewKey() // Compressed public keys were introduced in version 0.6.0 if (fCompressed) - SetMinVersion(FEATURE_COMPRPUBKEY); + SetMinVersion(WalletFeature::ComprPubKey); CPubKey pubkey = key.GetPubKey(); @@ -165,12 +169,8 @@ bool CWallet::AddCryptedKey(const CPubKey &vchPubKey, const vectorWriteCryptedKey(vchPubKey, vchCryptedSecret, mapKeyMetadata[vchPubKey.GetID()]); - else - return CWalletDB(strWalletFile).WriteCryptedKey(vchPubKey, vchCryptedSecret, mapKeyMetadata[vchPubKey.GetID()]); + return CWalletDB(strWalletFile).WriteCryptedKey(vchPubKey, vchCryptedSecret, mapKeyMetadata[vchPubKey.GetID()]); } - return false; } bool CWallet::LoadKeyMetadata(const CPubKey &pubkey, const CKeyMetadata &meta) @@ -309,19 +309,19 @@ public: ) }; -bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit) +bool CWallet::SetMinVersion(WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit) { - if (nWalletVersion >= nVersion) + if (nWalletVersion >= static_cast(nVersion)) return true; // when doing an explicit upgrade, if we pass the max version permitted, upgrade all the way - if (fExplicit && nVersion > nWalletMaxVersion) - nVersion = FEATURE_LATEST; + if (fExplicit && static_cast(nVersion) > nWalletMaxVersion) + nVersion = WalletFeature::Latest; - nWalletVersion = nVersion; + nWalletVersion = static_cast(nVersion); - if (nVersion > nWalletMaxVersion) - nWalletMaxVersion = nVersion; + if (static_cast(nVersion) > nWalletMaxVersion) + nWalletMaxVersion = static_cast(nVersion); if (fFileBacked) { @@ -396,29 +396,21 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase) mapMasterKeys[++nMasterKeyMaxID] = kMasterKey; if (fFileBacked) { - pwalletdbEncryption = new CWalletDB(strWalletFile); - if (!pwalletdbEncryption->TxnBegin()) + std::unique_ptr dbEnc(new CWalletDB(strWalletFile)); + if (!dbEnc->TxnBegin()) return false; - pwalletdbEncryption->WriteMasterKey(nMasterKeyMaxID, kMasterKey); - } + dbEnc->WriteMasterKey(nMasterKeyMaxID, kMasterKey); - if (!EncryptKeys(vMasterKey)) - { - if (fFileBacked) - pwalletdbEncryption->TxnAbort(); - exit(1); //We now probably have half of our keys encrypted in memory, and half not...die and let the user reload their unencrypted wallet. - } + if (!EncryptKeys(vMasterKey)) + { + dbEnc->TxnAbort(); + return false; + } - // Encryption was introduced in version 0.4.0 - SetMinVersion(FEATURE_WALLETCRYPT, pwalletdbEncryption, true); + SetMinVersion(WalletFeature::WalletCrypt, dbEnc.get(), true); - if (fFileBacked) - { - if (!pwalletdbEncryption->TxnCommit()) - exit(1); //We now have keys encrypted in memory, but no on disk...die to avoid confusion and let the user reload their unencrypted wallet. - - delete pwalletdbEncryption; - pwalletdbEncryption = NULL; + if (!dbEnc->TxnCommit()) + return false; } Lock(); @@ -456,10 +448,9 @@ CWallet::TxItems CWallet::OrderedTxItems(std::list& acentries, // Note: maintaining indices in the database of (account,time) --> txid and (account, time) --> acentry // would make this much faster for applications that do this a lot. - for (map::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (auto& [hash, wtx] : mapWallet) { - CWalletTx* wtx = &((*it).second); - txOrdered.insert(make_pair(wtx->nOrderPos, TxPair(wtx, (CAccountingEntry*)0))); + txOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0))); } acentries.clear(); walletdb.ListAccountCreditDebit(strAccount, acentries); @@ -480,10 +471,9 @@ void CWallet::WalletUpdateSpent(const CTransaction &tx, bool fBlock) LOCK(cs_wallet); for (const CTxIn& txin : tx.vin) { - map::iterator mi = mapWallet.find(txin.prevout.hash); - if (mi != mapWallet.end()) + if (auto mi = mapWallet.find(txin.prevout.hash); mi != mapWallet.end()) { - CWalletTx& wtx = (*mi).second; + auto& [hash, wtx] = *mi; if (txin.prevout.n >= wtx.vout.size()) printf("WalletUpdateSpent: bad wtx %s\n", wtx.GetHash().ToString().c_str()); else if (!wtx.IsSpent(txin.prevout.n) && IsMine(wtx.vout[txin.prevout.n])) @@ -494,7 +484,7 @@ void CWallet::WalletUpdateSpent(const CTransaction &tx, bool fBlock) if (!IsInitialBlockDownload()) { try { NotifyTransactionChanged(this, txin.prevout.hash, CT_UPDATED); } - catch (...) { } + catch (...) { LogPrintf("WARNING: NotifyTransactionChanged exception in WalletUpdateSpent\n"); } } } } @@ -515,7 +505,7 @@ void CWallet::WalletUpdateSpent(const CTransaction &tx, bool fBlock) if (!IsInitialBlockDownload()) { try { NotifyTransactionChanged(this, hash, CT_UPDATED); } - catch (...) { } + catch (...) { LogPrintf("WARNING: NotifyTransactionChanged exception in WalletUpdateSpent\n"); } } } } @@ -718,10 +708,9 @@ bool CWallet::IsMine(const CTxIn &txin) const { { LOCK(cs_wallet); - map::const_iterator mi = mapWallet.find(txin.prevout.hash); - if (mi != mapWallet.end()) + if (auto mi = mapWallet.find(txin.prevout.hash); mi != mapWallet.end()) { - const CWalletTx& prev = (*mi).second; + const auto& [hash, prev] = *mi; if (txin.prevout.n < prev.vout.size()) if (IsMine(prev.vout[txin.prevout.n])) return true; @@ -734,10 +723,9 @@ int64_t CWallet::GetDebit(const CTxIn &txin) const { { LOCK(cs_wallet); - map::const_iterator mi = mapWallet.find(txin.prevout.hash); - if (mi != mapWallet.end()) + if (auto mi = mapWallet.find(txin.prevout.hash); mi != mapWallet.end()) { - const CWalletTx& prev = (*mi).second; + const auto& [hash, prev] = *mi; if (txin.prevout.n < prev.vout.size()) if (IsMine(prev.vout[txin.prevout.n])) return prev.vout[txin.prevout.n].nValue; @@ -783,27 +771,22 @@ int CWalletTx::GetRequestCount() const // Generated block if (hashBlock != 0) { - map::const_iterator mi = pwallet->mapRequestCount.find(hashBlock); - if (mi != pwallet->mapRequestCount.end()) - nRequests = (*mi).second; + if (auto mi = pwallet->mapRequestCount.find(hashBlock); mi != pwallet->mapRequestCount.end()) + nRequests = mi->second; } } else { - // Did anyone request this transaction? - map::const_iterator mi = pwallet->mapRequestCount.find(GetHash()); - if (mi != pwallet->mapRequestCount.end()) + if (auto mi = pwallet->mapRequestCount.find(GetHash()); mi != pwallet->mapRequestCount.end()) { - nRequests = (*mi).second; + nRequests = mi->second; - // How about the block it's in? if (nRequests == 0 && hashBlock != 0) { - map::const_iterator mi = pwallet->mapRequestCount.find(hashBlock); - if (mi != pwallet->mapRequestCount.end()) - nRequests = (*mi).second; + if (auto mi2 = pwallet->mapRequestCount.find(hashBlock); mi2 != pwallet->mapRequestCount.end()) + nRequests = mi2->second; else - nRequests = 1; // If it's in someone else's block it must have got out + nRequests = 1; } } } @@ -891,8 +874,7 @@ void CWalletTx::GetAccountAmounts(const string& strAccount, int64_t& nReceived, { if (pwallet->mapAddressBook.count(r.first)) { - map::const_iterator mi = pwallet->mapAddressBook.find(r.first); - if (mi != pwallet->mapAddressBook.end() && (*mi).second == strAccount) + if (auto mi = pwallet->mapAddressBook.find(r.first); mi != pwallet->mapAddressBook.end() && mi->second == strAccount) nReceived += r.second; } else if (strAccount.empty()) @@ -927,11 +909,10 @@ void CWalletTx::AddSupportingTransactions(CTxDBBase& txdb) setAlreadyDone.insert(hash); CMerkleTx tx; - map::const_iterator mi = pwallet->mapWallet.find(hash); - if (mi != pwallet->mapWallet.end()) + if (auto mi = pwallet->mapWallet.find(hash); mi != pwallet->mapWallet.end()) { - tx = (*mi).second; - for (const CMerkleTx& txWalletPrev : (*mi).second.vtxPrev) + tx = mi->second; + for (const CMerkleTx& txWalletPrev : mi->second.vtxPrev) mapWalletPrev[txWalletPrev.GetHash()] = &txWalletPrev; } else if (mapWalletPrev.count(hash)) @@ -1026,8 +1007,11 @@ bool CWallet::ScanForWalletTransactionsFromIndex(CBlockIndex* pindexStart, bool int nFound = 0; if (pnFound) *pnFound = 0; - if (!pindexBest) - return false; + { + LOCK(cs_main); + if (!pindexBest) + return false; + } const int nStartHeight = pindexStart ? pindexStart->nHeight : 0; @@ -1037,8 +1021,8 @@ bool CWallet::ScanForWalletTransactionsFromIndex(CBlockIndex* pindexStart, bool set setScripts; { LOCK(cs_KeyStore); - for (ScriptMap::const_iterator it = mapScripts.begin(); it != mapScripts.end(); ++it) - setScripts.insert((*it).first); + for (const auto& [scriptId, script] : mapScripts) + setScripts.insert(scriptId); } auto txdb_holder = MakeChainDB("r"); CTxDBBase& txdb = *txdb_holder; @@ -1114,10 +1098,10 @@ bool CWallet::ScanForWalletTransactionsFromIndex(CBlockIndex* pindexStart, bool CWalletTx wtx; { LOCK(cs_wallet); - map::const_iterator mi = mapWallet.find(hashTx); + auto mi = mapWallet.find(hashTx); if (mi == mapWallet.end()) continue; - wtx = (*mi).second; + wtx = mi->second; } // Check UTXO existence to update spent status. @@ -1144,7 +1128,10 @@ bool CWallet::ScanForWalletTransactionsFromIndex(CBlockIndex* pindexStart, bool } } - SetBestChain(CBlockLocator(pindexBest)); + { + LOCK(cs_main); + SetBestChain(CBlockLocator(pindexBest)); + } if (pnFound) *pnFound = nFound; @@ -1155,7 +1142,7 @@ int CWallet::ScanForWalletTransaction(const uint256& hashTx) { CTransaction tx; tx.ReadFromDisk(COutPoint(hashTx, 0)); - if (AddToWalletIfInvolvingMe(tx, NULL, true, true)) + if (AddToWalletIfInvolvingMe(tx, nullptr, true, true)) return 1; return 0; } @@ -1318,11 +1305,10 @@ int64_t CWallet::GetBalance() const int64_t nTotal = 0; { LOCK(cs_wallet); - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx* pcoin = &(*it).second; - if (pcoin->IsTrusted()) - nTotal += pcoin->GetAvailableCredit(); + if (wtx.IsTrusted()) + nTotal += wtx.GetAvailableCredit(); } } @@ -1334,11 +1320,10 @@ int64_t CWallet::GetUnconfirmedBalance() const int64_t nTotal = 0; { LOCK(cs_wallet); - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx* pcoin = &(*it).second; - if (!pcoin->IsFinal() || !pcoin->IsTrusted()) - nTotal += pcoin->GetAvailableCredit(); + if (!wtx.IsFinal() || !wtx.IsTrusted()) + nTotal += wtx.GetAvailableCredit(); } } return nTotal; @@ -1349,11 +1334,10 @@ int64_t CWallet::GetImmatureBalance() const int64_t nTotal = 0; { LOCK(cs_wallet); - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx& pcoin = (*it).second; - if (pcoin.IsCoinBase() && pcoin.GetBlocksToMaturity() > 0 && pcoin.IsInMainChain()) - nTotal += GetCredit(pcoin); + if (wtx.IsCoinBase() && wtx.GetBlocksToMaturity() > 0 && wtx.IsInMainChain()) + nTotal += GetCredit(wtx); } } return nTotal; @@ -1366,9 +1350,9 @@ void CWallet::AvailableCoins(vector& vCoins, bool fOnlyConfirmed, const { LOCK(cs_wallet); - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx* pcoin = &(*it).second; + const CWalletTx* pcoin = &wtx; if (!pcoin->IsFinal()) continue; @@ -1388,7 +1372,7 @@ void CWallet::AvailableCoins(vector& vCoins, bool fOnlyConfirmed, const for (unsigned int i = 0; i < pcoin->vout.size(); i++) if (!(pcoin->IsSpent(i)) && IsMine(pcoin->vout[i]) && pcoin->vout[i].nValue >= nMinimumInputValue && - (!coinControl || !coinControl->HasSelected() || coinControl->IsSelected((*it).first, i))) + (!coinControl || !coinControl->HasSelected() || coinControl->IsSelected(hash, i))) vCoins.push_back(COutput(pcoin, i, nDepth)); } @@ -1401,9 +1385,9 @@ void CWallet::AvailableCoinsMinConf(vector& vCoins, int nConf) const { LOCK(cs_wallet); - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx* pcoin = &(*it).second; + const CWalletTx* pcoin = &wtx; if (!pcoin->IsFinal()) continue; @@ -1461,11 +1445,10 @@ int64_t CWallet::GetStake() const { int64_t nTotal = 0; LOCK(cs_wallet); - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx* pcoin = &(*it).second; - if (pcoin->IsCoinStake() && pcoin->GetBlocksToMaturity() > 0 && pcoin->GetDepthInMainChain() > 0) - nTotal += CWallet::GetCredit(*pcoin); + if (wtx.IsCoinStake() && wtx.GetBlocksToMaturity() > 0 && wtx.GetDepthInMainChain() > 0) + nTotal += CWallet::GetCredit(wtx); } return nTotal; } @@ -1474,11 +1457,10 @@ int64_t CWallet::GetNewMint() const { int64_t nTotal = 0; LOCK(cs_wallet); - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx* pcoin = &(*it).second; - if (pcoin->IsCoinBase() && pcoin->GetBlocksToMaturity() > 0 && pcoin->GetDepthInMainChain() > 0) - nTotal += CWallet::GetCredit(*pcoin); + if (wtx.IsCoinBase() && wtx.GetBlocksToMaturity() > 0 && wtx.GetDepthInMainChain() > 0) + nTotal += CWallet::GetCredit(wtx); } return nTotal; } @@ -1492,9 +1474,9 @@ bool CWallet::GetAllBalances(int64_t& nBalance, int64_t& nStake, int64_t& nUncon TRY_LOCK(cs_wallet, lockWallet); if (!lockWallet) return false; - for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + for (const auto& [hash, wtx] : mapWallet) { - const CWalletTx& pcoin = (*it).second; + const CWalletTx& pcoin = wtx; if (pcoin.IsCoinStake() && pcoin.GetBlocksToMaturity() > 0 && pcoin.GetDepthInMainChain() > 0) nStake += CWallet::GetCredit(pcoin); @@ -1519,7 +1501,7 @@ bool CWallet::SelectCoinsMinConf(int64_t nTargetValue, unsigned int nSpendTime, // List of values less than target pair > coinLowestLarger; coinLowestLarger.first = std::numeric_limits::max(); - coinLowestLarger.second.first = NULL; + coinLowestLarger.second.first = nullptr; vector > > vValue; int64_t nTotalLower = 0; @@ -1571,7 +1553,7 @@ bool CWallet::SelectCoinsMinConf(int64_t nTargetValue, unsigned int nSpendTime, if (nTotalLower < nTargetValue) { - if (coinLowestLarger.second.first == NULL) + if (coinLowestLarger.second.first == nullptr) return false; setCoinsRet.insert(coinLowestLarger.second); nValueRet += coinLowestLarger.first; @@ -1801,7 +1783,7 @@ bool CWallet::CreateTransaction(const vector >& vecSend, // Check that enough fee is included int64_t nPayFee = nTransactionFee * (1 + (int64_t)nBytes / 1000); - int64_t nMinFee = wtxNew.GetMinFee(1, GMF_SEND, nBytes); + int64_t nMinFee = wtxNew.GetMinFee(1, GetMinFeeMode::Send, nBytes); if (nFeeRet < max(nPayFee, nMinFee)) { @@ -1930,7 +1912,11 @@ bool CWallet::GetStakeWeight(const CKeyStore& keystore, uint64_t& nMinWeight, ui bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int64_t nSearchInterval, int64_t nFees, CTransaction& txNew, CKey& key) { - CBlockIndex* pindexPrev = pindexBest; + CBlockIndex* pindexPrev; + { + LOCK(cs_main); + pindexPrev = pindexBest; + } CBigNum bnTargetPerCoinDay; bnTargetPerCoinDay.SetCompact(nBits); @@ -2160,7 +2146,7 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey) // This is only to keep the database open to defeat the auto-flush for the // duration of this scope. This is the only place where this optimization // maybe makes sense; please don't do it anywhere else. - CWalletDB* pwalletdb = fFileBacked ? new CWalletDB(strWalletFile,"r") : NULL; + CWalletDB* pwalletdb = fFileBacked ? new CWalletDB(strWalletFile,"r") : nullptr; // Take key pair from key pool so it won't be used again reservekey.KeepKey(); @@ -2178,7 +2164,7 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey) coin.MarkSpent(txin.prevout.n); coin.WriteToDisk(); try { NotifyTransactionChanged(this, coin.GetHash(), CT_UPDATED); } - catch (...) { } + catch (...) { LogPrintf("WARNING: NotifyTransactionChanged exception in CommitTransaction\n"); } } if (fFileBacked) @@ -2295,7 +2281,7 @@ bool CWallet::SetAddressBookName(const CTxDestination& address, const string& st ChangeType nMode; { LOCK(cs_wallet); // mapAddressBook - std::map::iterator mi = mapAddressBook.find(address); + auto mi = mapAddressBook.find(address); nMode = (mi == mapAddressBook.end()) ? CT_NEW : CT_UPDATED; fOwned = ::IsMine(*this, address); @@ -2308,7 +2294,7 @@ bool CWallet::SetAddressBookName(const CTxDestination& address, const string& st SecureMsgWalletKeyChanged(caddress.ToString(), strName, nMode); } try { NotifyAddressBookChanged(this, address, strName, fOwned, nMode); } - catch (...) { } + catch (...) { LogPrintf("WARNING: NotifyAddressBookChanged exception in SetAddressBookName\n"); } if (!fFileBacked) return false; @@ -2331,7 +2317,7 @@ bool CWallet::DelAddressBookName(const CTxDestination& address) SecureMsgWalletKeyChanged(caddress.ToString(), sName, CT_DELETED); } try { NotifyAddressBookChanged(this, address, "", fOwned, CT_DELETED); } - catch (...) { } + catch (...) { LogPrintf("WARNING: NotifyAddressBookChanged exception in DelAddressBookName\n"); } if (!fFileBacked) return false; @@ -2362,10 +2348,9 @@ bool CWallet::GetTransaction(const uint256 &hashTx, CWalletTx& wtx) { { LOCK(cs_wallet); - map::iterator mi = mapWallet.find(hashTx); - if (mi != mapWallet.end()) + if (auto mi = mapWallet.find(hashTx); mi != mapWallet.end()) { - wtx = (*mi).second; + wtx = mi->second; return true; } } @@ -2686,8 +2671,8 @@ void CWallet::FixSpentCoins(int& nMismatchFound, int64_t& nBalanceInQuestion, bo LOCK(cs_wallet); vector vCoins; vCoins.reserve(mapWallet.size()); - for (map::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) - vCoins.push_back(&(*it).second); + for (auto& [hash, wtx] : mapWallet) + vCoins.push_back(&wtx); auto txdb_holder = MakeChainDB("r"); CTxDBBase& txdb = *txdb_holder; for (CWalletTx* pcoin : vCoins) @@ -2737,10 +2722,9 @@ void CWallet::DisableTransaction(const CTransaction &tx) LOCK(cs_wallet); for (const CTxIn& txin : tx.vin) { - map::iterator mi = mapWallet.find(txin.prevout.hash); - if (mi != mapWallet.end()) + if (auto mi = mapWallet.find(txin.prevout.hash); mi != mapWallet.end()) { - CWalletTx& prev = (*mi).second; + auto& [hash, prev] = *mi; if (txin.prevout.n < prev.vout.size() && IsMine(prev.vout[txin.prevout.n])) { prev.MarkUnspent(txin.prevout.n); @@ -2809,11 +2793,10 @@ void CWallet::UpdatedTransaction(const uint256 &hashTx) { LOCK(cs_wallet); // Only notify UI if this transaction is in this wallet - map::const_iterator mi = mapWallet.find(hashTx); - if (mi != mapWallet.end() && !IsInitialBlockDownload()) + if (auto mi = mapWallet.find(hashTx); mi != mapWallet.end() && !IsInitialBlockDownload()) { try { NotifyTransactionChanged(this, hashTx, CT_UPDATED); } - catch (...) { } + catch (...) { LogPrintf("WARNING: NotifyTransactionChanged exception in UpdatedTransaction\n"); } } } } @@ -2822,9 +2805,9 @@ void CWallet::GetKeyBirthTimes(std::map &mapKeyBirth) const { mapKeyBirth.clear(); // get birth times for keys with metadata - for (std::map::const_iterator it = mapKeyMetadata.begin(); it != mapKeyMetadata.end(); it++) - if (it->second.nCreateTime) - mapKeyBirth[it->first] = it->second.nCreateTime; + for (const auto& [keyId, meta] : mapKeyMetadata) + if (meta.nCreateTime) + mapKeyBirth[keyId] = meta.nCreateTime; // map in which we'll infer heights of other keys CBlockIndex *pindexMax = FindBlockByHeight(std::max(0, nBestHeight - 144)); // the tip can be reorganised; use a 144-block safety margin @@ -2843,11 +2826,8 @@ void CWallet::GetKeyBirthTimes(std::map &mapKeyBirth) const { // find first block that affects those keys, if there are any left std::vector vAffected; - for (std::map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); it++) { - // iterate over all wallet transactions... - const CWalletTx &wtx = (*it).second; - std::map::const_iterator blit = mapBlockIndex.find(wtx.hashBlock); - if (blit != mapBlockIndex.end() && blit->second->IsInMainChain()) { + for (const auto& [hash, wtx] : mapWallet) { + if (auto blit = mapBlockIndex.find(wtx.hashBlock); blit != mapBlockIndex.end() && blit->second->IsInMainChain()) { // ... which are already in a block int nHeight = blit->second->nHeight; for (const CTxOut &txout : wtx.vout) { @@ -2855,8 +2835,7 @@ void CWallet::GetKeyBirthTimes(std::map &mapKeyBirth) const { ::ExtractAffectedKeys(*this, txout.scriptPubKey, vAffected); for (const CKeyID &keyid : vAffected) { // ... and all their affected keys - std::map::iterator rit = mapKeyFirstBlock.find(keyid); - if (rit != mapKeyFirstBlock.end() && nHeight < rit->second->nHeight) + if (auto rit = mapKeyFirstBlock.find(keyid); rit != mapKeyFirstBlock.end() && nHeight < rit->second->nHeight) rit->second = blit->second; } vAffected.clear(); @@ -2865,8 +2844,8 @@ void CWallet::GetKeyBirthTimes(std::map &mapKeyBirth) const { } // Extract block timestamps for those keys - for (std::map::const_iterator it = mapKeyFirstBlock.begin(); it != mapKeyFirstBlock.end(); it++) - mapKeyBirth[it->first] = it->second->nTime - 7200; // block times can be 2h off + for (const auto& [keyId, pindex] : mapKeyFirstBlock) + mapKeyBirth[keyId] = pindex->nTime - 7200; // block times can be 2h off } diff --git a/src/wallet.h b/src/wallet.h index f3a32c9..32f0ec4 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -32,14 +32,12 @@ class CCoinControl; typedef std::map mapValue_t; /** (client) version numbers for particular wallet features */ -enum WalletFeature +enum class WalletFeature : int { - FEATURE_BASE = 10500, // the earliest version new wallets supports (only useful for getinfo's clientversion output) - - FEATURE_WALLETCRYPT = 40000, // wallet encryption - FEATURE_COMPRPUBKEY = 60000, // compressed public keys - - FEATURE_LATEST = 60000 + Base = 10500, + WalletCrypt = 40000, + ComprPubKey = 60000, + Latest = 60000 }; /** A key pool entry */ @@ -76,7 +74,7 @@ class CWallet : public CCryptoKeyStore { private: bool SelectCoinsSimple(int64_t nTargetValue, unsigned int nSpendTime, int nMinConf, std::set >& setCoinsRet, int64_t& nValueRet) const; - bool SelectCoins(int64_t nTargetValue, unsigned int nSpendTime, std::set >& setCoinsRet, int64_t& nValueRet, const CCoinControl *coinControl=NULL) const; + bool SelectCoins(int64_t nTargetValue, unsigned int nSpendTime, std::set >& setCoinsRet, int64_t& nValueRet, const CCoinControl *coinControl=nullptr) const; CWalletDB *pwalletdbEncryption; @@ -102,26 +100,19 @@ public: CWallet() { - nWalletVersion = FEATURE_BASE; - nWalletMaxVersion = FEATURE_BASE; + nWalletVersion = WalletFeature::Base; + nWalletMaxVersion = WalletFeature::Base; fFileBacked = false; nMasterKeyMaxID = 0; - pwalletdbEncryption = NULL; + pwalletdbEncryption = nullptr; nOrderPosNext = 0; nCachedStakeWeight = 0; nCachedStakeWeightTime = 0; } - CWallet(std::string strWalletFileIn) + CWallet(std::string strWalletFileIn) : CWallet() { - nWalletVersion = FEATURE_BASE; - nWalletMaxVersion = FEATURE_BASE; strWalletFile = strWalletFileIn; fFileBacked = true; - nMasterKeyMaxID = 0; - pwalletdbEncryption = NULL; - nOrderPosNext = 0; - nCachedStakeWeight = 0; - nCachedStakeWeightTime = 0; } std::map mapWallet; @@ -134,10 +125,10 @@ public: int64_t nTimeFirstKey; // check whether we are allowed to upgrade (or already support) to the named feature - bool CanSupportFeature(enum WalletFeature wf) { return nWalletMaxVersion >= wf; } + bool CanSupportFeature(WalletFeature wf) { return nWalletMaxVersion >= static_cast(wf); } void AvailableCoinsMinConf(std::vector& vCoins, int nConf) const; - void AvailableCoins(std::vector& vCoins, bool fOnlyConfirmed=true, const CCoinControl *coinControl=NULL) const; + void AvailableCoins(std::vector& vCoins, bool fOnlyConfirmed=true, const CCoinControl *coinControl=nullptr) const; bool SelectCoinsMinConf(int64_t nTargetValue, unsigned int nSpendTime, int nConfMine, int nConfTheirs, std::vector vCoins, std::set >& setCoinsRet, int64_t& nValueRet) const; // keystore implementation // Generate a new key @@ -169,7 +160,7 @@ public: /** Increment the next transaction order id @return next transaction order id */ - int64_t IncOrderPosNext(CWalletDB *pwalletdb = NULL); + int64_t IncOrderPosNext(CWalletDB *pwalletdb = nullptr); typedef std::pair TxPair; typedef std::multimap TxItems; @@ -186,7 +177,7 @@ public: bool EraseFromWallet(uint256 hash); void WalletUpdateSpent(const CTransaction& prevout, bool fBlock = false); int ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false); - bool ScanForWalletTransactionsFromIndex(CBlockIndex* pindexStart, bool fUpdate, int* pnFound = NULL); + bool ScanForWalletTransactionsFromIndex(CBlockIndex* pindexStart, bool fUpdate, int* pnFound = nullptr); int ScanForWalletTransaction(const uint256& hashTx); void ReacceptWalletTransactions(); void ResendWalletTransactions(bool fForce = false); @@ -197,8 +188,8 @@ public: int64_t GetNewMint() const; // Get all balances in a single lock acquisition + single pass (avoids 4x lock + 4x iteration) bool GetAllBalances(int64_t& nBalance, int64_t& nStake, int64_t& nUnconfirmed, int64_t& nImmature) const; - bool CreateTransaction(const std::vector >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64_t& nFeeRet, const CCoinControl *coinControl=NULL); - bool CreateTransaction(CScript scriptPubKey, int64_t nValue, std::string& sNarr, CWalletTx& wtxNew, CReserveKey& reservekey, int64_t& nFeeRet, const CCoinControl *coinControl=NULL); + bool CreateTransaction(const std::vector >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64_t& nFeeRet, const CCoinControl *coinControl=nullptr); + bool CreateTransaction(CScript scriptPubKey, int64_t nValue, std::string& sNarr, CWalletTx& wtxNew, CReserveKey& reservekey, int64_t& nFeeRet, const CCoinControl *coinControl=nullptr); bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey); bool GetStakeWeight(const CKeyStore& keystore, uint64_t& nMinWeight, uint64_t& nMaxWeight, uint64_t& nWeight); @@ -320,7 +311,7 @@ public: bool SetDefaultKey(const CPubKey &vchPubKey); // signify that a particular wallet feature is now used. this may change nWalletVersion and nWalletMaxVersion if those are lower - bool SetMinVersion(enum WalletFeature, CWalletDB* pwalletdbIn = NULL, bool fExplicit = false); + bool SetMinVersion(WalletFeature, CWalletDB* pwalletdbIn = nullptr, bool fExplicit = false); // change which version we're allowed to upgrade to (note that this does not immediately imply upgrading to that format) bool SetMaxVersion(int nVersion); @@ -422,7 +413,7 @@ public: CWalletTx() { - Init(NULL); + Init(nullptr); } CWalletTx(const CWallet* pwalletIn) @@ -467,7 +458,7 @@ public: ( CWalletTx* pthis = const_cast(this); if (fRead) - pthis->Init(NULL); + pthis->Init(nullptr); char fSpent = false; if (!fRead) @@ -592,6 +583,7 @@ public: { if (vin.empty()) return 0; + LOCK(pwallet->cs_wallet); if (fDebitCached) return nDebitCached; nDebitCached = pwallet->GetDebit(*this); @@ -601,11 +593,10 @@ public: int64_t GetCredit(bool fUseCache=true) const { - // Must wait until coinbase is safely deep enough in the chain before valuing it if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) return 0; - // GetBalance can assume transactions in mapWallet won't change + LOCK(pwallet->cs_wallet); if (fUseCache && fCreditCached) return nCreditCached; nCreditCached = pwallet->GetCredit(*this); @@ -615,10 +606,10 @@ public: int64_t GetAvailableCredit(bool fUseCache=true) const { - // Must wait until coinbase is safely deep enough in the chain before valuing it if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) return 0; + LOCK(pwallet->cs_wallet); if (fUseCache && fAvailableCreditCached) return nAvailableCreditCached; @@ -642,6 +633,7 @@ public: int64_t GetChange() const { + LOCK(pwallet->cs_wallet); if (fChangeCached) return nChangeCached; nChangeCached = pwallet->GetChange(*this); diff --git a/src/walletdb.h b/src/walletdb.h index b1b9428..1650473 100644 --- a/src/walletdb.h +++ b/src/walletdb.h @@ -98,22 +98,22 @@ public: bool WriteTx(uint256 hash, const CWalletTx& wtx) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("tx"), hash), wtx); + return Write({std::string("tx"), hash}, wtx); } bool EraseTx(uint256 hash) { nWalletDBUpdated++; - return Erase(std::make_pair(std::string("tx"), hash)); + return Erase({std::string("tx"), hash}); } bool WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey, const CKeyMetadata &keyMeta) { nWalletDBUpdated++; - if(!Write(std::make_pair(std::string("keymeta"), vchPubKey), keyMeta)) + if(!Write({std::string("keymeta"), vchPubKey}, keyMeta)) return false; - return Write(std::make_pair(std::string("key"), vchPubKey.Raw()), vchPrivKey, false); + return Write({std::string("key"), vchPubKey.Raw()}, vchPrivKey, false); } bool WriteCryptedKey(const CPubKey& vchPubKey, const std::vector& vchCryptedSecret, const CKeyMetadata &keyMeta) @@ -121,15 +121,15 @@ public: nWalletDBUpdated++; bool fEraseUnencryptedKey = true; - if(!Write(std::make_pair(std::string("keymeta"), vchPubKey), keyMeta)) + if(!Write({std::string("keymeta"), vchPubKey}, keyMeta)) return false; - if (!Write(std::make_pair(std::string("ckey"), vchPubKey.Raw()), vchCryptedSecret, false)) + if (!Write({std::string("ckey"), vchPubKey.Raw()}, vchCryptedSecret, false)) return false; if (fEraseUnencryptedKey) { - Erase(std::make_pair(std::string("key"), vchPubKey.Raw())); - Erase(std::make_pair(std::string("wkey"), vchPubKey.Raw())); + Erase({std::string("key"), vchPubKey.Raw()}); + Erase({std::string("wkey"), vchPubKey.Raw()}); } return true; } @@ -137,13 +137,13 @@ public: bool WriteMasterKey(unsigned int nID, const CMasterKey& kMasterKey) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("mkey"), nID), kMasterKey, true); + return Write({std::string("mkey"), nID}, kMasterKey, true); } bool WriteCScript(const uint160& hash, const CScript& redeemScript) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("cscript"), hash), redeemScript, false); + return Write({std::string("cscript"), hash}, redeemScript, false); } bool WriteBestBlock(const CBlockLocator& locator) @@ -171,19 +171,19 @@ public: bool ReadPool(int64_t nPool, CKeyPool& keypool) { - return Read(std::make_pair(std::string("pool"), nPool), keypool); + return Read({std::string("pool"), nPool}, keypool); } bool WritePool(int64_t nPool, const CKeyPool& keypool) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("pool"), nPool), keypool); + return Write({std::string("pool"), nPool}, keypool); } bool ErasePool(int64_t nPool) { nWalletDBUpdated++; - return Erase(std::make_pair(std::string("pool"), nPool)); + return Erase({std::string("pool"), nPool}); } // Settings are no longer stored in wallet.dat; these are @@ -191,18 +191,18 @@ public: template bool ReadSetting(const std::string& strKey, T& value) { - return Read(std::make_pair(std::string("setting"), strKey), value); + return Read({std::string("setting"), strKey}, value); } template bool WriteSetting(const std::string& strKey, const T& value) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("setting"), strKey), value); + return Write({std::string("setting"), strKey}, value); } bool EraseSetting(const std::string& strKey) { nWalletDBUpdated++; - return Erase(std::make_pair(std::string("setting"), strKey)); + return Erase({std::string("setting"), strKey}); } bool WriteMinVersion(int nVersion) diff --git a/src/zmqpublishnotifier.cpp b/src/zmqpublishnotifier.cpp index 002e44f..aa0ca1d 100644 --- a/src/zmqpublishnotifier.cpp +++ b/src/zmqpublishnotifier.cpp @@ -13,10 +13,10 @@ #include #include -CZMQPublishNotifier* pzmqNotifier = NULL; +CZMQPublishNotifier* pzmqNotifier = nullptr; CZMQPublishNotifier::CZMQPublishNotifier() - : pcontext(NULL), psocket(NULL), fInitialized(false) + : pcontext(nullptr), psocket(nullptr), fInitialized(false) { } @@ -40,7 +40,7 @@ bool CZMQPublishNotifier::Initialize(const std::string& addr) { printf("ZMQ: Failed to create socket\n"); zmq_ctx_destroy(pcontext); - pcontext = NULL; + pcontext = nullptr; return false; } @@ -50,8 +50,8 @@ bool CZMQPublishNotifier::Initialize(const std::string& addr) printf("ZMQ: Failed to bind to %s: %s\n", address.c_str(), zmq_strerror(errno)); zmq_close(psocket); zmq_ctx_destroy(pcontext); - psocket = NULL; - pcontext = NULL; + psocket = nullptr; + pcontext = nullptr; return false; } @@ -65,12 +65,12 @@ void CZMQPublishNotifier::Shutdown() if (psocket) { zmq_close(psocket); - psocket = NULL; + psocket = nullptr; } if (pcontext) { zmq_ctx_destroy(pcontext); - pcontext = NULL; + pcontext = nullptr; } fInitialized = false; }