From 72c469cdc52f8c59ea56dc1cd59157151f56c89e Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Sun, 3 Sep 2023 09:46:44 +1000 Subject: [PATCH 01/22] Update Cryptonite to c++17 std --- build-aux/m4/bitcoin_qt.m4 | 1 + configure.ac | 36 +++++++++++ src/Makefile.am | 2 +- src/chainparams.cpp | 3 +- src/db.cpp | 14 ++-- src/init.cpp | 35 +++++----- src/json/json_spirit_reader_template.h | 4 +- src/key.cpp | 2 +- src/leveldbwrapper.cpp | 6 +- src/leveldbwrapper.h | 19 +++--- src/main.cpp | 60 +++++++++-------- src/qt/Makefile.am | 2 +- src/qt/addresstablemodel.cpp | 4 +- src/qt/bitcoin.cpp | 13 ++-- src/qt/bitcoingui.cpp | 4 ++ src/qt/clientmodel.cpp | 5 +- src/qt/coincontroldialog.cpp | 3 +- src/qt/guiutil.cpp | 89 ++++++++------------------ src/qt/receivecoinsdialog.cpp | 3 +- src/qt/receiverequestdialog.cpp | 6 +- src/qt/rpcconsole.cpp | 2 +- src/qt/splashscreen.cpp | 3 + src/qt/test/Makefile.am | 2 +- src/qt/trafficgraphwidget.cpp | 1 + src/qt/walletmodel.cpp | 15 ++++- src/rpcclient.cpp | 3 +- src/rpcprotocol.cpp | 3 +- src/rpcprotocol.h | 2 +- src/rpcserver.cpp | 24 +++---- src/scheduler.cpp | 4 +- src/test/Makefile.am | 2 +- src/util.cpp | 34 +++++++--- src/walletdb.cpp | 13 ++-- 33 files changed, 232 insertions(+), 187 deletions(-) diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index 130cf29..b1cadf5 100644 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -330,6 +330,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ ]) BITCOIN_QT_CHECK(AC_CHECK_LIB([z] ,[main],,BITCOIN_QT_FAIL(zlib not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([zstd] ,[main],,BITCOIN_QT_FAIL(zstd not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([png] ,[main],,BITCOIN_QT_FAIL(png not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Gui] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXGui not found))) diff --git a/configure.ac b/configure.ac index 50029df..c0e625f 100644 --- a/configure.ac +++ b/configure.ac @@ -10,6 +10,13 @@ AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERS AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) LT_INIT([disable-shared]) + +dnl Unless the user specified ARFLAGS, force it to be cr +AC_ARG_VAR(ARFLAGS, [Flags for the archiver, defaults to if not set]) +if test "x${ARFLAGS+set}" != "xset"; then + ARFLAGS="cr" +fi + AC_CANONICAL_HOST AH_TOP([#ifndef BITCOIN_CONFIG_H]) AH_TOP([#define BITCOIN_CONFIG_H]) @@ -199,6 +206,8 @@ case $host in AC_CHECK_LIB([userenv], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([dwmapi], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([pcre2-16], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([wtsapi32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([zstd], [main],, AC_MSG_ERROR(lib missing)) AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"]) AX_CHECK_LINK_FLAG([[-static-libgcc]],[LDFLAGS="$LDFLAGS -static-libgcc"]) @@ -779,3 +788,30 @@ AC_CONFIG_FILES([Makefile src/Makefile src/test/Makefile src/qt/Makefile src/qt/ AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) AC_OUTPUT + +echo +echo "Options used to compile and link:" +echo " with wallet = $enable_wallet" +echo " with gui / qt = $bitcoin_enable_qt" +if test x$bitcoin_enable_qt != xno; then + echo " qt version = $bitcoin_qt_got_major_vers" + echo " with qr = $use_qr" +fi +echo " with zmq = $use_zmq" +echo " with test = $use_tests" +echo " with bench = $use_bench" +echo " with upnp = $use_upnp" +echo " debug enabled = $enable_debug" +echo " werror = $enable_werror" +echo +echo " target os = $TARGET_OS" +echo " build os = $BUILD_OS" +echo +echo " CC = $CC" +echo " CFLAGS = $CFLAGS" +echo " CPPFLAGS = $CPPFLAGS" +echo " CXX = $CXX" +echo " CXXFLAGS = $CXXFLAGS" +echo " LDFLAGS = $LDFLAGS" +echo " ARFLAGS = $ARFLAGS" +echo diff --git a/src/Makefile.am b/src/Makefile.am index 70644be..9b5993a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ include Makefile.include -AM_CPPFLAGS += -I$(builddir) -fpermissive -ffloat-store -std=c++11 -D__STDC_LIMIT_MACROS -D__USE_MINGW_ANSI_STDIO +AM_CPPFLAGS += -I$(builddir) -fpermissive -ffloat-store -std=c++17 -D__STDC_LIMIT_MACROS -D__USE_MINGW_ANSI_STDIO noinst_LIBRARIES = \ libcryptonite_server.a \ diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 733ac58..e58c9ee 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -105,8 +105,9 @@ class CMainParams : public CChainParams { if(hashGenesisBlock != uint256("0x000009a460ccc429ac6e53c91c6ed2d96697884b8b656a903042faff8971c5aa")) MineGenesis(genesis); + vSeeds.push_back(CDNSSeedData("explorer.cryptonite.info", "explorer.cryptonite.info")); - vSeeds.push_back(CDNSSeedData("xcn.suprnova.cc", "xcn.suprnova.cc")); + vSeeds.push_back(CDNSSeedData("xcn.suprnova.cc", "xcn.suprnova.cc")); vSeeds.push_back(CDNSSeedData("explorer.digicent.org", "explorer.digicent.org")); //sa ToDO: Review. The convert_to_container stuff was added as a quick fix to get it building in c++11. it should work diff --git a/src/db.cpp b/src/db.cpp index 8ff6a53..3e211c6 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -20,14 +20,12 @@ #include #include +namespace fs = boost::filesystem; using namespace std; using namespace boost; - unsigned int nWalletDBUpdated; - - // // CDB // @@ -44,7 +42,7 @@ void CDBEnv::EnvShutdown() if (ret != 0) LogPrintf("CDBEnv::EnvShutdown : Error %d shutting down database environment: %s\n", ret, DbEnv::strerror(ret)); if (!fMockDb) - DbEnv(0).remove(path.string().c_str(), 0); + DbEnv(static_cast(0)).remove(path.string().c_str(), 0); } CDBEnv::CDBEnv() : dbenv(DB_CXX_NO_EXCEPTIONS) @@ -63,7 +61,7 @@ void CDBEnv::Close() EnvShutdown(); } -bool CDBEnv::Open(const boost::filesystem::path& pathIn) +bool CDBEnv::Open(const fs::path& pathIn) { if (fDbEnvInit) return true; @@ -71,9 +69,9 @@ bool CDBEnv::Open(const boost::filesystem::path& pathIn) boost::this_thread::interruption_point(); path = pathIn; - filesystem::path pathLogDir = path / "database"; + fs::path pathLogDir = path / "database"; TryCreateDirectory(pathLogDir); - filesystem::path pathErrorFile = path / "db.log"; + fs::path pathErrorFile = path / "db.log"; LogPrintf("CDBEnv::Open : LogDir=%s ErrorFile=%s\n", pathLogDir.string(), pathErrorFile.string()); unsigned int nEnvFlags = 0; @@ -471,7 +469,7 @@ void CDBEnv::Flush(bool fShutdown) dbenv.log_archive(&listp, DB_ARCH_REMOVE); Close(); if (!fMockDb) - boost::filesystem::remove_all(path / "database"); + fs::remove_all(path / "database"); } } } diff --git a/src/init.cpp b/src/init.cpp index 9071389..76f180c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -38,6 +38,7 @@ #include #include +namespace fs = boost::filesystem; using namespace std; using namespace boost; @@ -139,7 +140,7 @@ void Shutdown() if (pwalletMain) bitdb.Flush(true); #endif - boost::filesystem::remove(GetPidFile()); + fs::remove(GetPidFile()); UnregisterAllWallets(); #ifdef ENABLE_WALLET if (pwalletMain) @@ -366,7 +367,7 @@ struct CImportingNow } }; -void ThreadImport(std::vector vImportFiles) +void ThreadImport(std::vector vImportFiles) { RenameThread("cryptonite-loadblk"); ScheduleBatchPriority(); @@ -392,12 +393,12 @@ void ThreadImport(std::vector vImportFiles) } // hardcoded $DATADIR/bootstrap.dat - filesystem::path pathBootstrap = GetDataDir() / "bootstrap.dat"; - if (filesystem::exists(pathBootstrap)) { + fs::path pathBootstrap = GetDataDir() / "bootstrap.dat"; + if (fs::exists(pathBootstrap)) { FILE *file = fopen(pathBootstrap.string().c_str(), "rb"); if (file) { CImportingNow imp; - filesystem::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old"; + fs::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old"; LogPrintf("Importing bootstrap.dat...\n"); LoadExternalBlockFile(file); RenameOver(pathBootstrap, pathBootstrapOld); @@ -407,7 +408,7 @@ void ThreadImport(std::vector vImportFiles) } // -loadblock= - for (boost::filesystem::path &path : vImportFiles) { + for (fs::path &path : vImportFiles) { FILE *file = fopen(path.string().c_str(), "rb"); if (file) { CImportingNow imp; @@ -640,11 +641,11 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) std::string strDataDir = GetDataDir().string(); #ifdef ENABLE_WALLET // Wallet file must be a plain filename without a directory - if (strWalletFile != boost::filesystem::basename(strWalletFile) + boost::filesystem::extension(strWalletFile)) + if (strWalletFile != fs::basename(strWalletFile) + fs::extension(strWalletFile)) return InitError(strprintf(_("Wallet %s resides outside data directory %s"), strWalletFile, strDataDir)); #endif // Make sure only a single Bitcoin process is using the data directory. - boost::filesystem::path pathLockFile = GetDataDir() / ".lock"; + fs::path pathLockFile = GetDataDir() / ".lock"; FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist. if (file) fclose(file); static boost::interprocess::file_lock lock(pathLockFile.string().c_str()); @@ -684,12 +685,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if (!bitdb.Open(GetDataDir())) { // try moving the database env out of the way - boost::filesystem::path pathDatabase = GetDataDir() / "database"; - boost::filesystem::path pathDatabaseBak = GetDataDir() / strprintf("database.%d.bak", GetTime()); + fs::path pathDatabase = GetDataDir() / "database"; + fs::path pathDatabaseBak = GetDataDir() / strprintf("database.%d.bak", GetTime()); try { - boost::filesystem::rename(pathDatabase, pathDatabaseBak); + fs::rename(pathDatabase, pathDatabaseBak); LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string(), pathDatabaseBak.string()); - } catch(boost::filesystem::filesystem_error &error) { + } catch(fs::filesystem_error &error) { // failure is ok (well, not really, but it's not worse than what we started with) } @@ -708,7 +709,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) return false; } - if (filesystem::exists(GetDataDir() / strWalletFile)) + if (fs::exists(GetDataDir() / strWalletFile)) { CDBEnv::VerifyResult r = bitdb.Verify(strWalletFile, CWalletDB::Recover); if (r == CDBEnv::RECOVER_OK) @@ -834,10 +835,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) fReindex = GetBoolArg("-reindex", false); // Create blocks dir - filesystem::path blocksDir = GetDataDir() / "blocks"; - if (!filesystem::exists(blocksDir)) + fs::path blocksDir = GetDataDir() / "blocks"; + if (!fs::exists(blocksDir)) { - filesystem::create_directories(blocksDir); + fs::create_directories(blocksDir); } // cache size calculations @@ -1092,7 +1093,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) fLoading=false; - std::vector vImportFiles; + std::vector vImportFiles; if (mapArgs.count("-loadblock")) { for (string strFile : mapMultiArgs["-loadblock"]) diff --git a/src/json/json_spirit_reader_template.h b/src/json/json_spirit_reader_template.h index 42fd0fb..04878a9 100644 --- a/src/json/json_spirit_reader_template.h +++ b/src/json/json_spirit_reader_template.h @@ -11,7 +11,7 @@ //#define BOOST_SPIRIT_THREADSAFE // uncomment for multithreaded use, requires linking to boost.thread -#include +#include #include #if BOOST_VERSION >= 103800 @@ -30,6 +30,8 @@ #define spirit_namespace boost::spirit #endif +using namespace boost::placeholders; + namespace json_spirit { const spirit_namespace::int_parser < boost::int64_t > int64_p = spirit_namespace::int_parser < boost::int64_t >(); diff --git a/src/key.cpp b/src/key.cpp index 55b5837..cebfd7a 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -115,7 +115,7 @@ int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned ch if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; } if (8*msglen > n) BN_rshift(e, e, 8-(n & 7)); zero = BN_CTX_get(ctx); - if (!BN_zero(zero)) { ret=-1; goto err; } + BN_zero(zero); if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; } rr = BN_CTX_get(ctx); if (!BN_mod_inverse(rr, sig_r, order, ctx)) { ret=-1; goto err; } diff --git a/src/leveldbwrapper.cpp b/src/leveldbwrapper.cpp index 01b80fc..185cc7f 100644 --- a/src/leveldbwrapper.cpp +++ b/src/leveldbwrapper.cpp @@ -3,16 +3,14 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "leveldbwrapper.h" - #include "util.h" - #include #include #include #include #include -void HandleError(const leveldb::Status &status) throw(leveldb_error) { +void HandleError(const leveldb::Status &status) { if (status.ok()) return; LogPrintf("%s\n", status.ToString()); @@ -70,7 +68,7 @@ CLevelDBWrapper::~CLevelDBWrapper() { options.env = nullptr; } -bool CLevelDBWrapper::WriteBatch(CLevelDBBatch &batch, bool fSync) throw(leveldb_error) { +bool CLevelDBWrapper::WriteBatch(CLevelDBBatch &batch, bool fSync) { leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch); HandleError(status); return true; diff --git a/src/leveldbwrapper.h b/src/leveldbwrapper.h index 10a778e..4cf54b2 100644 --- a/src/leveldbwrapper.h +++ b/src/leveldbwrapper.h @@ -19,9 +19,8 @@ class leveldb_error : public std::runtime_error leveldb_error(const std::string &msg) : std::runtime_error(msg) {} }; -void HandleError(const leveldb::Status &status) throw(leveldb_error); +void HandleError(const leveldb::Status &status); -// Batch of changes queued to be written to a CLevelDBWrapper class CLevelDBBatch { friend class CLevelDBWrapper; @@ -82,7 +81,7 @@ class CLevelDBWrapper CLevelDBWrapper(const boost::filesystem::path &path, size_t nCacheSize, bool fMemory = false, bool fWipe = false); ~CLevelDBWrapper(); - template bool Read(const K& key, V& value) throw(leveldb_error) { + template bool Read(const K& key, V& value) { CDataStream ssKey(SER_DISK, CLIENT_VERSION); ssKey.reserve(ssKey.GetSerializeSize(key)); ssKey << key; @@ -92,7 +91,6 @@ class CLevelDBWrapper leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); if (!status.ok()) { if (status.IsNotFound()){ - //printf("Not found\n"); return false; } LogPrintf("LevelDB read failure: %s\n", status.ToString().c_str()); @@ -101,20 +99,19 @@ class CLevelDBWrapper try { CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); ssValue >> value; - } catch(std::exception &e) { - //printf("Exception\n"); + } catch(const std::exception &e) { return false; } return true; } - template bool Write(const K& key, const V& value, bool fSync = false) throw(leveldb_error) { + template bool Write(const K& key, const V& value, bool fSync = false) { CLevelDBBatch batch; batch.Write(key, value); return WriteBatch(batch, fSync); } - template bool Exists(const K& key) throw(leveldb_error) { + template bool Exists(const K& key) { CDataStream ssKey(SER_DISK, CLIENT_VERSION); ssKey.reserve(ssKey.GetSerializeSize(key)); ssKey << key; @@ -131,20 +128,20 @@ class CLevelDBWrapper return true; } - template bool Erase(const K& key, bool fSync = false) throw(leveldb_error) { + template bool Erase(const K& key, bool fSync = false) { CLevelDBBatch batch; batch.Erase(key); return WriteBatch(batch, fSync); } - bool WriteBatch(CLevelDBBatch &batch, bool fSync = false) throw(leveldb_error); + bool WriteBatch(CLevelDBBatch &batch, bool fSync = false); // not available for LevelDB; provide for compatibility with BDB bool Flush() { return true; } - bool Sync() throw(leveldb_error) { + bool Sync() { CLevelDBBatch batch; return WriteBatch(batch, true); } diff --git a/src/main.cpp b/src/main.cpp index 13f94c5..6cbc074 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,9 @@ #include +#include + +namespace fs = boost::filesystem; using namespace std; using namespace boost; @@ -97,10 +100,9 @@ static std::map mapUnindexed; const string strMessageMagic = "Cryptonite Signed Message:\n"; // Internal stuff -namespace { struct CBlockIndexWorkComparator { - bool operator()(CBlockIndex *pa, CBlockIndex *pb) { + bool operator()(CBlockIndex *pa, CBlockIndex *pb) const { // First sort by most total work, ... if (pa->nChainWork > pb->nChainWork) return false; if (pa->nChainWork < pb->nChainWork) return true; @@ -132,7 +134,6 @@ void printAffairs(){ printf("validSize: %ld\n", setBlockIndexValid.size()); } - CCriticalSection cs_LastBlockFile; CBlockFileInfo infoLastBlockFile; int nLastBlockFile = 0; @@ -147,12 +148,9 @@ uint32_t nBlockSequenceId = 1; // them, if processing happens afterwards. Protected by cs_main. map mapBlockSource; -} - /** Show progress e.g. for load */ boost::signals2::signal ShowProgress; - ////////////////////////////////////////////////////////////////////////////// // // dispatching functions @@ -160,39 +158,44 @@ boost::signals2::signal ShowProg // These functions dispatch to one or all registered wallets +std::map connectionMap; + namespace { struct CMainSignals { - // Notifies listeners of updated transaction data (passing hash, transaction, and optionally the block it is found in. boost::signals2::signal SyncTransaction; - // Notifies listeners of an erased transaction (currently disabled, requires transaction replacement). boost::signals2::signal EraseTransaction; - // Notifies listeners of an updated transaction without new data (for now: a coinbase potentially becoming visible). boost::signals2::signal UpdatedTransaction; - // Notifies listeners of a new active block chain. boost::signals2::signal SetBestChain; - // Notifies listeners about an inventory item being seen on the network. boost::signals2::signal Inventory; - // Tells listeners to broadcast their data. boost::signals2::signal Broadcast; } g_signals; } void RegisterWallet(CWalletInterface* pwalletIn) { - g_signals.SyncTransaction.connect(boost::bind(&CWalletInterface::SyncTransaction, pwalletIn, _1, _2, _3)); - g_signals.EraseTransaction.connect(boost::bind(&CWalletInterface::EraseFromWallet, pwalletIn, _1)); - g_signals.UpdatedTransaction.connect(boost::bind(&CWalletInterface::UpdatedTransaction, pwalletIn, _1)); - g_signals.SetBestChain.connect(boost::bind(&CWalletInterface::SetBestChain, pwalletIn, _1)); - g_signals.Inventory.connect(boost::bind(&CWalletInterface::Inventory, pwalletIn, _1)); - g_signals.Broadcast.connect(boost::bind(&CWalletInterface::ResendWalletTransactions, pwalletIn)); + connectionMap[pwalletIn] = g_signals.SyncTransaction.connect([=](const uint256 &hash, const CTransaction &tx, const CBlock *pblock) { + pwalletIn->SyncTransaction(hash, tx, pblock); + }); + g_signals.EraseTransaction.connect([=](const uint256 &hash) { + pwalletIn->EraseFromWallet(hash); + }); + g_signals.UpdatedTransaction.connect([=](const uint256 &hash) { + pwalletIn->UpdatedTransaction(hash); + }); + g_signals.SetBestChain.connect([=](const CBlockLocator &locator) { + pwalletIn->SetBestChain(locator); + }); + g_signals.Inventory.connect([=](const uint256 &hash) { + pwalletIn->Inventory(hash); + }); + g_signals.Broadcast.connect([=]() { + pwalletIn->ResendWalletTransactions(); + }); } void UnregisterWallet(CWalletInterface* pwalletIn) { - g_signals.Broadcast.disconnect(boost::bind(&CWalletInterface::ResendWalletTransactions, pwalletIn)); - g_signals.Inventory.disconnect(boost::bind(&CWalletInterface::Inventory, pwalletIn, _1)); - g_signals.SetBestChain.disconnect(boost::bind(&CWalletInterface::SetBestChain, pwalletIn, _1)); - g_signals.UpdatedTransaction.disconnect(boost::bind(&CWalletInterface::UpdatedTransaction, pwalletIn, _1)); - g_signals.EraseTransaction.disconnect(boost::bind(&CWalletInterface::EraseFromWallet, pwalletIn, _1)); - g_signals.SyncTransaction.disconnect(boost::bind(&CWalletInterface::SyncTransaction, pwalletIn, _1, _2, _3)); + connectionMap[pwalletIn].disconnect(); + // No lambdas should be passed to disconnect(). + // Just call disconnect on the connection } void UnregisterAllWallets() { @@ -208,6 +211,7 @@ void SyncWithWallets(const uint256 &hash, const CTransaction &tx, const CBlock * g_signals.SyncTransaction(hash, tx, pblock); } + ////////////////////////////////////////////////////////////////////////////// // // Registration of network node signals. @@ -1013,7 +1017,7 @@ void SystemResync(bool restart){ int64_t oldPid = GetArg("-pid",0LL); //Impossible to check for exit via pid, so use lock - boost::filesystem::path pathLockFile = GetDataDir() / ".lock"; + fs::path pathLockFile = GetDataDir() / ".lock"; static boost::interprocess::file_lock lock(pathLockFile.string().c_str()); while(!lock.try_lock()){ MilliSleep(1000); @@ -2536,7 +2540,7 @@ bool AbortNode(const std::string &strMessage) { bool CheckDiskSpace(uint64_t nAdditionalBytes) { - uint64_t nFreeBytesAvailable = filesystem::space(GetDataDir()).available; + uint64_t nFreeBytesAvailable = fs::space(GetDataDir()).available; // Check for nMinDiskSpace bytes (currently 50MB) if (nFreeBytesAvailable < nMinDiskSpace + nAdditionalBytes) @@ -2549,8 +2553,8 @@ FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) { if (pos.IsNull()) return nullptr; - boost::filesystem::path path = GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile); - boost::filesystem::create_directories(path.parent_path()); + fs::path path = GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile); + fs::create_directories(path.parent_path()); FILE* file = fopen(path.string().c_str(), "rb+"); if (!file && !fReadOnly) file = fopen(path.string().c_str(), "wb+"); diff --git a/src/qt/Makefile.am b/src/qt/Makefile.am index 434b4d7..1e711a0 100644 --- a/src/qt/Makefile.am +++ b/src/qt/Makefile.am @@ -5,7 +5,7 @@ AM_CPPFLAGS += -I$(top_srcdir)/src \ -I$(top_builddir)/src/qt/forms \ $(PROTOBUF_CFLAGS) \ $(QR_CFLAGS) \ - -fpermissive -ffloat-store -std=c++11 -DQT_NO_KEYWORDS -D__STDC_LIMIT_MACROS -D__USE_MINGW_ANSI_STDIO + -fpermissive -ffloat-store -std=c++17 -DQT_NO_KEYWORDS -D__STDC_LIMIT_MACROS -D__USE_MINGW_ANSI_STDIO bin_PROGRAMS = cryptonite-qt noinst_LIBRARIES = libcryptoniteqt.a SUBDIRS = . diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp index fac4fd9..cc0a389 100644 --- a/src/qt/addresstablemodel.cpp +++ b/src/qt/addresstablemodel.cpp @@ -87,8 +87,8 @@ class AddressTablePriv QString::fromStdString(item.second.purpose), fMine); const std::string& strName = item.second.name; cachedAddressTable.append(AddressTableEntry(addressType, - QString::fromStdString(strName), - QString::fromStdString(address.ToString()))); + QString::fromStdString(strName), + QString::fromStdString(address.ToString()))); } } // qLowerBound() and qUpperBound() require our cachedAddressTable list to be sorted in asc order diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 2c0bbbf..93d3809 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -13,6 +13,7 @@ #include "guiutil.h" #include "intro.h" #include "optionsmodel.h" +#include "scheduler.h" #include "splashscreen.h" #include "utilitydialog.h" #ifdef ENABLE_WALLET @@ -46,13 +47,6 @@ #if defined(QT_STATICPLUGIN) #include -#if QT_VERSION < 0x050000 -Q_IMPORT_PLUGIN(qcncodecs) -Q_IMPORT_PLUGIN(qjpcodecs) -Q_IMPORT_PLUGIN(qtwcodecs) -Q_IMPORT_PLUGIN(qkrcodecs) -Q_IMPORT_PLUGIN(qtaccessiblewidgets) -#else #if QT_VERSION < 0x050400 Q_IMPORT_PLUGIN(AccessibleFactory) Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) @@ -67,8 +61,9 @@ Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QXcbIntegrationPlugin); #endif -#if QT_VERSION < 0x050000 -#include +#if defined(QT_QPA_PLATFORM_XCB) +#include +Q_IMPORT_PLUGIN(QXcbIntegrationPlugin); #endif // Declare meta types used for QMetaObject::invokeMethod diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index e230097..2ca8499 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -29,6 +29,8 @@ #include +#include + #include #include #include @@ -57,6 +59,8 @@ #include #endif +using namespace boost::placeholders; + const QString BitcoinGUI::DEFAULT_WALLET = "~Default"; BitcoinGUI::BitcoinGUI(bool fIsTestnet, QWidget *parent) : diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index d160807..d8ff24a 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -3,7 +3,6 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "clientmodel.h" - #include "guiconstants.h" #include "peertablemodel.h" @@ -14,12 +13,16 @@ #include "net.h" #include "ui_interface.h" +#include + #include #include #include #include +using namespace boost::placeholders; + static const int64_t nClientStartupTime = GetTime(); ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) : diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index 67c4081..0d4677a 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -26,6 +26,7 @@ #include using namespace std; + QList CoinControlDialog::payAmounts; CoinControlDialog::CoinControlDialog(QWidget *parent) : @@ -649,7 +650,7 @@ void CoinControlDialog::updateView() map > mapCoins; model->listCoins(mapCoins); - for (std::pair> coins : mapCoins) + for (std::pair> coins : mapCoins) { QTreeWidgetItem *itemWalletAddress = new QTreeWidgetItem(); itemWalletAddress->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked); diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 9911f89..a18203f 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -16,21 +16,10 @@ #include "util.h" #ifdef WIN32 -#ifdef _WIN32_WINNT -#undef _WIN32_WINNT -#endif -#define _WIN32_WINNT 0x0501 -#ifdef _WIN32_IE -#undef _WIN32_IE -#endif -#define _WIN32_IE 0x0501 -#define WIN32_LEAN_AND_MEAN 1 -#ifndef NOMINMAX #define NOMINMAX -#endif +#define WIN32_LEAN_AND_MEAN + #include "shellapi.h" -#include "shlobj.h" -#include "shlwapi.h" #endif #include @@ -43,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -496,70 +486,43 @@ TableViewLastColumnResizingFixer::TableViewLastColumnResizingFixer(QTableView* t } #ifdef WIN32 +QString static StartupRegistryPath() +{ + return "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"; +} + +QString static StartupRegistryKey() +{ + return "Cryptonite"; +} + boost::filesystem::path static StartupShortcutPath() { - return GetSpecialFolderPath(CSIDL_STARTUP) / "Bitcoin.lnk"; + return StartupRegistryPath().toStdString() + "\\" + StartupRegistryKey().toStdString(); } bool GetStartOnSystemStartup() { - // check for Bitcoin.lnk - return boost::filesystem::exists(StartupShortcutPath()); + QSettings registry(StartupRegistryPath(), QSettings::NativeFormat); + return registry.contains(StartupRegistryKey()); } bool SetStartOnSystemStartup(bool fAutoStart) { - // If the shortcut exists already, remove it for updating - boost::filesystem::remove(StartupShortcutPath()); + QSettings registry(StartupRegistryPath(), QSettings::NativeFormat); if (fAutoStart) { - CoInitialize(nullptr); - - // Get a pointer to the IShellLink interface. - IShellLink* psl = nullptr; - HRESULT hres = CoCreateInstance(CLSID_ShellLink, nullptr, - CLSCTX_INPROC_SERVER, IID_IShellLink, - reinterpret_cast(&psl)); - - if (SUCCEEDED(hres)) - { - // Get the current executable path - TCHAR pszExePath[MAX_PATH]; - GetModuleFileName(nullptr, pszExePath, sizeof(pszExePath)); - - TCHAR pszArgs[5] = TEXT("-min"); - - // Set the path to the shortcut target - psl->SetPath(pszExePath); - PathRemoveFileSpec(pszExePath); - psl->SetWorkingDirectory(pszExePath); - psl->SetShowCmd(SW_SHOWMINNOACTIVE); - psl->SetArguments(pszArgs); - - // Query IShellLink for the IPersistFile interface for - // saving the shortcut in persistent storage. - IPersistFile* ppf = nullptr; - hres = psl->QueryInterface(IID_IPersistFile, - reinterpret_cast(&ppf)); - if (SUCCEEDED(hres)) - { - WCHAR pwsz[MAX_PATH]; - // Ensure that the string is ANSI. - MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().string().c_str(), -1, pwsz, MAX_PATH); - // Save the link by calling IPersistFile::Save. - hres = ppf->Save(pwsz, TRUE); - ppf->Release(); - psl->Release(); - CoUninitialize(); - return true; - } - psl->Release(); - } - CoUninitialize(); - return false; + QString appPath = QCoreApplication::applicationFilePath(); + appPath = QDir::toNativeSeparators(appPath); + registry.setValue(StartupRegistryKey(), appPath + " -min"); } - return true; + else + { + registry.remove(StartupRegistryKey()); + } + + return fAutoStart == GetStartOnSystemStartup(); } #elif defined(Q_OS_LINUX) diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp index d4cc862..f3bfc1c 100644 --- a/src/qt/receivecoinsdialog.cpp +++ b/src/qt/receivecoinsdialog.cpp @@ -180,7 +180,8 @@ void ReceiveCoinsDialog::on_showRequestButton_clicked() return; QModelIndexList selection = ui->recentRequestsView->selectionModel()->selectedRows(); - for (const QModelIndex& index : selection) { + for (const QModelIndex& index : selection) + { on_recentRequestsView_doubleClicked(index); } } diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp index 83525c8..de79707 100644 --- a/src/qt/receiverequestdialog.cpp +++ b/src/qt/receiverequestdialog.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #if QT_VERSION < 0x050000 #include @@ -34,10 +35,11 @@ QRImageWidget::QRImageWidget(QWidget *parent): setContextMenuPolicy(Qt::ActionsContextMenu); QAction *saveImageAction = new QAction(tr("&Save Image..."), this); - connect(saveImageAction, SIGNAL(triggered()), this, SLOT(saveImage())); + connect(saveImageAction, &QAction::triggered, this, &QRImageWidget::saveImage); addAction(saveImageAction); + QAction *copyImageAction = new QAction(tr("&Copy Image"), this); - connect(copyImageAction, SIGNAL(triggered()), this, SLOT(copyImage())); + connect(copyImageAction, &QAction::triggered, this, &QRImageWidget::copyImage); addAction(copyImageAction); } diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index a2a516a..819c7db 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -354,7 +354,7 @@ void RPCConsole::clear() ui->messagesWidget->document()->setDefaultStyleSheet( "table { }" "td.time { color: #808080; padding-top: 3px; } " - "td.message { font-family: monospace; font-size: 12px; } " // Todo: Remove fixed font-size + "td.message { font-family: monospace; } " "td.cmd-request { color: #006060; } " "td.cmd-error { color: red; } " "b { color: #006060; } " diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp index 3e2364e..64aaf74 100644 --- a/src/qt/splashscreen.cpp +++ b/src/qt/splashscreen.cpp @@ -12,6 +12,9 @@ #include "wallet.h" #endif +#include +using namespace boost::placeholders; + #include #include #include diff --git a/src/qt/test/Makefile.am b/src/qt/test/Makefile.am index a7005fa..10ac125 100644 --- a/src/qt/test/Makefile.am +++ b/src/qt/test/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/src/Makefile.include -AM_CPPFLAGS += -I$(top_srcdir)/src -std=c++11 -D__STDC_LIMIT_MACROS \ +AM_CPPFLAGS += -I$(top_srcdir)/src -std=c++17 -D__STDC_LIMIT_MACROS \ -I$(top_srcdir)/src/qt \ -I$(top_builddir)/src/qt \ $(PROTOBUF_CFLAGS) \ diff --git a/src/qt/trafficgraphwidget.cpp b/src/qt/trafficgraphwidget.cpp index 836d296..8bd5fb5 100644 --- a/src/qt/trafficgraphwidget.cpp +++ b/src/qt/trafficgraphwidget.cpp @@ -6,6 +6,7 @@ #include "clientmodel.h" #include +#include #include #include diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 259ebb0..55c379b 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -20,10 +20,16 @@ #include +#include +#include +#include + #include #include #include +using namespace boost::placeholders; + WalletModel::WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent) : QObject(parent), wallet(wallet), optionsModel(optionsModel), addressTableModel(0), transactionTableModel(0), @@ -579,11 +585,18 @@ void WalletModel::loadReceiveRequests(std::vector& vReceiveRequests { LOCK(wallet->cs_wallet); for (const std::pair& item : wallet->mapAddressBook) + { for (const std::pair& item2 : item.second.destdata) - if (item2.first.size() > 2 && item2.first.substr(0,2) == "rr") // receive request + { + if (item2.first.size() > 2 && item2.first.substr(0,2) == "rr") // receive request + { vReceiveRequests.push_back(item2.second); + } + } + } } + bool WalletModel::saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest) { CTxDestination dest = CBitcoinAddress(sAddress).Get(); diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 9846c88..fffdc6e 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include @@ -26,6 +26,7 @@ using namespace std; using namespace boost; using namespace boost::asio; +using namespace boost::placeholders; using namespace json_spirit; Object CallRPC(const string& strMethod, const Array& params) diff --git a/src/rpcprotocol.cpp b/src/rpcprotocol.cpp index 82f5270..0cbf9e2 100644 --- a/src/rpcprotocol.cpp +++ b/src/rpcprotocol.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -23,6 +23,7 @@ using namespace std; using namespace boost; using namespace boost::asio; +using namespace boost::placeholders; using namespace json_spirit; // diff --git a/src/rpcprotocol.h b/src/rpcprotocol.h index 8b3df19..07cbd3c 100644 --- a/src/rpcprotocol.h +++ b/src/rpcprotocol.h @@ -103,7 +103,7 @@ class SSLIOStreamDevice : public boost::iostreams::device #include #include -#include +#include #include #include #include #include #include "json/json_spirit_writer_template.h" +namespace fs = boost::filesystem; using namespace std; using namespace boost; using namespace boost::asio; +using namespace boost::placeholders; using namespace json_spirit; static std::string strRPCUserColonPass; @@ -489,10 +491,10 @@ class AcceptedConnectionImpl : public AcceptedConnection { public: AcceptedConnectionImpl( - asio::io_service& io_service, + asio::any_io_executor executor, ssl::context &context, bool fUseSSL) : - sslStream(io_service, context), + sslStream(executor, context), _d(sslStream, fUseSSL), _stream(_d) { @@ -539,8 +541,8 @@ static void RPCListen(boost::shared_ptr< basic_socket_acceptor* conn = new AcceptedConnectionImpl(acceptor->get_io_service(), context, fUseSSL); + // Pass the executor instead of the io_service + AcceptedConnectionImpl* conn = new AcceptedConnectionImpl(acceptor->get_executor(), context, fUseSSL); acceptor->async_accept( conn->sslStream.lowest_layer(), @@ -639,14 +641,14 @@ void StartRPCThreads() { rpc_ssl_context->set_options(ssl::context::no_sslv2); - filesystem::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert")); - if (!pathCertFile.is_complete()) pathCertFile = filesystem::path(GetDataDir()) / pathCertFile; - if (filesystem::exists(pathCertFile)) rpc_ssl_context->use_certificate_chain_file(pathCertFile.string()); + fs::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert")); + if (!pathCertFile.is_complete()) pathCertFile = fs::path(GetDataDir()) / pathCertFile; + if (fs::exists(pathCertFile)) rpc_ssl_context->use_certificate_chain_file(pathCertFile.string()); else LogPrintf("ThreadRPCServer ERROR: missing server certificate file %s\n", pathCertFile.string()); - filesystem::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem")); - if (!pathPKFile.is_complete()) pathPKFile = filesystem::path(GetDataDir()) / pathPKFile; - if (filesystem::exists(pathPKFile)) rpc_ssl_context->use_private_key_file(pathPKFile.string(), ssl::context::pem); + fs::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem")); + if (!pathPKFile.is_complete()) pathPKFile = fs::path(GetDataDir()) / pathPKFile; + if (fs::exists(pathPKFile)) rpc_ssl_context->use_private_key_file(pathPKFile.string(), ssl::context::pem); else LogPrintf("ThreadRPCServer ERROR: missing server private key file %s\n", pathPKFile.string()); string strCiphers = GetArg("-rpcsslciphers", "TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH"); diff --git a/src/scheduler.cpp b/src/scheduler.cpp index c559c0c..d3b9c2f 100644 --- a/src/scheduler.cpp +++ b/src/scheduler.cpp @@ -5,9 +5,11 @@ #include "scheduler.h" #include -#include +#include #include +using namespace boost::placeholders; + CScheduler::CScheduler() : nThreadsServicingQueue(0), stopRequested(false), stopWhenEmpty(false) { } diff --git a/src/test/Makefile.am b/src/test/Makefile.am index e2f60a8..96c97b5 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/src/Makefile.include -AM_CPPFLAGS += -I$(top_srcdir)/src -std=c++11 -fpermissive -ffloat-store -D__STDC_LIMIT_MACROS +AM_CPPFLAGS += -I$(top_srcdir)/src -std=c++17 -fpermissive -ffloat-store -D__STDC_LIMIT_MACROS bin_PROGRAMS = test_bitcoin diff --git a/src/util.cpp b/src/util.cpp index 1a94609..9919e0f 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -14,6 +14,8 @@ #include +#include + #ifndef WIN32 // for posix_fallocate #ifdef __linux_ @@ -58,7 +60,9 @@ #endif #include /* for _commit */ -#include +// #include "shlobj.h" +#define CSIDL_APPDATA 0x001a + #endif #include // for to_lower() @@ -82,7 +86,6 @@ namespace boost { } } - using namespace std; map mapArgs; @@ -974,7 +977,7 @@ boost::filesystem::path GetDefaultDataDir() // Unix: ~/.bitcoin #ifdef WIN32 // Windows - return GetSpecialFolderPath(CSIDL_APPDATA) / "Cryptonite"; + return boost::filesystem::path(getenv("APPDATA")) / "Cryptonite"; #else fs::path pathRet; char* pszHome = getenv("HOME"); @@ -1367,19 +1370,30 @@ std::string FormatSubVersion(const std::string& name, int nClientVersion, const } #ifdef WIN32 -boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate) +boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true) { namespace fs = boost::filesystem; - char pszPath[MAX_PATH] = ""; - if(SHGetSpecialFolderPathA(nullptr, pszPath, nFolder, fCreate)) - { - return fs::path(pszPath); + const char* pPath = nullptr; + if (nFolder == CSIDL_APPDATA) { + pPath = getenv("APPDATA"); } + // Add other special folders here as needed... + + if (pPath != nullptr) { + strncpy(pszPath, pPath, sizeof(pszPath)); + pszPath[sizeof(pszPath) - 1] = '\0'; + } else { + LogPrintf("getenv() failed, could not obtain requested path.\n"); + return fs::path(""); + } + + fs::path pathRet = fs::path(pszPath); + if(fCreate && !fs::exists(pathRet)) + fs::create_directory(pathRet); - LogPrintf("SHGetSpecialFolderPathA() failed, could not obtain requested path.\n"); - return fs::path(""); + return pathRet; } #endif diff --git a/src/walletdb.cpp b/src/walletdb.cpp index 30b69cb..001e403 100644 --- a/src/walletdb.cpp +++ b/src/walletdb.cpp @@ -13,6 +13,7 @@ #include +namespace fs = boost::filesystem; using namespace std; using namespace boost; @@ -817,20 +818,20 @@ bool BackupWallet(const CWallet& wallet, const string& strDest) bitdb.mapFileUseCount.erase(wallet.strWalletFile); // Copy wallet.dat - filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile; - filesystem::path pathDest(strDest); - if (filesystem::is_directory(pathDest)) + fs::path pathSrc = GetDataDir() / wallet.strWalletFile; + fs::path pathDest(strDest); + if (fs::is_directory(pathDest)) pathDest /= wallet.strWalletFile; try { #if BOOST_VERSION >= 104000 - filesystem::copy_file(pathSrc, pathDest, filesystem::copy_option::overwrite_if_exists); + fs::copy_file(pathSrc, pathDest, fs::copy_option::overwrite_if_exists); #else - filesystem::copy_file(pathSrc, pathDest); + fs::copy_file(pathSrc, pathDest); #endif LogPrintf("copied wallet.dat to %s\n", pathDest.string()); return true; - } catch(const filesystem::filesystem_error &e) { + } catch(const fs::filesystem_error &e) { LogPrintf("error copying wallet.dat to %s - %s\n", pathDest.string(), e.what()); return false; } From d4745d50c0a5f96b3ab3a080ed8615f6fd2ec880 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Sun, 3 Sep 2023 16:05:31 +1000 Subject: [PATCH 02/22] Remove stray #endif --- src/qt/bitcoin.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 93d3809..e165401 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -54,7 +54,6 @@ Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) #endif #endif -#endif #if defined(QT_QPA_PLATFORM_XCB) #include From 164db3e29289332cad38674e1538a9fd8e7f5ee5 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Tue, 12 Sep 2023 18:32:28 +1000 Subject: [PATCH 03/22] Update configure.ac to check for opengl --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index c0e625f..672c3cf 100644 --- a/configure.ac +++ b/configure.ac @@ -208,6 +208,7 @@ case $host in AC_CHECK_LIB([pcre2-16], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([wtsapi32], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([zstd], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([opengl32], [main],, AC_MSG_ERROR(lib missing)) AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"]) AX_CHECK_LINK_FLAG([[-static-libgcc]],[LDFLAGS="$LDFLAGS -static-libgcc"]) From 8ad80a6ff7f6ad8703aac3b61647602625e42f8f Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Thu, 12 Oct 2023 22:51:41 +1000 Subject: [PATCH 04/22] Clean up Includes, Qt Feature Settings , Progress Bar. --- src/qt/bitcoin.cpp | 40 +++++++++++----------------------------- src/qt/bitcoingui.cpp | 38 ++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index e165401..a40a3bb 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -7,7 +7,6 @@ #endif #include "bitcoingui.h" - #include "clientmodel.h" #include "guiconstants.h" #include "guiutil.h" @@ -16,6 +15,7 @@ #include "scheduler.h" #include "splashscreen.h" #include "utilitydialog.h" + #ifdef ENABLE_WALLET #include "paymentserver.h" #include "walletmodel.h" @@ -27,13 +27,13 @@ #include "scheduler.h" #include "ui_interface.h" #include "util.h" + #ifdef ENABLE_WALLET #include "wallet.h" #endif #include #include - #include #include #include @@ -41,23 +41,13 @@ #include #include #include +#include #include #include -#include #if defined(QT_STATICPLUGIN) #include -#if QT_VERSION < 0x050400 -Q_IMPORT_PLUGIN(AccessibleFactory) Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) -#else -Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) -#endif -#endif - -#if defined(QT_QPA_PLATFORM_XCB) -#include -Q_IMPORT_PLUGIN(QXcbIntegrationPlugin); #endif #if defined(QT_QPA_PLATFORM_XCB) @@ -470,25 +460,17 @@ int main(int argc, char *argv[]) // Do not refer to data directory yet, this can be overridden by Intro::pickDataDirectory - /// 2. Basic Qt initialization (not dependent on parameters or configuration) -#if QT_VERSION < 0x050000 - // Internal string conversion is all UTF-8 - QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); - QTextCodec::setCodecForCStrings(QTextCodec::codecForTr()); -#endif + // Enable high-dpi features + QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + #ifdef Q_OS_MAC + QApplication::setAttribute(Qt::AA_DontShowIconsInMenus); + #endif + + /// 2. Basic Qt initialization (not dependent on parameters or configuration) Q_INIT_RESOURCE(bitcoin); BitcoinApplication app(argc, argv); -#if QT_VERSION > 0x050100 - // Generate high-dpi pixmaps - QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); -#endif -#if QT_VERSION >= 0x050600 - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); -#endif -#ifdef Q_OS_MAC - QApplication::setAttribute(Qt::AA_DontShowIconsInMenus); -#endif // Register meta types used for QMetaObject::invokeMethod qRegisterMetaType< bool* >(); diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 2ca8499..f70a1e9 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -3,17 +3,20 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "bitcoingui.h" - #include "bitcoinunits.h" #include "clientmodel.h" +#include "core.h" #include "guiconstants.h" #include "guiutil.h" +#include "init.h" #include "notificator.h" #include "openuridialog.h" #include "optionsdialog.h" #include "optionsmodel.h" #include "rpcconsole.h" #include "utilitydialog.h" +#include "ui_interface.h" + #ifdef ENABLE_WALLET #include "walletframe.h" #include "walletmodel.h" @@ -23,14 +26,9 @@ #include "macdockiconhandler.h" #endif -#include "init.h" -#include "ui_interface.h" -#include "core.h" - #include #include - #include #include #include @@ -51,13 +49,7 @@ #include #include #include - -#if QT_VERSION < 0x050000 -#include -#include -#else #include -#endif using namespace boost::placeholders; @@ -93,7 +85,6 @@ BitcoinGUI::BitcoinGUI(bool fIsTestnet, QWidget *parent) : darkPalette.setColor(QPalette::ButtonText, Qt::white); darkPalette.setColor(QPalette::BrightText, Qt::red); darkPalette.setColor(QPalette::Link, QColor(42, 130, 218)); - darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); darkPalette.setColor(QPalette::HighlightedText, Qt::black); @@ -202,13 +193,24 @@ BitcoinGUI::BitcoinGUI(bool fIsTestnet, QWidget *parent) : progressBar->setAlignment(Qt::AlignCenter); progressBar->setVisible(false); - // Override style sheet for progress bar for styles that have a segmented progress bar, - // as they make the text unreadable (workaround for issue #1071) - // See https://qt-project.org/doc/qt-4.8/gallery.html QString curStyle = QApplication::style()->metaObject()->className(); - if(curStyle == "QWindowsStyle" || curStyle == "QWindowsXPStyle") + + if (curStyle == "QWindowsStyle" || curStyle == "QWindowsXPStyle") { - progressBar->setStyleSheet("QProgressBar { background-color: #e8e8e8; border: 1px solid grey; border-radius: 7px; padding: 1px; text-align: center; } QProgressBar::chunk { background: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #FF8000, stop: 1 orange); border-radius: 7px; margin: 0px; }"); + QString progressBarStyleSheet = "QProgressBar {" + " background-color: #e8e8e8;" + " border: 1px solid grey;" + " border-radius: 7px;" + " padding: 1px;" + " text-align: center;" + "}" + "QProgressBar::chunk {" + " background: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #FF8000, stop: 1 orange);" + " border-radius: 7px;" + " margin: 0px;" + "}"; + + progressBar->setStyleSheet(progressBarStyleSheet); } statusBar()->addWidget(progressBarLabel); From 5382ec379dbc70922b8291cf14c042c7016fdfef Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Thu, 9 Nov 2023 14:13:34 +1100 Subject: [PATCH 05/22] Optimize LoadBlockIndexGuts - Reuse CDataStream objects inside the block index loading loop to minimize dynamic memory allocations. - Clear and reserve CDataStream buffers before writing to them, reducing the need for buffer resizing. - Restrict the try-catch block scope to only the deserialization process to decrease exception handling overhead. --- src/txdb.cpp | 87 ++++++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/src/txdb.cpp b/src/txdb.cpp index 37e3467..0f2284d 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -91,60 +91,59 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) { return true; } -bool CBlockTreeDB::LoadBlockIndexGuts() -{ - //printf("Load guts\n"); +bool CBlockTreeDB::LoadBlockIndexGuts() { leveldb::Iterator *pcursor = NewIterator(); - CDataStream ssKeySet(SER_DISK, CLIENT_VERSION); - ssKeySet << make_pair('b', uint256(0)); + CDataStream ssKeySet(SER_DISK, CLIENT_VERSION), ssKey(SER_DISK, CLIENT_VERSION), ssValue(SER_DISK, CLIENT_VERSION); + ssKeySet << std::make_pair('b', uint256(0)); pcursor->Seek(ssKeySet.str()); - // Load mapBlockIndex while (pcursor->Valid()) { boost::this_thread::interruption_point(); - try { - leveldb::Slice slKey = pcursor->key(); - CDataStream ssKey(slKey.data(), slKey.data()+slKey.size(), SER_DISK, CLIENT_VERSION); - char chType; - ssKey >> chType; - if (chType == 'b') { - leveldb::Slice slValue = pcursor->value(); - CDataStream ssValue(slValue.data(), slValue.data()+slValue.size(), SER_DISK, CLIENT_VERSION); - CDiskBlockIndex diskindex; + + // Reusing the streams by clearing them for new data + ssKey.clear(); + ssValue.clear(); + + leveldb::Slice slKey = pcursor->key(); + leveldb::Slice slValue = pcursor->value(); + + ssKey.reserve(slKey.size()); + ssKey.write(slKey.data(), slKey.size()); + char chType; + ssKey >> chType; + + if (chType == 'b') { + ssValue.reserve(slValue.size()); + ssValue.write(slValue.data(), slValue.size()); + CDiskBlockIndex diskindex; + + try { ssValue >> diskindex; + } catch (std::exception &e) { + delete pcursor; + return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what()); + } - if (!diskindex.CheckIndex()) { - error("LoadBlockIndex() : CheckIndex failed: %s", diskindex.GetBlockHash().ToString().c_str()); - printf("fail\n"); - pcursor->Next(); - continue; - } - - // Construct block index object - CBlockIndex* pindexNew = InsertBlockIndex(diskindex.GetBlockHash(), diskindex.GetBlockHeader()); - pindexNew->nFile = diskindex.nFile; - pindexNew->nDataPos = diskindex.nDataPos; - pindexNew->nUndoPos = diskindex.nUndoPos; - pindexNew->nStatus = diskindex.nStatus; - pindexNew->nTx = diskindex.nTx; - - //printf("%d %ld %ld %ld\n", diskindex.nVersion, diskindex.nHeight, diskindex.nNonce, diskindex.nTime); - //printf("%s %s\n", diskindex.hashMerkleRoot.GetHex().c_str(), diskindex.hashAccountRoot.GetHex().c_str()); - - //pindexNew->nHeight = 0; - //printf("Foo: %s\n", pindexNew->GetBlockHeader().GetHash().GetHex().c_str()); + if (!diskindex.CheckIndex()) { + error("LoadBlockIndex() : CheckIndex failed: %s", diskindex.GetBlockHash().ToString().c_str()); pcursor->Next(); - } else { - break; // if shutdown requested or finished loading block index + continue; + } + + CBlockIndex* pindexNew = InsertBlockIndex(diskindex.GetBlockHash(), diskindex.GetBlockHeader()); + if (pindexNew) { // Check for null pointer + pindexNew->nFile = diskindex.nFile; + pindexNew->nDataPos = diskindex.nDataPos; + pindexNew->nUndoPos = diskindex.nUndoPos; + pindexNew->nStatus = diskindex.nStatus; + pindexNew->nTx = diskindex.nTx; } - } catch (std::exception &e) { - return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what()); + } else { + break; // Finished loading block index } + pcursor->Next(); } - delete pcursor; - - //now that all blocks are loaded it is possible to actually verify proof of work. - //which is done by caller - + + delete pcursor; // Always free resources return true; } From 6e793dbb6cee7612eaa2d45c58c07df469e47a7a Mon Sep 17 00:00:00 2001 From: e-nexus Date: Sun, 12 Nov 2023 20:36:45 +1000 Subject: [PATCH 06/22] Remove unused references to Qt 4 --- src/qt/addressbookpage.cpp | 5 ----- src/qt/bitcoin.cpp | 15 +++----------- src/qt/bitcoingui.cpp | 10 --------- src/qt/coincontroldialog.cpp | 8 +------- src/qt/guiutil.cpp | 33 ++---------------------------- src/qt/macdockiconhandler.mm | 7 ------- src/qt/openuridialog.cpp | 2 -- src/qt/optionsdialog.cpp | 10 --------- src/qt/paymentrequestplus.cpp | 2 -- src/qt/paymentserver.cpp | 14 +++---------- src/qt/peertablemodel.cpp | 3 +-- src/qt/receiverequestdialog.cpp | 3 --- src/qt/rpcconsole.cpp | 4 ---- src/qt/sendcoinsdialog.cpp | 2 -- src/qt/sendcoinsentry.cpp | 4 ++-- src/qt/signverifymessagedialog.cpp | 3 --- src/qt/test/test_main.cpp | 8 -------- src/qt/transactionview.cpp | 6 ++---- 18 files changed, 14 insertions(+), 125 deletions(-) diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp index 942aec0..380c668 100644 --- a/src/qt/addressbookpage.cpp +++ b/src/qt/addressbookpage.cpp @@ -129,13 +129,8 @@ void AddressBookPage::setModel(AddressTableModel *model) ui->tableView->sortByColumn(0, Qt::AscendingOrder); // Set column widths -#if QT_VERSION < 0x050000 - ui->tableView->horizontalHeader()->setResizeMode(AddressTableModel::Label, QHeaderView::Stretch); - ui->tableView->horizontalHeader()->setResizeMode(AddressTableModel::Address, QHeaderView::ResizeToContents); -#else ui->tableView->horizontalHeader()->setSectionResizeMode(AddressTableModel::Label, QHeaderView::Stretch); ui->tableView->horizontalHeader()->setSectionResizeMode(AddressTableModel::Address, QHeaderView::ResizeToContents); -#endif connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged())); diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index a40a3bb..c9a94f5 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -118,20 +118,12 @@ static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTrans } /* qDebug() message handler --> debug.log */ -#if QT_VERSION < 0x050000 -void DebugMessageHandler(QtMsgType type, const char *msg) -{ - Q_UNUSED(type); - LogPrint("qt", "GUI: %s\n", msg); -} -#else void DebugMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &msg) { Q_UNUSED(type); Q_UNUSED(context); LogPrint("qt", "GUI: %s\n", qPrintable(msg)); } -#endif /** Class encapsulating Bitcoin Core startup and shutdown. * Allows running startup and shutdown in a different thread from the UI thread. @@ -558,14 +550,13 @@ int main(int argc, char *argv[]) #endif /// 9. Main GUI initialization + // Install global event filter that makes sure that long tooltips can be word-wrapped app.installEventFilter(new GUIUtil::ToolTipToRichTextFilter(TOOLTIP_WRAP_THRESHOLD, &app)); + // Install qDebug() message handler to route to debug.log -#if QT_VERSION < 0x050000 - qInstallMsgHandler(DebugMessageHandler); -#else qInstallMessageHandler(DebugMessageHandler); -#endif + // Load GUI settings from QSettings app.createOptionsModel(); diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index f70a1e9..f56abdf 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -127,12 +127,6 @@ BitcoinGUI::BitcoinGUI(bool fIsTestnet, QWidget *parent) : } setWindowTitle(windowTitle); -#if defined(Q_OS_MAC) && QT_VERSION < 0x050000 - // This property is not implemented in Qt 5. Setting it has no effect. - // A replacement API (QtMacUnifiedToolBar) is available in QtMacExtras. - setUnifiedTitleAndToolBarOnMac(true); -#endif - rpcConsole = new RPCConsole(0); #ifdef ENABLE_WALLET if(enableWallet) @@ -301,11 +295,7 @@ void BitcoinGUI::createActions(bool fIsTestnet) aboutAction = new QAction(QIcon(":/icons/bitcoin_testnet"), tr("&About Cryptonite"), this); aboutAction->setStatusTip(tr("Show information about Cryptonite")); aboutAction->setMenuRole(QAction::AboutRole); -#if QT_VERSION < 0x050000 - aboutQtAction = new QAction(QIcon(":/trolltech/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); -#else aboutQtAction = new QAction(QIcon(":/qt-project.org/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); -#endif aboutQtAction->setStatusTip(tr("Show information about Qt")); aboutQtAction->setMenuRole(QAction::AboutQtRole); optionsAction = new QAction(QIcon(":/icons/options"), tr("&Options..."), this); diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index 0d4677a..6bfbc5a 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -99,11 +99,7 @@ CoinControlDialog::CoinControlDialog(QWidget *parent) : connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(viewItemChanged(QTreeWidgetItem*, int))); // click on header -#if QT_VERSION < 0x050000 - ui->treeWidget->header()->setClickable(true); -#else ui->treeWidget->header()->setSectionsClickable(true); -#endif connect(ui->treeWidget->header(), SIGNAL(sectionClicked(int)), this, SLOT(headerSectionClicked(int))); // ok button @@ -384,13 +380,11 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column) // including all childs are partially selected. But the parent node should be fully selected // as well as the childs. Childs should never be partially selected in the first place. // Please remove this ugly fix, once the bug is solved upstream. -#if QT_VERSION >= 0x050000 - else if (column == COLUMN_CHECKBOX && item->childCount() > 0) + if (column == COLUMN_CHECKBOX && item->childCount() > 0) { if (item->checkState(COLUMN_CHECKBOX) == Qt::PartiallyChecked && item->child(0)->checkState(COLUMN_CHECKBOX) == Qt::PartiallyChecked) item->setCheckState(COLUMN_CHECKBOX, Qt::Checked); } -#endif #else assert(0); #endif diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index a18203f..cfeb83d 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -42,12 +42,7 @@ #include #include // for Qt::mightBeRichText #include - -#if QT_VERSION < 0x050000 -#include -#else #include -#endif #if BOOST_FILESYSTEM_VERSION >= 3 static boost::filesystem::detail::utf8_codecvt_facet utf8; @@ -68,11 +63,7 @@ QString dateTimeStr(qint64 nTime) QFont bitcoinAddressFont() { QFont font("Monospace"); -#if QT_VERSION >= 0x040800 font.setStyleHint(QFont::Monospace); -#else - font.setStyleHint(QFont::TypeWriter); -#endif return font; } @@ -81,9 +72,7 @@ void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent) parent->setFocusProxy(widget); widget->setFont(bitcoinAddressFont()); -#if QT_VERSION >= 0x040700 widget->setPlaceholderText(QObject::tr("Enter a Cryptonite address (e.g. CNS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)")); -#endif widget->setValidator(new BitcoinAddressEntryValidator(parent)); widget->setCheckValidator(new BitcoinAddressCheckValidator(parent)); } @@ -107,12 +96,9 @@ bool parseBitcoinURI(const QUrl &uri, SendCoinsRecipient *out) rv.address = uri.path(); rv.amount = 0; -#if QT_VERSION < 0x050000 - QList > items = uri.queryItems(); -#else QUrlQuery uriQuery(uri); QList > items = uriQuery.queryItems(); -#endif + for (QList >::iterator i = items.begin(); i != items.end(); i++) { bool fShouldReturnFalse = false; @@ -192,11 +178,8 @@ bool isDust(const QString& address, qint64 amount) QString HtmlEscape(const QString& str, bool fMultiLine) { -#if QT_VERSION < 0x050000 - QString escaped = Qt::escape(str); -#else QString escaped = str.toHtmlEscaped(); -#endif + if(fMultiLine) { escaped = escaped.replace("\n", "
\n"); @@ -230,11 +213,7 @@ QString getSaveFileName(QWidget *parent, const QString &caption, const QString & QString myDir; if(dir.isEmpty()) // Default to user documents location { -#if QT_VERSION < 0x050000 - myDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); -#else myDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); -#endif } else { @@ -280,11 +259,7 @@ QString getOpenFileName(QWidget *parent, const QString &caption, const QString & QString myDir; if(dir.isEmpty()) // Default to user documents location { -#if QT_VERSION < 0x050000 - myDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); -#else myDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); -#endif } else { @@ -385,11 +360,7 @@ void TableViewLastColumnResizingFixer::disconnectViewHeadersSignals() // Refactored here for readability. void TableViewLastColumnResizingFixer::setViewHeaderResizeMode(int logicalIndex, QHeaderView::ResizeMode resizeMode) { -#if QT_VERSION < 0x050000 - tableView->horizontalHeader()->setResizeMode(logicalIndex, resizeMode); -#else tableView->horizontalHeader()->setSectionResizeMode(logicalIndex, resizeMode); -#endif } void TableViewLastColumnResizingFixer::resizeColumn(int nColumnIndex, int width) diff --git a/src/qt/macdockiconhandler.mm b/src/qt/macdockiconhandler.mm index 64291c9..83796bb 100644 --- a/src/qt/macdockiconhandler.mm +++ b/src/qt/macdockiconhandler.mm @@ -12,10 +12,6 @@ #undef slots #include -#if QT_VERSION < 0x050000 -extern void qt_mac_set_dock_menu(QMenu *); -#endif - @interface DockIconClickEventHandler : NSObject { MacDockIconHandler* dockIconHandler; @@ -60,9 +56,6 @@ - (void)handleDockClickEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAp this->m_dummyWidget = new QWidget(); this->m_dockMenu = new QMenu(this->m_dummyWidget); this->setMainWindow(NULL); -#if QT_VERSION < 0x050000 - qt_mac_set_dock_menu(this->m_dockMenu); -#endif [pool release]; } diff --git a/src/qt/openuridialog.cpp b/src/qt/openuridialog.cpp index ebd234c..5892caf 100644 --- a/src/qt/openuridialog.cpp +++ b/src/qt/openuridialog.cpp @@ -15,9 +15,7 @@ OpenURIDialog::OpenURIDialog(QWidget *parent) : ui(new Ui::OpenURIDialog) { ui->setupUi(this); -#if QT_VERSION >= 0x040700 ui->uriEdit->setPlaceholderText("cryptonite:"); -#endif } OpenURIDialog::~OpenURIDialog() diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index a938525..5b360bb 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -76,23 +76,13 @@ OptionsDialog::OptionsDialog(QWidget *parent) : /** check if the locale name consists of 2 parts (language_country) */ if(langStr.contains("_")) { -#if QT_VERSION >= 0x040800 /** display language strings as "native language - native country (locale name)", e.g. "Deutsch - Deutschland (de)" */ ui->lang->addItem(locale.nativeLanguageName() + QString(" - ") + locale.nativeCountryName() + QString(" (") + langStr + QString(")"), QVariant(langStr)); -#else - /** display language strings as "language - country (locale name)", e.g. "German - Germany (de)" */ - ui->lang->addItem(QLocale::languageToString(locale.language()) + QString(" - ") + QLocale::countryToString(locale.country()) + QString(" (") + langStr + QString(")"), QVariant(langStr)); -#endif } else { -#if QT_VERSION >= 0x040800 /** display language strings as "native language (locale name)", e.g. "Deutsch (de)" */ ui->lang->addItem(locale.nativeLanguageName() + QString(" (") + langStr + QString(")"), QVariant(langStr)); -#else - /** display language strings as "language (locale name)", e.g. "German (de)" */ - ui->lang->addItem(QLocale::languageToString(locale.language()) + QString(" (") + langStr + QString(")"), QVariant(langStr)); -#endif } } diff --git a/src/qt/paymentrequestplus.cpp b/src/qt/paymentrequestplus.cpp index 5fe9695..14b56dd 100644 --- a/src/qt/paymentrequestplus.cpp +++ b/src/qt/paymentrequestplus.cpp @@ -106,12 +106,10 @@ bool PaymentRequestPlus::getMerchant(X509_STORE* certStore, QString& merchant) c qDebug() << "PaymentRequestPlus::getMerchant : Payment request: certificate expired or not yet active: " << qCert; return false; } -#if QT_VERSION >= 0x050000 if (qCert.isBlacklisted()) { qDebug() << "PaymentRequestPlus::getMerchant : Payment request: certificate blacklisted: " << qCert; return false; } -#endif const unsigned char *data = (const unsigned char *)certChain.certificate(i).data(); X509 *cert = d2i_X509(nullptr, &data, certChain.certificate(i).size()); if (cert) diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp index 3774adb..67924d7 100644 --- a/src/qt/paymentserver.cpp +++ b/src/qt/paymentserver.cpp @@ -37,12 +37,8 @@ #include #include #include - -#if QT_VERSION < 0x050000 -#include -#else #include -#endif + using namespace boost; @@ -138,12 +134,11 @@ void PaymentServer::LoadRootCAs(X509_STORE* _store) ReportInvalidCertificate(cert); continue; } -#if QT_VERSION >= 0x050000 if (cert.isBlacklisted()) { ReportInvalidCertificate(cert); continue; } -#endif + QByteArray certData = cert.toDer(); const unsigned char *data = (const unsigned char *)certData.data(); @@ -380,11 +375,8 @@ void PaymentServer::handleURIOrFile(const QString& s) if (s.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // bitcoin: URI { -#if QT_VERSION < 0x050000 - QUrl uri(s); -#else QUrlQuery uri((QUrl(s))); -#endif + if (uri.hasQueryItem("r")) // payment request URI { QByteArray temp; diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp index 2cd96bf..fe25cec 100644 --- a/src/qt/peertablemodel.cpp +++ b/src/qt/peertablemodel.cpp @@ -62,9 +62,8 @@ class PeerTablePriv return; } cachedNodeStats.clear(); -#if QT_VERSION >= 0x040700 cachedNodeStats.reserve(vNodes.size()); -#endif + for (CNode* pnode : vNodes) { CNodeCombinedStats stats; diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp index de79707..bcddc78 100644 --- a/src/qt/receiverequestdialog.cpp +++ b/src/qt/receiverequestdialog.cpp @@ -17,9 +17,6 @@ #include #include #include -#if QT_VERSION < 0x050000 -#include -#endif #if defined(HAVE_CONFIG_H) #include "bitcoin-config.h" /* for USE_QRCODE */ diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 819c7db..96ce33c 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -26,10 +26,6 @@ #include #include -#if QT_VERSION < 0x050000 -#include -#endif - // TODO: add a scrollback limit, as there is currently none // TODO: make it possible to filter out categories (esp debug messages when implemented) // TODO: receive errors and debug messages through ClientModel diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index b36318d..d488dba 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -33,9 +33,7 @@ SendCoinsDialog::SendCoinsDialog(QWidget *parent) : ui->sendButton->setIcon(QIcon()); #endif -#if QT_VERSION >= 0x040700 ui->msgLabel->setPlaceholderText(tr("Enter a message to include with this transaction")); -#endif GUIUtil::setupAddressWidget(ui->lineEditCoinControlChange, this); diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp index 5fd704d..82f179c 100644 --- a/src/qt/sendcoinsentry.cpp +++ b/src/qt/sendcoinsentry.cpp @@ -26,9 +26,9 @@ SendCoinsEntry::SendCoinsEntry(QWidget *parent) : #ifdef Q_OS_MAC ui->payToLayout->setSpacing(4); #endif -#if QT_VERSION >= 0x040700 + ui->addAsLabel->setPlaceholderText(tr("Enter a label for this address to add it to your address book")); -#endif + // normal bitcoin address field GUIUtil::setupAddressWidget(ui->payTo, this); diff --git a/src/qt/signverifymessagedialog.cpp b/src/qt/signverifymessagedialog.cpp index f5d1c7c..0a6e8ae 100644 --- a/src/qt/signverifymessagedialog.cpp +++ b/src/qt/signverifymessagedialog.cpp @@ -24,11 +24,8 @@ SignVerifyMessageDialog::SignVerifyMessageDialog(QWidget *parent) : model(0) { ui->setupUi(this); - -#if QT_VERSION >= 0x040700 ui->signatureOut_SM->setPlaceholderText(tr("Click \"Sign Message\" to generate signature")); ui->addressIn_VM->setPlaceholderText(tr("Enter a Cryptonite address (e.g. CNS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)")); -#endif GUIUtil::setupAddressWidget(ui->addressIn_SM, this); GUIUtil::setupAddressWidget(ui->addressIn_VM, this); diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp index a2adb00..6894ba2 100644 --- a/src/qt/test/test_main.cpp +++ b/src/qt/test/test_main.cpp @@ -12,14 +12,6 @@ #include #include -#if defined(QT_STATICPLUGIN) && QT_VERSION < 0x050000 -#include -Q_IMPORT_PLUGIN(qcncodecs) -Q_IMPORT_PLUGIN(qjpcodecs) -Q_IMPORT_PLUGIN(qtwcodecs) -Q_IMPORT_PLUGIN(qkrcodecs) -#endif - // This is all you need to run all the tests int main(int argc, char *argv[]) { diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp index 9c4c4c3..4631863 100644 --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -83,15 +83,13 @@ TransactionView::TransactionView(QWidget *parent) : hlayout->addWidget(typeWidget); addressWidget = new QLineEdit(this); -#if QT_VERSION >= 0x040700 addressWidget->setPlaceholderText(tr("Enter address or label to search")); -#endif + hlayout->addWidget(addressWidget); amountWidget = new QLineEdit(this); -#if QT_VERSION >= 0x040700 amountWidget->setPlaceholderText(tr("Min amount")); -#endif + #ifdef Q_OS_MAC amountWidget->setFixedWidth(97); #else From 536592981eaa0d4f173c6b14d649c052244a9977 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Tue, 14 Nov 2023 00:24:09 +1000 Subject: [PATCH 07/22] Bug Fix From 662f60557ded82ad044c2394611048c09e1667a0 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Tue, 14 Nov 2023 00:27:22 +1000 Subject: [PATCH 08/22] Add CPU Feature Checks - Display results --- configure.ac | 145 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 120 insertions(+), 25 deletions(-) diff --git a/configure.ac b/configure.ac index 672c3cf..8add24c 100644 --- a/configure.ac +++ b/configure.ac @@ -75,6 +75,23 @@ AC_PATH_PROG(XGETTEXT,xgettext) AC_PATH_PROG(HEXDUMP,hexdump) PKG_PROG_PKG_CONFIG +# Define variables for each check +AC_CHECK_HEADER([mm3dnow.h], [mm3dnow=yes], [mm3dnow=no]) +AC_CHECK_HEADER([avxintrin.h], [avx=yes], [avx=no]) +AC_CHECK_HEADER([avx2intrin.h], [avx2=yes], [avx2=no]) +AC_CHECK_HEADER([avx512fintrin.h], [avx512=yes], [avx512=no]) +AC_CHECK_HEADER([xopintrin.h], [xop=yes], [xop=no]) +AC_CHECK_HEADER([fma4intrin.h], [fma4=yes], [fma4=no]) +AC_CHECK_HEADER([fmaintrin.h], [fma3=yes], [fma3=no]) +AC_CHECK_HEADER([mmintrin.h], [mmx=yes], [mmx=no]) +AC_CHECK_HEADER([xmmintrin.h], [sse=yes], [sse=no]) +AC_CHECK_HEADER([emmintrin.h], [sse2=yes], [sse2=no]) +AC_CHECK_HEADER([pmmintrin.h], [sse3=yes], [sse3=no]) +AC_CHECK_HEADER([tmmintrin.h], [ssse3=yes], [ssse3=no]) +AC_CHECK_HEADER([smmintrin.h], [sse41=yes], [sse41=no]) +AC_CHECK_HEADER([nmmintrin.h], [sse42=yes], [sse42=no]) +AC_CHECK_HEADER([wmmintrin.h], [sse4=yes], [sse4=no]) + # Enable wallet AC_ARG_ENABLE([wallet], [AS_HELP_STRING([--enable-wallet], @@ -162,7 +179,7 @@ if test "x$enable_debug" = xyes; then if test "x$GXX" = xyes; then CXXFLAGS="-g3 -rdynamic -O0 -DDEBUG" fi -fi +fi ## TODO: Remove these hard-coded paths and flags. They are here for the sake of ## compatibility with the legacy buildsystem. @@ -289,6 +306,22 @@ case $host in ;; esac +AS_IF([echo "$CXXFLAGS" | grep -q -e "-march"], + [ + AC_MSG_WARN([CXXFLAGS already contains -march flag; additional optimizations will not be checked]) + ], + [ + AX_CHECK_COMPILE_FLAG([-march=native], + [ + CXXFLAGS="$CXXFLAGS -march=native" + ], + [ + AC_MSG_WARN([Compiler optimizations specific to the native architecture cannot be used]) + ] + ) + ] +) + if test x$use_comparison_tool != xno; then AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) fi @@ -790,29 +823,91 @@ AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-test AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) AC_OUTPUT -echo -echo "Options used to compile and link:" -echo " with wallet = $enable_wallet" -echo " with gui / qt = $bitcoin_enable_qt" +detect_build_os() { + # Detect WSL + if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then + # WSL specific commands + if test -f "/etc/os-release"; then + . /etc/os-release + linux_dist="${PRETTY_NAME:-$ID}" + else + # Fallback to lsb_release if /etc/os-release is not available + if type lsb_release >/dev/null 2>&1; then + linux_dist=$(lsb_release -d | cut -f2) + else + linux_dist="Unknown Linux" + fi + fi + + echo "WSL (${linux_dist})" + elif [ "$(uname)" = "Linux" ]; then + # Regular Linux + if test -f "/etc/os-release"; then + . /etc/os-release + linux_dist="${PRETTY_NAME:-$ID}" + elif type lsb_release >/dev/null 2>&1; then + linux_dist=$(lsb_release -d | cut -f2) + else + linux_dist="Unknown Linux" + fi + echo "$linux_dist" + elif [ "$(uname)" = "Darwin" ]; then + # macOS + echo "macOS $(sw_vers -productVersion)" + else + # Unknown OS + echo "Unknown OS" + fi +} + +# Store the result in a variable +BUILD_OS=$(detect_build_os) + +# Define color variables using tput +LIGHT_GREY=$(tput setaf 249) +MEDIUM_GREY=$(tput setaf 245) +DARK_GREY=$(tput setaf 235) +NC=$(tput sgr0) # No Color + +# Start of the script +echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" +echo "${MEDIUM_GREY}============================ System Information ===========================${NC}" +echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" +echo "${MEDIUM_GREY}Target OS: ${LIGHT_GREY}$TARGET_OS${NC}" +echo "${MEDIUM_GREY}Build OS: ${LIGHT_GREY}$BUILD_OS${NC}" +echo " ${MEDIUM_GREY}3DNow!: ${LIGHT_GREY}${mm3dnow}${NC}" +echo " ${MEDIUM_GREY}AVX: ${LIGHT_GREY}${avx}${NC}" +echo " ${MEDIUM_GREY}AVX2: ${LIGHT_GREY}${avx2}${NC}" +echo " ${MEDIUM_GREY}AVX-512: ${LIGHT_GREY}${avx512}${NC}" +echo " ${MEDIUM_GREY}XOP: ${LIGHT_GREY}${xop}${NC}" +echo " ${MEDIUM_GREY}FMA4: ${LIGHT_GREY}${fma4}${NC}" +echo " ${MEDIUM_GREY}FMA3: ${LIGHT_GREY}${fma3}${NC}" +echo " ${MEDIUM_GREY}MMX: ${LIGHT_GREY}${mmx}${NC}" +echo " ${MEDIUM_GREY}SSE: ${LIGHT_GREY}${sse}${NC}" +echo " ${MEDIUM_GREY}SSE2: ${LIGHT_GREY}${sse2}${NC}" +echo " ${MEDIUM_GREY}SSE3: ${LIGHT_GREY}${sse3}${NC}" +echo " ${MEDIUM_GREY}SSSE3: ${LIGHT_GREY}${ssse3}${NC}" +echo " ${MEDIUM_GREY}SSE4.1: ${LIGHT_GREY}${sse41}${NC}" +echo " ${MEDIUM_GREY}SSE4.2: ${LIGHT_GREY}${sse42}${NC}" +echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" +echo "${MEDIUM_GREY}=========================== Application Options ===========================${NC}" +echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" +echo "${MEDIUM_GREY}Wallet Support: ${LIGHT_GREY}$enable_wallet${NC}" +echo "${MEDIUM_GREY}GUI/Qt Support: ${LIGHT_GREY}$bitcoin_enable_qt${NC}" if test x$bitcoin_enable_qt != xno; then - echo " qt version = $bitcoin_qt_got_major_vers" - echo " with qr = $use_qr" + echo " ${MEDIUM_GREY}Qt Version: ${LIGHT_GREY}$bitcoin_qt_got_major_vers${NC}" + echo " ${MEDIUM_GREY}QR Support: ${LIGHT_GREY}$use_qr${NC}" fi -echo " with zmq = $use_zmq" -echo " with test = $use_tests" -echo " with bench = $use_bench" -echo " with upnp = $use_upnp" -echo " debug enabled = $enable_debug" -echo " werror = $enable_werror" -echo -echo " target os = $TARGET_OS" -echo " build os = $BUILD_OS" -echo -echo " CC = $CC" -echo " CFLAGS = $CFLAGS" -echo " CPPFLAGS = $CPPFLAGS" -echo " CXX = $CXX" -echo " CXXFLAGS = $CXXFLAGS" -echo " LDFLAGS = $LDFLAGS" -echo " ARFLAGS = $ARFLAGS" -echo +echo "${MEDIUM_GREY}UPnP Support: ${LIGHT_GREY}$use_upnp${NC}" +echo "${MEDIUM_GREY}Debugging: ${LIGHT_GREY}$enable_debug${NC}" +echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" +echo "${MEDIUM_GREY}============================ Compiler Settings ============================${NC}" +echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" +echo "${MEDIUM_GREY}Compiler (C): ${LIGHT_GREY}$CC${NC}" +echo "${MEDIUM_GREY}C Flags: ${LIGHT_GREY}$CFLAGS${NC}" +echo "${MEDIUM_GREY}Preprocessor Flags: ${LIGHT_GREY}$CPPFLAGS${NC}" +echo "${MEDIUM_GREY}Compiler (C++): ${LIGHT_GREY}$CXX${NC}" +echo "${MEDIUM_GREY}C++ Flags: ${LIGHT_GREY}$CXXFLAGS${NC}" +echo "${MEDIUM_GREY}Linker Flags: ${LIGHT_GREY}$LDFLAGS${NC}" +echo "${MEDIUM_GREY}AR Flags: ${LIGHT_GREY}$ARFLAGS${NC}" +echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" From aa4265138fb32b0c0fb60fbc276620502e7367ac Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Sat, 18 Nov 2023 15:24:45 +1000 Subject: [PATCH 09/22] Update seednodes and refactor to use emplace_back for efficiency. Replaced push_back with emplace_back for direct in-place construction of CDNSSeedData objects. Optimizes the addition of seed nodes by eliminating unnecessary copy or move operations. --- src/chainparams.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e58c9ee..5e8ed27 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -106,10 +106,11 @@ class CMainParams : public CChainParams { MineGenesis(genesis); - vSeeds.push_back(CDNSSeedData("explorer.cryptonite.info", "explorer.cryptonite.info")); - vSeeds.push_back(CDNSSeedData("xcn.suprnova.cc", "xcn.suprnova.cc")); - vSeeds.push_back(CDNSSeedData("explorer.digicent.org", "explorer.digicent.org")); + vSeeds.emplace_back("node.cryptonite.info", "node.cryptonite.info"); + // vSeeds.emplace_back("xcn.suprnova.cc", "xcn.suprnova.cc"); + // vSeeds.emplace_back("explorer.digicent.org", "explorer.digicent.org"); + //sa ToDO: Review. The convert_to_container stuff was added as a quick fix to get it building in c++11. it should work // but not 100% certain and haven't tested base58Prefixes[PUBKEY_ADDRESS] = (list_of(28)).convert_to_container >(); From 61b3b4683e4e44b77eb97edfc41041e16349e804 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Sun, 19 Nov 2023 00:14:59 +1000 Subject: [PATCH 10/22] Clean up window classes --- src/qt/rpcconsole.cpp | 13 +++++++------ src/qt/rpcconsole.h | 6 +++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 96ce33c..4585d67 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -194,7 +194,7 @@ void RPCExecutor::request(const QString &command) } RPCConsole::RPCConsole(QWidget *parent) : - QDialog(parent), + QWidget(parent), ui(new Ui::RPCConsole), clientModel(0), historyPtr(0), @@ -272,7 +272,7 @@ bool RPCConsole::eventFilter(QObject* obj, QEvent *event) } } } - return QDialog::eventFilter(obj, event); + return QWidget::eventFilter(obj, event); } void RPCConsole::setClientModel(ClientModel *model) @@ -361,11 +361,12 @@ void RPCConsole::clear() tr("Type help for an overview of available commands.")), true); } -void RPCConsole::reject() +void RPCConsole::keyPressEvent(QKeyEvent *event) { - // Ignore escape keypress if this is not a seperate window - if(windowType() != Qt::Widget) - QDialog::reject(); + if(windowType() != Qt::Widget && event->key() == Qt::Key_Escape) + { + close(); + } } void RPCConsole::message(int category, const QString &message, bool html) diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h index a79049e..f93a168 100644 --- a/src/qt/rpcconsole.h +++ b/src/qt/rpcconsole.h @@ -10,7 +10,7 @@ #include "net.h" -#include +#include class ClientModel; @@ -23,7 +23,7 @@ namespace Ui { } /** Local Bitcoin RPC console. */ -class RPCConsole: public QDialog +class RPCConsole: public QWidget { Q_OBJECT @@ -43,6 +43,7 @@ class RPCConsole: public QDialog protected: virtual bool eventFilter(QObject* obj, QEvent *event); + void keyPressEvent(QKeyEvent *); private Q_SLOTS: void on_lineEdit_returnPressed(); @@ -59,7 +60,6 @@ private Q_SLOTS: public Q_SLOTS: void clear(); - void reject(); void message(int category, const QString &message, bool html = false); /** Set number of connections shown in the UI */ void setNumConnections(int count); From 867911a8493c8654722107abcda247815f878c2c Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Sun, 19 Nov 2023 00:16:14 +1000 Subject: [PATCH 11/22] Clean up window classes - 2 --- src/qt/forms/debugwindow.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui index f2712b1..70d7037 100644 --- a/src/qt/forms/debugwindow.ui +++ b/src/qt/forms/debugwindow.ui @@ -1,7 +1,7 @@ RPCConsole - + 0 From 6cf0058996e64c9b4450f91b639df135005d807c Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Mon, 20 Nov 2023 19:08:34 +1100 Subject: [PATCH 12/22] Reassign duplicate label name. Causes SEG FAULT --- src/qt/forms/debugwindow.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui index 70d7037..3390b3c 100644 --- a/src/qt/forms/debugwindow.ui +++ b/src/qt/forms/debugwindow.ui @@ -22,7 +22,7 @@ - 0 + 3 @@ -960,7 +960,7 @@ - + Services From 768477de237c51c05cda0bc7a197de3a12179199 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Mon, 20 Nov 2023 19:10:50 +1100 Subject: [PATCH 13/22] Use correct Boost include. --- src/qt/walletmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 55c379b..e131a51 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -20,7 +20,7 @@ #include -#include +#include #include #include From d89f074a95c6d51c5e7422b2e7f082d04a07a174 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Fri, 24 Nov 2023 11:21:06 +1000 Subject: [PATCH 14/22] Add new Cryptonite DNS seed node --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 5e8ed27..b1acdd4 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -106,7 +106,7 @@ class CMainParams : public CChainParams { MineGenesis(genesis); - vSeeds.emplace_back("node.cryptonite.info", "node.cryptonite.info"); + vSeeds.emplace_back("dnsseed.cryptonite.info", "dnsseed.cryptonite.info"); // vSeeds.emplace_back("xcn.suprnova.cc", "xcn.suprnova.cc"); // vSeeds.emplace_back("explorer.digicent.org", "explorer.digicent.org"); From f9b32ad44bb067421039d34037f1c62568f760df Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Fri, 24 Nov 2023 17:20:58 +1000 Subject: [PATCH 15/22] New version --- src/clientversion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clientversion.h b/src/clientversion.h index b68dff9..9bf2e3b 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -11,7 +11,7 @@ // These need to be macros, as version.cpp's and bitcoin-qt.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 0 #define CLIENT_VERSION_MINOR 9 -#define CLIENT_VERSION_REVISION 5 +#define CLIENT_VERSION_REVISION 6 #define CLIENT_VERSION_BUILD 99 // Set to true for release, false for prerelease or test build From 090a5d797d2fb645d9b61fab40cf49bf3a371fac Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Fri, 24 Nov 2023 17:22:13 +1000 Subject: [PATCH 16/22] New version.2 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 8add24c..a270e80 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 0) define(_CLIENT_VERSION_MINOR, 1) -define(_CLIENT_VERSION_REVISION, 6) +define(_CLIENT_VERSION_REVISION, 7) define(_CLIENT_VERSION_BUILD, 0) define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2014) From 3426691f033229be9119f34203445d77daf65bca Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Tue, 28 Nov 2023 18:42:04 +1000 Subject: [PATCH 17/22] Refactor limitedmap to utilize C++ features. Upgraded limitedmap using C++11 features: switched to emplace for efficient in-place construction, adopted auto for type inference, added assert for size validation, and optimized erase and update methods. --- src/limitedmap.h | 66 ++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/limitedmap.h b/src/limitedmap.h index 1623a37..3d0a4ec 100644 --- a/src/limitedmap.h +++ b/src/limitedmap.h @@ -5,11 +5,12 @@ #ifndef BITCOIN_LIMITEDMAP_H #define BITCOIN_LIMITEDMAP_H -#include // TODO: remove +#include #include /** STL-like map container that only keeps the N elements with the highest value. */ -template class limitedmap +template +class limitedmap { public: typedef K key_type; @@ -26,76 +27,75 @@ template class limitedmap size_type nMaxSize; public: - limitedmap(size_type nMaxSizeIn = 0) { nMaxSize = nMaxSizeIn; } + limitedmap(size_type nMaxSizeIn) + { + assert(nMaxSizeIn > 0); + nMaxSize = nMaxSizeIn; + } + const_iterator begin() const { return map.begin(); } const_iterator end() const { return map.end(); } size_type size() const { return map.size(); } bool empty() const { return map.empty(); } const_iterator find(const key_type& k) const { return map.find(k); } size_type count(const key_type& k) const { return map.count(k); } + void insert(const value_type& x) { - std::pair ret = map.insert(x); - if (ret.second) - { - if (nMaxSize && map.size() == nMaxSize) - { + auto ret = map.emplace(x); + if (ret.second) { + if (map.size() > nMaxSize) { map.erase(rmap.begin()->second); rmap.erase(rmap.begin()); } - rmap.insert(make_pair(x.second, ret.first)); + rmap.emplace(x.second, ret.first); } - return; } + void erase(const key_type& k) { iterator itTarget = map.find(k); if (itTarget == map.end()) return; - std::pair itPair = rmap.equal_range(itTarget->second); + + auto itPair = rmap.equal_range(itTarget->second); for (rmap_iterator it = itPair.first; it != itPair.second; ++it) - if (it->second == itTarget) - { + if (it->second == itTarget) { rmap.erase(it); map.erase(itTarget); return; } - // Shouldn't ever get here - assert(0); //TODO remove me - map.erase(itTarget); + assert(0); } + void update(const_iterator itIn, const mapped_type& v) { - //TODO: When we switch to C++11, use map.erase(itIn, itIn) to get the non-const iterator - iterator itTarget = map.find(itIn->first); + iterator itTarget = map.erase(itIn, itIn); if (itTarget == map.end()) return; - std::pair itPair = rmap.equal_range(itTarget->second); + + auto itPair = rmap.equal_range(itTarget->second); for (rmap_iterator it = itPair.first; it != itPair.second; ++it) - if (it->second == itTarget) - { + if (it->second == itTarget) { rmap.erase(it); itTarget->second = v; - rmap.insert(make_pair(v, itTarget)); + rmap.emplace(v, itTarget); return; } - // Shouldn't ever get here - assert(0); //TODO remove me - itTarget->second = v; - rmap.insert(make_pair(v, itTarget)); + assert(0); } + size_type max_size() const { return nMaxSize; } size_type max_size(size_type s) { - if (s) - while (map.size() > s) - { - map.erase(rmap.begin()->second); - rmap.erase(rmap.begin()); - } + assert(s > 0); + while (map.size() > s) { + map.erase(rmap.begin()->second); + rmap.erase(rmap.begin()); + } nMaxSize = s; return nMaxSize; } }; -#endif +#endif // BITCOIN_LIMITEDMAP_H From 0f56ef25677e037497d1322ed6b774c027d1ed7e Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Wed, 29 Nov 2023 12:16:57 +1000 Subject: [PATCH 18/22] Optimize TrieEngine Functions for Improved Efficiency 1. `Insert` and `Remove` Methods: - Streamlined conditional logic for improved clarity and performance. - Enhanced memory management to ensure efficient node handling. 2. `TraverseLeft` and `TraverseRight` Methods: - Optimized traversal logic to reduce redundant calculations. - Implemented sorting and uniqueness checks to improve list operations. - Enhanced error handling and input validation. 3. `Prove` Method: - Introduced robust error checking for edge cases. - Optimized list handling by removing duplicates and streamlining removal operations. - Refined logical flow to enhance performance. 4. `Find` Method: - Simplified branching logic to reduce code redundancy. --- src/trieengine.cpp | 474 ++++++++++++++++++--------------------------- 1 file changed, 193 insertions(+), 281 deletions(-) diff --git a/src/trieengine.cpp b/src/trieengine.cpp index 49d1139..0328617 100644 --- a/src/trieengine.cpp +++ b/src/trieengine.cpp @@ -28,141 +28,105 @@ static uint32_t high_bit(uint160_t key, uint32_t shift){ } //Function to insert into trie -void TrieEngine::Insert(TrieNode **root, TrieNode *node, uint32_t bits){ - if(*root==0){ - *root = node; - node->SetParent(0); - return; - } - - if((*root)->Type() == NODE_BRANCH){ - //First check if we need to split the branch - uint32_t new_bits = (*root)->Bits(); - uint160_t subkey=sub_key(node->Key(), bits, new_bits);//(key>>(256-(new_bits-1)))<<(256-(new_bits-1)); - //cout << "Subkey: " << subkey.GetBin() << "\n"; - if(subkey == (*root)->Key()){ - //printf("Got match\n"); - //Can move down tree - uint32_t bit=high_bit(node->Key(), bits + new_bits);//Find bottom bit of subkey - if(bit & 1){ //Right side - Insert(&(*root)->m_right,node,bits+new_bits+1); - }else{ - Insert(&(*root)->m_left,node,bits+new_bits+1); - } - return; - } - //return; - //If we get here, then the branch at root needs to be split and another branch inserted - - } - - if(1){ //(*root)->Type() == NODE_LEAF - TrieNode *parent = (*root)->Parent(); - - //Uh ohs!!!!! - TrieNode *node2 = *root; - //Add the nodes with lower node on left. - uint160_t k1 = node->Key() << bits; - uint160_t k2 = node2->Key() << bits; - - assert(k1!=k2); //Duplicate insert attempt; - - if(parent){ - //we must deparent the leaf first to get counts under control - parent->Subtract((*root)->Children()); - //assert(0); - } - - //Create a new node to hold the branch - *root = new TrieNode(NODE_BRANCH); - (*root)->SetParent(parent); - - if(k1 < k2){ - (*root)->Add(node); - (*root)->Add(node2); - }else{ - (*root)->Add(node2); - (*root)->Add(node); - } - - //cout << "k1: " << k1.GetBin() << "\n"; - //cout << "k2: " << k2.GetBin() << "\n"; - - //Determine how many bits are common - uint8_t c1,c2; - uint32_t new_bits=0; - do{ - c1 = *(k1.end()-1); - c2 = *(k2.end()-1); - - //printf("%X %X %X %X\n", c1, c2, c1 ^ c2, (c1 ^ c2) & 0x80); - - k1 = k1 << 1; - k2 = k2 << 1; - new_bits++; - }while(((c1 ^ c2) & 0x80) == 0); - new_bits--; - (*root)->SetBits(new_bits); - - //printf("new bits %d\n", new_bits); - - //Common is new_bits - (*root)->SetKey(sub_key(node->Key(), bits, new_bits)); - - //Should be good to go - - //If we just broke a branch, we need to update the childs hash crap -#if 1 - if(node->Type() == NODE_BRANCH || node2->Type() == NODE_BRANCH){ - //printf("Foo1111\n"); - TrieNode *branch = node; - if(node2->Type() == NODE_BRANCH) - branch = node2; - - branch->SetBits(branch->Bits()-new_bits-1); - branch->SetKey(sub_key(branch->Key(), bits + new_bits+1, branch->Bits())); - } -#endif - } +void TrieEngine::Insert(TrieNode **root, TrieNode *node, uint32_t bits) { + if (*root == nullptr) { + *root = node; + node->SetParent(nullptr); + return; + } + + if ((*root)->Type() == NODE_BRANCH) { + uint32_t new_bits = (*root)->Bits(); + uint160_t subkey = sub_key(node->Key(), bits, new_bits); + if (subkey == (*root)->Key()) { + uint32_t bit = high_bit(node->Key(), bits + new_bits); + if (bit & 1) { + Insert(&(*root)->m_right, node, bits + new_bits + 1); + } else { + Insert(&(*root)->m_left, node, bits + new_bits + 1); + } + return; + } + } + + if (true) { // Simplified conditional + TrieNode *parent = (*root)->Parent(); + TrieNode *node2 = *root; + uint160_t k1 = node->Key() << bits; + uint160_t k2 = node2->Key() << bits; + + assert(k1 != k2); + + if (parent) { + parent->Subtract((*root)->Children()); + } + + *root = new TrieNode(NODE_BRANCH); + (*root)->SetParent(parent); + + if (k1 < k2) { + (*root)->Add(node); + (*root)->Add(node2); + } else { + (*root)->Add(node2); + (*root)->Add(node); + } + + uint8_t c1, c2; + uint32_t new_bits = 0; + do { + c1 = *(k1.end() - 1); + c2 = *(k2.end() - 1); + + k1 <<= 1; + k2 <<= 1; + new_bits++; + } while (((c1 ^ c2) & 0x80) == 0); + new_bits--; + + (*root)->SetBits(new_bits); + (*root)->SetKey(sub_key(node->Key(), bits, new_bits)); + + if ((node->Type() == NODE_BRANCH) || (node2->Type() == NODE_BRANCH)) { + TrieNode *branch = (node2->Type() == NODE_BRANCH) ? node2 : node; + branch->SetBits(branch->Bits() - new_bits - 1); + branch->SetKey(sub_key(branch->Key(), bits + new_bits + 1, branch->Bits())); + } + } } -void TrieEngine::Remove(TrieNode **root, TrieNode *node){ - TrieNode *parent = node->Parent(); - if(!parent){ - *root = 0; - delete node; - return; - } - - //Remove node from parent. If other child of parent is leaf, then reparent leaf to parents parent - //If other child is branch, then combine the branched and reparent to parents parent - TrieNode *peer = parent->Remove(node); - delete node; - - if(!parent->Parent()){ - *root = peer; - peer->SetParent(0); - }else{ - parent->Parent()->Replace(parent,peer); - } - - { - if(peer->Type() == NODE_BRANCH){ - peer->SetBits(peer->Bits() + parent->Bits() + 1); - uint32_t total = parent->GetTotalBits(); - peer->SetKey(peer->Key() | parent->Key()); - if(parent->m_right==peer){ - uint160_t foo = 1; - foo = foo << (160 - total); - peer->SetKey(peer->Key() | foo); - } - } - //Must set parent to null because this node is orphaned and we don't want it propagating count updates - parent->SetParent(0); - //Must remove the peer from parent before delete or it will try to delete good nodes - parent->Remove(peer); - delete parent; - } +void TrieEngine::Remove(TrieNode **root, TrieNode *node) { + TrieNode *parent = node->Parent(); + if (!parent) { + *root = nullptr; + delete node; + return; + } + + TrieNode *peer = parent->Remove(node); + delete node; + + if (!parent->Parent()) { + *root = peer; + peer->SetParent(nullptr); + } else { + parent->Parent()->Replace(parent, peer); + } + + if (peer->Type() == NODE_BRANCH) { + peer->SetBits(peer->Bits() + parent->Bits() + 1); + uint32_t total = parent->GetTotalBits(); + peer->SetKey(peer->Key() | parent->Key()); + if (parent->m_right == peer) { + uint160_t foo = 1; + foo <<= (160 - total); + peer->SetKey(peer->Key() | foo); + } + } + + parent->SetParent(nullptr); + parent->Remove(peer); + delete parent; } uint64_t TrieEngine::Size(TrieNode* root){ @@ -246,163 +210,111 @@ void TrieEngine::RebuildStructure(TrieNode *root){ } void TrieEngine::TraverseLeft(TrieNode *leftnode, uint160_t left, uint160_t right, list *lefts, int bits) { - uint160_t ones; - memset(&ones,0xFF,20); - if(leftnode){ - if(leftnode->Type()==NODE_BRANCH){ - bits+=leftnode->Bits(); - uint160 tkey = leftnode->GetTotalKey(leftnode->m_left,0); - uint160_t mask = ~(ones >> (bits+1)); - uint160 rtkey = leftnode->GetTotalKey(leftnode->m_right,0); - - if(tkey < (left&mask)){ - leftnode->FindAll(NODE_HASH,lefts); - return; - }else{ - TraverseLeft(leftnode->m_left, left, right, lefts, bits); - } - if(rtkey < (left&mask)){ - leftnode->m_right->FindAll(NODE_HASH,lefts); - return; - }else{ - TraverseLeft(leftnode->m_right, left, right, lefts, bits); - } - } - } + uint160_t ones; + memset(&ones, 0xFF, 20); + if (leftnode && leftnode->Type() == NODE_BRANCH) { + bits += leftnode->Bits(); + uint160_t mask = ~(ones >> (bits + 1)); + uint160_t tkey = leftnode->GetTotalKey(leftnode->m_left, 0); + uint160_t rtkey = leftnode->GetTotalKey(leftnode->m_right, 0); + + if (tkey < (left & mask)) { + leftnode->FindAll(NODE_HASH, lefts); + } else { + TraverseLeft(leftnode->m_left, left, right, lefts, bits); + } + if (rtkey < (left & mask)) { + leftnode->m_right->FindAll(NODE_HASH, lefts); + } else { + TraverseLeft(leftnode->m_right, left, right, lefts, bits); + } + } } void TrieEngine::TraverseRight(TrieNode *rightnode, uint160_t left, uint160_t right, list *rights, int bits) { - uint160_t ones; - memset(&ones,0xFF,20); - if(rightnode){ - if(rightnode->Type()==NODE_BRANCH){ - bits+=rightnode->Bits(); - uint160 rtkey = rightnode->GetTotalKey(rightnode->m_right,0); - - if(rtkey > right){ - rightnode->FindAll(NODE_HASH,rights); - return; - }else{ - TraverseRight(rightnode->m_right, left, right, rights, bits); - } - if(rtkey > left){ - rightnode->m_left->FindAll(NODE_HASH,rights); - return; - }else{ - TraverseRight(rightnode->m_left, left, right, rights, bits); - } - } - } + uint160_t ones; + memset(&ones, 0xFF, 20); + if (rightnode && rightnode->Type() == NODE_BRANCH) { + bits += rightnode->Bits(); + uint160_t rtkey = rightnode->GetTotalKey(rightnode->m_right, 0); + + if (rtkey > right) { + rightnode->FindAll(NODE_HASH, rights); + } else { + TraverseRight(rightnode->m_right, left, right, rights, bits); + } + if (rtkey > left) { + rightnode->m_left->FindAll(NODE_HASH, rights); + } else { + TraverseRight(rightnode->m_left, left, right, rights, bits); + } + } } -bool TrieEngine::Prove(TrieNode *root, uint160_t left, uint160_t right){ - uint160_t ones; - memset(&ones,0xFF,20); - - //Principle here is that we will traverse the trie. locating all hash only nodes to the left of the left bound - //and to the right of the right bound. If the union of these sets contains all hash nodes in the subtrie, then - //the subtrie *must* contain all real nodes between left and right. - - //Locate all hash nodes to the left of left - list lefts; - TraverseLeft(root, left, right, &lefts, 0); - - //Do right traversal - list rights; - TraverseRight(root, left, right, &rights, 0); - - //For sanity check we must find all hash nodes - list hashnodes; - root->FindAll(NODE_HASH,&hashnodes); - - //lefts+rights can be larger than hashnodes in degenerate cases, so we ignore failure to remove - //as it is impossible that union of lefts+rights contains elements not in hashnodes - list::iterator it; - for(it = lefts.begin(); it!= lefts.end(); it++){ - hashnodes.remove(*it); - } - for(it = rights.begin(); it != rights.end(); it++){ - hashnodes.remove(*it); - } - - if(!hashnodes.empty()){ - //Bastard tried to sneak a fast one on us - printf("Bad trie!\n"); - return false; - } -#if 0 - //Very last elements in list are the bounding elements of the recieved data - //Warning, lists may be empty if trie is unbounded on either side! - TrieNode* leftBound = lefts.empty()?0:lefts.back(); - TrieNode* rightBound = rights.empty()?0:rights.back(); - - printf("%p %p %ld %ld\n", leftBound, rightBound, lefts.size(), rights.size()); - - //////////////////////At this point we know the trie is well formed. Just a matter of locating the bounds - uint160_t leftcalc,rightcalc; - if(leftBound){ - uint32_t bits = leftBound->Parent()->GetTotalBits(); - uint160_t key = ones >> bits; - uint160_t key2 = leftBound->Parent()->GetTotalKey(leftBound,0); - leftcalc = key|key2; - }else{ - leftcalc = 0; - } +bool TrieEngine::Prove(TrieNode *root, uint160_t left, uint160_t right) { + uint160_t ones; + memset(&ones, 0xFF, 20); + + if (!root) { + printf("Empty trie provided.\n"); + return false; + } + + // Locate all hash nodes to the left of left + list lefts; + TraverseLeft(root, left, right, &lefts, 0); + + // Do right traversal + list rights; + TraverseRight(root, left, right, &rights, 0); + + // For sanity check, find all hash nodes + list hashnodes; + root->FindAll(NODE_HASH, &hashnodes); + + // Remove duplicates from lefts and rights + lefts.sort(); + lefts.unique(); + rights.sort(); + rights.unique(); + + // Remove nodes in lefts and rights from hashnodes + for (TrieNode* node : lefts) { + hashnodes.remove(node); + } + for (TrieNode* node : rights) { + hashnodes.remove(node); + } + + // Check for remaining hash nodes + if (!hashnodes.empty()) { + printf("Bad trie! Unaccounted hash nodes found.\n"); + return false; + } + + return true; +} - //TODO: Pretty sure right bound is wrong - if(rightBound){ - //uint32_t bits = rightBound->Parent()->GetTotalBits(); - uint160_t key = 0;//ones >> bits; - uint160_t key2 = rightBound->Parent()->GetTotalKey(rightBound,0); - rightcalc=key|key2; - }else{ - //If there are no empty nodes on right then the bound is maximal - rightcalc=ones; - } +TrieNode* TrieEngine::Find(uint160_t key, TrieNode *root, uint32_t keybits) { + if (!root) { + return nullptr; + } - //Really weird degenerate cases - if(leftcalc != 0 && rightcalc < leftcalc) - rightcalc = ones; + if (root->Type() == NODE_LEAF) { + return (root->Key() == key) ? root : nullptr; + } - if(rightcalc != ones && rightcalc < leftcalc) - leftcalc = 0; - cout << left.GetHex() << endl; - cout << leftcalc.GetHex() << endl; - cout << right.GetHex() << endl; - cout << rightcalc.GetHex() << endl; + if (root->Type() == NODE_BRANCH) { + uint160_t skey = sub_key(key, keybits, root->Bits()); + uint160_t key2 = sub_key(root->Key(), keybits, root->Bits()); - return leftcalc <= left && rightcalc >= right; -#else - return true; -#endif -} + if (skey != key2) { + return nullptr; + } -TrieNode* TrieEngine::Find(uint160_t key, TrieNode *root, uint32_t keybits){ - if(!root) - return 0; - if(root->Type() == NODE_LEAF){ - //printf("Key: %s %s\n", key.GetHex().c_str(), root->Key().GetHex().c_str()); - if(root->Key() == key) - return root; - else - return 0; - } - if(root->Type() != NODE_BRANCH) - return 0; + bool isRight = ((key >> (159 - (keybits + root->Bits()))) & 1) != 0; + return Find(key, isRight ? root->m_right : root->m_left, keybits + root->Bits() + 1); + } - if(root->Type() == NODE_BRANCH){ - uint160_t skey = sub_key(key,keybits,root->Bits()); - uint160_t key2 = sub_key(root->Key(),keybits,root->Bits()); - //printf("Keys: %s, %s\n", skey.GetHex().c_str(), key2.GetHex().c_str()); - if(skey!=key2) - return 0; - - if(((key >> (159 - (keybits + root->Bits()))) & 1) != 0){ - //printf("Right\n"); - return Find(key,root->m_right,keybits + root->Bits() + 1); - } - //printf("Left\n"); - return Find(key,root->m_left,keybits + root->Bits() + 1); - } - return 0; + return nullptr; } From 1bbfb6540ec652b01f46880a215c58e3f13d28cb Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Sat, 9 Dec 2023 20:45:37 +1000 Subject: [PATCH 19/22] Deadlock fix --- src/qt/peertablemodel.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp index fe25cec..724a585 100644 --- a/src/qt/peertablemodel.cpp +++ b/src/qt/peertablemodel.cpp @@ -74,9 +74,15 @@ class PeerTablePriv } } - // Try to retrieve the CNodeStateStats for each node. - for (CNodeCombinedStats &stats : cachedNodeStats) - stats.fNodeStateStatsAvailable = GetNodeStateStats(stats.nodeStats.nodeid, stats.nodeStateStats); + { + TRY_LOCK(cs_main, lockMain); + if (lockMain) + { + // Try to retrieve the CNodeStateStats for each node. + for (CNodeCombinedStats &stats : cachedNodeStats) + stats.fNodeStateStatsAvailable = GetNodeStateStats(stats.nodeStats.nodeid, stats.nodeStateStats); + } + } if (sortColumn >= 0) // sort cacheNodeStats (use stable sort to prevent rows jumping around unneceesarily) From fdfbd2572a0b15e8232f60bfe702ad4f5aeb1868 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Fri, 15 Dec 2023 11:37:01 +1000 Subject: [PATCH 20/22] General Optimizations - Phase 1 --- src/addrman.h | 6 +- src/base58.h | 2 +- src/chainparams.cpp | 22 +-- src/checkqueue.h | 2 +- src/hashblock.h | 9 - src/json/json_spirit_reader_template.h | 4 +- src/json/json_spirit_utils.h | 2 +- src/json/json_spirit_value.h | 2 +- src/leveldb/db/version_edit.h | 4 +- src/main.cpp | 264 ++++++++++++------------- src/mruset.h | 2 +- src/net.h | 4 +- src/qt/bitcoin.qrc | 30 --- src/qt/clientmodel.cpp | 60 +++--- src/qt/clientmodel.h | 26 ++- src/qt/guiconstants.h | 2 +- src/qt/res/movies/spinner-005.png | Bin 8637 -> 0 bytes src/qt/res/movies/spinner-006.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-007.png | Bin 8641 -> 0 bytes src/qt/res/movies/spinner-008.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-009.png | Bin 8669 -> 0 bytes src/qt/res/movies/spinner-010.png | Bin 8637 -> 0 bytes src/qt/res/movies/spinner-011.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-012.png | Bin 8641 -> 0 bytes src/qt/res/movies/spinner-013.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-014.png | Bin 8669 -> 0 bytes src/qt/res/movies/spinner-015.png | Bin 8637 -> 0 bytes src/qt/res/movies/spinner-016.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-017.png | Bin 8641 -> 0 bytes src/qt/res/movies/spinner-018.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-019.png | Bin 8669 -> 0 bytes src/qt/res/movies/spinner-020.png | Bin 8637 -> 0 bytes src/qt/res/movies/spinner-021.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-022.png | Bin 8641 -> 0 bytes src/qt/res/movies/spinner-023.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-024.png | Bin 8669 -> 0 bytes src/qt/res/movies/spinner-025.png | Bin 8637 -> 0 bytes src/qt/res/movies/spinner-026.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-027.png | Bin 8641 -> 0 bytes src/qt/res/movies/spinner-028.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-029.png | Bin 8669 -> 0 bytes src/qt/res/movies/spinner-030.png | Bin 8637 -> 0 bytes src/qt/res/movies/spinner-031.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-032.png | Bin 8641 -> 0 bytes src/qt/res/movies/spinner-033.png | Bin 8629 -> 0 bytes src/qt/res/movies/spinner-034.png | Bin 8669 -> 0 bytes src/qt/transactiontablemodel.cpp | 125 ++++++------ src/triesync.cpp | 73 ++++--- src/txdb.cpp | 28 +-- src/util.h | 20 +- 50 files changed, 296 insertions(+), 391 deletions(-) delete mode 100644 src/qt/res/movies/spinner-005.png delete mode 100644 src/qt/res/movies/spinner-006.png delete mode 100644 src/qt/res/movies/spinner-007.png delete mode 100644 src/qt/res/movies/spinner-008.png delete mode 100644 src/qt/res/movies/spinner-009.png delete mode 100644 src/qt/res/movies/spinner-010.png delete mode 100644 src/qt/res/movies/spinner-011.png delete mode 100644 src/qt/res/movies/spinner-012.png delete mode 100644 src/qt/res/movies/spinner-013.png delete mode 100644 src/qt/res/movies/spinner-014.png delete mode 100644 src/qt/res/movies/spinner-015.png delete mode 100644 src/qt/res/movies/spinner-016.png delete mode 100644 src/qt/res/movies/spinner-017.png delete mode 100644 src/qt/res/movies/spinner-018.png delete mode 100644 src/qt/res/movies/spinner-019.png delete mode 100644 src/qt/res/movies/spinner-020.png delete mode 100644 src/qt/res/movies/spinner-021.png delete mode 100644 src/qt/res/movies/spinner-022.png delete mode 100644 src/qt/res/movies/spinner-023.png delete mode 100644 src/qt/res/movies/spinner-024.png delete mode 100644 src/qt/res/movies/spinner-025.png delete mode 100644 src/qt/res/movies/spinner-026.png delete mode 100644 src/qt/res/movies/spinner-027.png delete mode 100644 src/qt/res/movies/spinner-028.png delete mode 100644 src/qt/res/movies/spinner-029.png delete mode 100644 src/qt/res/movies/spinner-030.png delete mode 100644 src/qt/res/movies/spinner-031.png delete mode 100644 src/qt/res/movies/spinner-032.png delete mode 100644 src/qt/res/movies/spinner-033.png delete mode 100644 src/qt/res/movies/spinner-034.png diff --git a/src/addrman.h b/src/addrman.h index ecfba3a..536e62b 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -331,7 +331,7 @@ class CAddrMan READWRITE(info); am->mapAddr[info] = n; info.nRandomPos = vRandom.size(); - am->vRandom.push_back(n); + am->vRandom.emplace_back(n); if (nUBuckets != ADDRMAN_NEW_BUCKET_COUNT) { am->vvNew[info.GetNewBucket(am->nKey)].insert(n); @@ -349,10 +349,10 @@ class CAddrMan { info.nRandomPos = vRandom.size(); info.fInTried = true; - am->vRandom.push_back(am->nIdCount); + am->vRandom.emplace_back(am->nIdCount); am->mapInfo[am->nIdCount] = info; am->mapAddr[info] = am->nIdCount; - vTried.push_back(am->nIdCount); + vTried.emplace_back(am->nIdCount); am->nIdCount++; } else { nLost++; diff --git a/src/base58.h b/src/base58.h index 97cb015..63fa926 100644 --- a/src/base58.h +++ b/src/base58.h @@ -262,7 +262,7 @@ class CBitcoinSecret : public CBase58Data assert(vchSecret.IsValid()); SetData(Params().Base58Prefix(CChainParams::SECRET_KEY), vchSecret.begin(), vchSecret.size()); if (vchSecret.IsCompressed()) - vchData.push_back(1); + vchData.emplace_back(1); } CKey GetKey() diff --git a/src/chainparams.cpp b/src/chainparams.cpp index b1acdd4..81499ab 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -64,7 +64,7 @@ class CMainParams : public CChainParams { bnProofOfWorkLimit = ~uint256(0) >> 20; nSubsidyHalvingInterval = 210000; -//printf("Target: %s\n", GetTargetWork(4096.0).GetHex().c_str()); exit(0); + //printf("Target: %s\n", GetTargetWork(4096.0).GetHex().c_str()); exit(0); // Build the genesis block. Note that the output of the genesis coinbase cannot // be spent as it did not originally exist in the database. @@ -80,21 +80,21 @@ class CMainParams : public CChainParams { txNew.vout[0].nValue = MAX_MONEY; //All coins created in genesis txNew.vout[0].pubKey = 0; //Genesis target is coinbase txNew.nLockHeight=0; - string msg = "2014/07/27 - Epoch Times - How Bitcoin Compares..."; - txNew.msg = vector(msg.begin(),msg.end()); - genesis.vtx.push_back(txNew); + string msg = "2014/07/27 - Epoch Times - How Bitcoin Compares..."; + txNew.msg = vector(msg.begin(),msg.end()); + genesis.vtx.push_back(txNew); genesis.hashPrevBlock = 0; genesis.hashMerkleRoot = genesis.BuildMerkleTree(); - //Build a single trienode to find the hash of the coinbase only trie - TrieNode *coinbase = new TrieNode(NODE_LEAF); - coinbase->SetKey(0); - coinbase->SetBalance(txNew.vout[0].nValue); + //Build a single trienode to find the hash of the coinbase only trie + TrieNode *coinbase = new TrieNode(NODE_LEAF); + coinbase->SetKey(0); + coinbase->SetBalance(txNew.vout[0].nValue); - genesis.hashAccountRoot = coinbase->Hash(); //TODO: get the trie hash - delete coinbase; + genesis.hashAccountRoot = coinbase->Hash(); //TODO: get the trie hash + delete coinbase; genesis.nVersion = 1; - genesis.nHeight = 0; + genesis.nHeight = 0; genesis.nTime = 1406509200; genesis.nNonce = 1041215929; diff --git a/src/checkqueue.h b/src/checkqueue.h index 2f04f37..d0afc8c 100644 --- a/src/checkqueue.h +++ b/src/checkqueue.h @@ -137,7 +137,7 @@ template class CCheckQueue { void Add(std::vector &vChecks) { boost::unique_lock lock(mutex); for (T &check : vChecks) { - queue.push_back(T()); + queue.emplace_back(T()); check.swap(queue.back()); } nTodo += vChecks.size(); diff --git a/src/hashblock.h b/src/hashblock.h index 859b71d..d437125 100644 --- a/src/hashblock.h +++ b/src/hashblock.h @@ -30,8 +30,6 @@ GLOBAL sph_haval256_5_context z_haval; GLOBAL sph_tiger_context z_tiger; GLOBAL sph_ripemd160_context z_ripemd; - - #define fillz() do { \ sph_sha512_init(&z_sha512); \ sph_sha256_init(&z_sha256); \ @@ -145,15 +143,8 @@ inline uint256 Hash7(const T1 pbegin, const T1 pend) sph_sha256 (&ctx_sha256, data,bytes); sph_sha256_close(&ctx_sha256, static_cast(&finalhash)); - free(data); return finalhash; } - - - - - #endif // HASHBLOCK_H - diff --git a/src/json/json_spirit_reader_template.h b/src/json/json_spirit_reader_template.h index 04878a9..0b404b5 100644 --- a/src/json/json_spirit_reader_template.h +++ b/src/json/json_spirit_reader_template.h @@ -309,7 +309,7 @@ namespace json_spirit } else { - stack_.push_back( current_p_ ); + stack_.emplace_back( current_p_ ); Array_or_obj new_array_or_obj; // avoid copy by building new array or object in place @@ -335,7 +335,7 @@ namespace json_spirit } else if( current_p_->type() == array_type ) { - current_p_->get_array().push_back( value ); + current_p_->get_array().emplace_back( value ); return ¤t_p_->get_array().back(); } diff --git a/src/json/json_spirit_utils.h b/src/json/json_spirit_utils.h index 553e3b9..724bf7a 100644 --- a/src/json/json_spirit_utils.h +++ b/src/json/json_spirit_utils.h @@ -33,7 +33,7 @@ namespace json_spirit for( typename Map_t::const_iterator i = mp_obj.begin(); i != mp_obj.end(); ++i ) { - obj.push_back( typename Obj_t::value_type( i->first, i->second ) ); + obj.emplace_back( typename Obj_t::value_type( i->first, i->second ) ); } } diff --git a/src/json/json_spirit_value.h b/src/json/json_spirit_value.h index 7e83a2a..fa2592b 100644 --- a/src/json/json_spirit_value.h +++ b/src/json/json_spirit_value.h @@ -117,7 +117,7 @@ namespace json_spirit static Value_type& add( Object_type& obj, const String_type& name, const Value_type& value ) { - obj.push_back( Pair_type( name , value ) ); + obj.emplace_back( Pair_type( name , value ) ); return obj.back().value_; } diff --git a/src/leveldb/db/version_edit.h b/src/leveldb/db/version_edit.h index eaef77b..859996d 100644 --- a/src/leveldb/db/version_edit.h +++ b/src/leveldb/db/version_edit.h @@ -53,7 +53,7 @@ class VersionEdit { last_sequence_ = seq; } void SetCompactPointer(int level, const InternalKey& key) { - compact_pointers_.push_back(std::make_pair(level, key)); + compact_pointers_.emplace_back(std::make_pair(level, key)); } // Add the specified file at the specified number. @@ -68,7 +68,7 @@ class VersionEdit { f.file_size = file_size; f.smallest = smallest; f.largest = largest; - new_files_.push_back(std::make_pair(level, f)); + new_files_.emplace_back(std::make_pair(level, f)); } // Delete the specified "file" from the specified "level". diff --git a/src/main.cpp b/src/main.cpp index 6cbc074..6bb6d94 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,8 @@ #include +#include +#include #include namespace fs = boost::filesystem; @@ -436,101 +438,74 @@ unsigned int GetLegacySigOpCount(const CTransaction& tx) return nSigOps; } - bool CheckTransaction(const CTransaction& tx, CValidationState &state) { - // Basic checks that don't depend on any context - if (tx.vin.empty()) - return state.DoS(10, error("CheckTransaction() : vin empty"), - REJECT_INVALID, "bad-txns-vin-empty"); - if (tx.vout.empty()) - return state.DoS(10, error("CheckTransaction() : vout empty"), - REJECT_INVALID, "bad-txns-vout-empty"); + // Store the sizes of vin and vout to avoid multiple calls + size_t vinSize = tx.vin.size(); + size_t voutSize = tx.vout.size(); + + // Combined checks for empty transaction inputs and outputs + if (vinSize == 0 || voutSize == 0) + return state.DoS(10, error("CheckTransaction() : vin or vout empty"), + REJECT_INVALID, "bad-txns-vin-empty"); + // Size limits if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_BLOCK_SIZE) return state.DoS(100, error("CheckTransaction() : size limits failed"), - REJECT_INVALID, "bad-txns-oversize"); + REJECT_INVALID, "bad-txns-oversize"); // Check for negative or overflow output values - uint64_t nValueOut; - try { - nValueOut = tx.GetValueOut(); - } catch (int e) { - return state.DoS(100, error("CheckTransaction() : txout total out of range"), - REJECT_INVALID, "bad-txns-txouttotal-toolarge"); - } + uint64_t nValueOut = tx.GetValueOut(); + uint64_t nValueIn = tx.GetValueIn(); - uint64_t nValueIn; - try { - nValueIn = tx.GetValueIn(); - } catch (int e) { - return state.DoS(100, error("CheckTransaction() : txin total out of range"), - REJECT_INVALID, "bad-txns-txintotal-toolarge"); - } - - if(nValueIn < nValueOut){ + if (nValueIn < nValueOut) + { return state.DoS(100, error("CheckTransaction() : txin < txout"), - REJECT_INVALID, "bad-txns-makes-money"); + REJECT_INVALID, "bad-txns-makes-money"); } - //uint64_t nFees = nValueIn - nValueOut; //Check message size - if(tx.msg.size() > MAX_MSG_SIZE){ - return state.DoS(100, error("CheckTransaction() : msg too long"), - REJECT_INVALID, "bad-txns-msg-length"); - } - - if (!tx.IsCoinBase()) { - for (const CTxIn& txin : tx.vin) - { - uint64_t balance=0; - pviewTip->Balance(txin.pubKey,balance); - if(balance > 1800000000 * COIN) - return state.DoS(100, error("CheckTransaction() : txin out of range"), - REJECT_INVALID, "bad-txns-txintotal-toolarge"); - } - } - - // Check for duplicate inputs - set vInOutPoints; - for (const CTxIn& txin : tx.vin) + if(tx.msg.size() > MAX_MSG_SIZE) { - if (vInOutPoints.count(txin.pubKey)) - return state.DoS(100, error("CheckTransaction() : duplicate inputs"), - REJECT_INVALID, "bad-txns-inputs-duplicate"); - vInOutPoints.insert(txin.pubKey); - } - - // Check for duplicate outputs - vInOutPoints.clear(); - for (const CTxOut& txout : tx.vout) - { - if (vInOutPoints.count(txout.pubKey)) - return state.DoS(100, error("CheckTransaction() : duplicate outputs"), - REJECT_INVALID, "bad-txns-output-duplicate"); - vInOutPoints.insert(txout.pubKey); + return state.DoS(100, error("CheckTransaction() : msg too long"), + REJECT_INVALID, "bad-txns-msg-length"); } + // Early return for coinbase transactions if (tx.IsCoinBase()) { - if (tx.vin[0].scriptSig.size() != 0){ - printf("SciptSig: %ld\n", tx.vin[0].scriptSig.size()); + if (tx.vin[0].scriptSig.size() != 0) + { + printf("SciptSig: %ld\n", tx.vin[0].scriptSig.size()); return state.DoS(100, error("CheckTransaction() : coinbase script size"), - REJECT_INVALID, "bad-cb-length"); - } - if(tx.vout.size() != 1){ + REJECT_INVALID, "bad-cb-length"); + } + + if (voutSize != 1) + { return state.DoS(100, error("CheckTransaction() : coinbase outputs"), - REJECT_INVALID, "bad-cb-output"); - } + REJECT_INVALID, "bad-cb-output"); + } + return true; } - else + + // Single loop for duplicate checks + set vInOutPoints; + for (size_t i = 0; i < max(vinSize, voutSize); i++) { - for (const CTxIn& txin : tx.vin) - if (txin.IsNull()) - return state.DoS(10, error("CheckTransaction() : input is null"), - REJECT_INVALID, "bad-txns-input-null"); + if (i < vinSize && !vInOutPoints.insert(tx.vin[i].pubKey).second) + return state.DoS(100, error("CheckTransaction() : duplicate inputs"), + REJECT_INVALID, "bad-txns-inputs-duplicate"); + if (i < voutSize && !vInOutPoints.insert(tx.vout[i].pubKey).second) + return state.DoS(100, error("CheckTransaction() : duplicate outputs"), + REJECT_INVALID, "bad-txns-output-duplicate"); } + for (const CTxIn& txin : tx.vin) + if (txin.IsNull()) + return state.DoS(10, error("CheckTransaction() : input is null"), + REJECT_INVALID, "bad-txns-input-null"); + return true; } @@ -1956,47 +1931,50 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo // Size limits if (block.vtx.empty()) return state.DoS(100, error("CheckBlock() : size limits failed"), - REJECT_INVALID, "bad-blk-length"); + REJECT_INVALID, "bad-blk-length"); // First transaction must be coinbase, the rest must not be, genesis TX is non-standard if ((block.vtx.empty() || !block.vtx[0].IsCoinBase()) && block.nHeight != 0) return state.DoS(100, error("CheckBlock() : first tx is not coinbase"), - REJECT_INVALID, "bad-cb-missing"); + REJECT_INVALID, "bad-cb-missing"); // Coinbase lockheight must be = height - if (block.vtx[0].nLockHeight != block.nHeight){ - return state.DoS(100, error("CheckBlock() : coinbase lockheight != block height"), - REJECT_INVALID, "bad-cb-height"); + if (block.vtx[0].nLockHeight != block.nHeight) + { + return state.DoS(100, error("CheckBlock() : coinbase lockheight != block height"), + REJECT_INVALID, "bad-cb-height"); } - for (unsigned int i = 1; i < block.vtx.size(); i++) - if (block.vtx[i].IsCoinBase()) - return state.DoS(100, error("CheckBlock() : more than one coinbase"), - REJECT_INVALID, "bad-cb-multiple"); - // Check transactions if(block.nHeight!=0){ - for (const CTransaction& tx : block.vtx) - if (!CheckTransaction(tx, state)) + for (auto it = block.vtx.begin(); it != block.vtx.end(); ++it) + if (!CheckTransaction(*it, state)) return error("CheckBlock() : CheckTransaction failed"); } //Check for multiple limit updates or withdrawal + limit update combo set setLimit, setWD; - for (const CTransaction& tx : block.vtx){ - if(tx.fSetLimit){ - if(setLimit.count(tx.vin[0].pubKey) || setWD.count(tx.vin[0].pubKey)){ - return error("CheckBlock() : Limit and withdrawal overlap"); - } - setLimit.insert(tx.vin[0].pubKey); - }else{ - for (const CTxIn txin : tx.vin){ - if(setLimit.count(txin.pubKey)){ - return error("CheckBlock() : Limit and withdrawal overlap"); - } - setWD.insert(txin.pubKey); + for (auto it = block.vtx.begin(); it != block.vtx.end(); ++it) + { + if(it->fSetLimit) + { + if(setLimit.count(it->vin[0].pubKey) || setWD.count(it->vin[0].pubKey)) + { + return error("CheckBlock() : Limit and withdrawal overlap"); + } + setLimit.insert(it->vin[0].pubKey); + } + else + { + for (auto txin = it->vin.begin(); txin != it->vin.end(); ++txin) + { + if(setLimit.count(txin->pubKey)) + { + return error("CheckBlock() : Limit and withdrawal overlap"); + } + setWD.insert(txin->pubKey); + } } - } } // Build the merkle tree already. We need it anyway later, and it makes the @@ -2007,24 +1985,25 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo // Check for duplicate txids. This is caught by ConnectInputs(), // but catching it earlier avoids a potential DoS attack: set uniqueTx; - for (unsigned int i = 0; i < block.vtx.size(); i++) { - uniqueTx.insert(block.vtx[i].GetTxID()); + for (const auto& tx : block.vtx) + { + uniqueTx.insert(tx.GetTxID()); } + if (uniqueTx.size() != block.vtx.size()) return state.DoS(100, error("CheckBlock() : duplicate transaction"), - REJECT_INVALID, "bad-txns-duplicate", true); - - unsigned int nSigOps = 0; - for (const CTransaction& tx : block.vtx) - { - nSigOps += GetLegacySigOpCount(tx); - } + REJECT_INVALID, "bad-txns-duplicate", true); + unsigned int nSigOps = 0; + for (const auto& tx : block.vtx) + { + nSigOps += GetLegacySigOpCount(tx); + } + // Check merkle root if (fCheckMerkleRoot && block.hashMerkleRoot != block.vMerkleTree.back()) return state.DoS(100, error("CheckBlock() : hashMerkleRoot mismatch"), - REJECT_INVALID, "bad-txnmrklroot", true); - + REJECT_INVALID, "bad-txnmrklroot", true); return true; } @@ -2040,8 +2019,7 @@ bool static WriteBlockPosition(CBlockIndex *pindexNew, const CBlock &block, cons pindexNew->nStatus = (pindexNew->nStatus & ~BLOCK_VALID_MASK) | BLOCK_VALID_TRANSACTIONS; return pblocktree->WriteBlockIndex(CDiskBlockIndex(pindexNew)); - } - +} bool static AcceptBlockHeader(const CBlockHeader &block, CValidationState& state, CBlockIndex* &pindexNew) { @@ -2582,48 +2560,42 @@ FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly) { bool static LinkOrphans(const uint256 *phashParent) { bool fWorkDone = false; - const uint256 &hashGenesisBlock = Params().HashGenesisBlock(); + const auto &hashGenesisBlock = Params().HashGenesisBlock(); - deque::iterator> vTodo; + deque::iterator> vTodo; if (phashParent) { - map::iterator itpar = mapBlockIndex.find(*phashParent); + auto itpar = mapBlockIndex.find(*phashParent); if (*phashParent == uint256(0) || (itpar != mapBlockIndex.end() && itpar->second->nHeight != -1)) { - multimap::iterator it = mapOrphanBlocksByPrev.find(*phashParent); - while (it != mapOrphanBlocksByPrev.end() && it->first == *phashParent) { //How would it->first ever not be phashParent? - vTodo.push_back(it); - it++; + auto it = mapOrphanBlocksByPrev.find(*phashParent); + while (it != mapOrphanBlocksByPrev.end() && it->first == *phashParent) { + vTodo.emplace_back(it); + ++it; } } } else { - // First find unconnected blocks whose parent is connected. - for (multimap::iterator it = mapOrphanBlocksByPrev.begin(); it != mapOrphanBlocksByPrev.end(); ) { - multimap::iterator itnow = it++; + for (auto it = mapOrphanBlocksByPrev.begin(); it != mapOrphanBlocksByPrev.end(); ) { + auto itnow = it++; if (itnow->second->fConnected) { mapOrphanBlocksByPrev.erase(itnow); continue; } - map::iterator itprev = mapBlockIndex.find(itnow->first); + auto itprev = mapBlockIndex.find(itnow->first); if (itnow->first == uint256(0) || (itprev != mapBlockIndex.end() && itprev->second->fConnected)) { - vTodo.push_back(itnow); + vTodo.emplace_back(itnow); } } } - // Iterate as long as such parent-connected unconnecteds exist, adding children to the - // queue after adding a node. while (!vTodo.empty()) { - multimap::iterator it = vTodo.front(); - uint256 hashPrev = it->first; - CBlockIndex *pindex = it->second; - mapOrphanBlocksByPrev.erase(it); + auto [hashPrev, pindex] = *vTodo.front(); + mapOrphanBlocksByPrev.erase(vTodo.front()); vTodo.pop_front(); - //printf("vtodo\n"); + if (hashPrev == uint256(0)) { if (pindex->GetBlockHash() != hashGenesisBlock) { continue; } - // Deal with the genesis block specially. pindexGenesisBlock = pindex; pindex->fConnected=true; pindex->nChainWork = pindex->GetBlockWork(); @@ -2641,21 +2613,16 @@ bool static LinkOrphans(const uint256 *phashParent) { } } fWorkDone = true; - //printf("going to insert %d\n", pindex->nStatus); + if (!(pindex->nStatus & BLOCK_FAILED_MASK) && ((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TREE)){ - //printf("insert\n"); - pindex->nSequenceId = ++nBlockSequenceId; + pindex->nSequenceId = ++nBlockSequenceId; setBlockIndexValid.insert(pindex); - }else{ - //printf("Couldn't insert %d\n", pindex->nStatus); - } - const uint256 &hashBlock = pindex->GetBlockHash(); - multimap::iterator itadd = mapOrphanBlocksByPrev.lower_bound(hashBlock); + } + const auto &hashBlock = pindex->GetBlockHash(); + auto itadd = mapOrphanBlocksByPrev.lower_bound(hashBlock); while (itadd != mapOrphanBlocksByPrev.end() && itadd->first == hashBlock) - vTodo.push_back(itadd++); + vTodo.emplace_back(itadd++); } - //printf("linkorphans dones\n"); - //printAffairs(); return fWorkDone; } @@ -2699,9 +2666,20 @@ bool static LoadBlockIndexDB() if (!pblocktree->LoadBlockIndexGuts()) return false; -printAffairs(); + printAffairs(); + + // Start timer + auto start = std::chrono::high_resolution_clock::now(); + LinkOrphans(); -printAffairs(); + + // Stop timer and calculate duration + auto stop = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(stop - start); + + LogPrintf("Time taken by LinkOrphans: %lld microseconds\n", duration.count()); + + printAffairs(); boost::this_thread::interruption_point(); diff --git a/src/mruset.h b/src/mruset.h index c36a0c8..7927499 100644 --- a/src/mruset.h +++ b/src/mruset.h @@ -45,7 +45,7 @@ template class mruset set.erase(queue.front()); queue.pop_front(); } - queue.push_back(x); + queue.emplace_back(x); } return ret; } diff --git a/src/net.h b/src/net.h index fd9d4fc..9a0a52a 100644 --- a/src/net.h +++ b/src/net.h @@ -403,7 +403,7 @@ class CNode // SendMessages will filter it again for knowns that were added // after addresses were pushed. if (addr.IsValid() && !setAddrKnown.count(addr)) - vAddrToSend.push_back(addr); + vAddrToSend.emplace_back(addr); } @@ -420,7 +420,7 @@ class CNode { LOCK(cs_inventory); if (!setInventoryKnown.count(inv)) - vInventoryToSend.push_back(inv); + vInventoryToSend.emplace_back(inv); } } diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index 263ff5f..703e8a3 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -53,36 +53,6 @@ res/movies/spinner-002.png res/movies/spinner-003.png res/movies/spinner-004.png - res/movies/spinner-005.png - res/movies/spinner-006.png - res/movies/spinner-007.png - res/movies/spinner-008.png - res/movies/spinner-009.png - res/movies/spinner-010.png - res/movies/spinner-011.png - res/movies/spinner-012.png - res/movies/spinner-013.png - res/movies/spinner-014.png - res/movies/spinner-015.png - res/movies/spinner-016.png - res/movies/spinner-017.png - res/movies/spinner-018.png - res/movies/spinner-019.png - res/movies/spinner-020.png - res/movies/spinner-021.png - res/movies/spinner-022.png - res/movies/spinner-023.png - res/movies/spinner-024.png - res/movies/spinner-025.png - res/movies/spinner-026.png - res/movies/spinner-027.png - res/movies/spinner-028.png - res/movies/spinner-029.png - res/movies/spinner-030.png - res/movies/spinner-031.png - res/movies/spinner-032.png - res/movies/spinner-033.png - res/movies/spinner-034.png locale/bitcoin_ach.qm diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index d8ff24a..33aacde 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -27,12 +27,8 @@ static const int64_t nClientStartupTime = GetTime(); ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) : QObject(parent), optionsModel(optionsModel), peerTableModel(0), - cachedNumBlocks(0), cachedNumHeaders(0), - cachedReindexing(0), cachedImporting(0), - cachedTrieOnline(0), cachedTotalMissing(0), - cachedTrieComplete(0), cachedValidating(0), - cachedProgress(0), nProgress(0), - numBlocksAtStartup(-1), pollTimer(0) + cachedState({0, 0, 0, 0, false, false, false, false, 0.0}), + nProgress(0), numBlocksAtStartup(-1), pollTimer(0) { peerTableModel = new PeerTableModel(this); pollTimer = new QTimer(this); @@ -138,35 +134,25 @@ double ClientModel::getVerificationProgress() const return Checkpoints::GuessVerificationProgress(chainActive.Tip()); } -void ClientModel::updateTimer() -{ - // Some quantities (such as number of blocks) change so fast that we don't want to be notified for each change. - // Periodically check and update with a timer. - int newNumBlocks = getNumBlocks(); - int newNumHeaders = getNumHeaders(); - int totalMissing = getTotalMissing(); - int trieComplete = getTrieComplete(); - - //printf("Tick\n"); - - // check for changed number of blocks we have, number of blocks peers claim to have, reindexing state and importing state - if (cachedNumBlocks != newNumBlocks || cachedNumHeaders != newNumHeaders || - cachedReindexing != fReindex || cachedImporting != fImporting || cachedTrieOnline != fTrieOnline || - cachedTotalMissing != totalMissing || cachedTrieComplete != trieComplete || cachedValidating != fValidating || - cachedProgress != nProgress) - { - cachedNumBlocks = newNumBlocks; - cachedNumHeaders = newNumHeaders; - cachedTotalMissing = totalMissing; - cachedReindexing = fReindex; - cachedImporting = fImporting; - cachedTrieOnline = fTrieOnline; - cachedTrieComplete = trieComplete; - cachedValidating = fValidating; - cachedProgress = nProgress; - - // ensure we return the maximum of newNumBlocksTotal and newNumBlocks to not create weird displays in the GUI - Q_EMIT numBlocksChanged(newNumBlocks, newNumHeaders); +void ClientModel::updateTimer() { + // Create a new state + ClientModelState newState = { + getNumBlocks(), + getNumHeaders(), + getTotalMissing(), + getTrieComplete(), + fReindex, + fImporting, + fTrieOnline, + fValidating, + nProgress + }; + + // Compare the new state with the old one + if (memcmp(&cachedState, &newState, sizeof(ClientModelState)) != 0) { + // If they're different, update the old state and emit signals + memcpy(&cachedState, &newState, sizeof(ClientModelState)); + Q_EMIT numBlocksChanged(cachedState.numBlocks, cachedState.numHeaders); } Q_EMIT bytesChanged(getTotalBytesRecv(), getTotalBytesSent()); @@ -262,8 +248,8 @@ QString ClientModel::dataDir() const // Handlers for core signals static void NotifyBlocksChanged(ClientModel *clientmodel) { - // This notification is too frequent. Don't trigger a signal. - // Don't remove it, though, as it might be useful later. + // This notification is too frequent. Don't trigger a signal. + // Don't remove it, though, as it might be useful later. } static void NotifyNumConnectionsChanged(ClientModel *clientmodel, int newNumConnections) diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h index a1508eb..27bc16f 100644 --- a/src/qt/clientmodel.h +++ b/src/qt/clientmodel.h @@ -6,6 +6,7 @@ #define CLIENTMODEL_H #include +#include class AddressTableModel; class OptionsModel; @@ -38,6 +39,18 @@ class ClientModel : public QObject { Q_OBJECT +struct ClientModelState { + int numBlocks; + int numHeaders; + int totalMissing; + int trieComplete; + bool reindex; + bool importing; + bool trieOnline; + bool validating; + double progress; +}; + public: explicit ClientModel(OptionsModel *optionsModel, QObject *parent = 0); ~ClientModel(); @@ -85,16 +98,9 @@ class ClientModel : public QObject OptionsModel *optionsModel; PeerTableModel *peerTableModel; - int cachedNumBlocks; - int cachedNumHeaders; - int cachedTotalMissing; - int cachedTrieComplete; - bool cachedReindexing; - bool cachedImporting; - bool cachedTrieOnline; - bool cachedValidating; + ClientModelState cachedState; + int numBlocksAtStartup; - int cachedProgress; QTimer *pollTimer; @@ -116,4 +122,4 @@ public Q_SLOTS: void updateAlert(const QString &hash, int status); }; -#endif // CLIENTMODEL_H +#endif // CLIENTMODEL_H \ No newline at end of file diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index a7fcd9a..da1e3b3 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -39,7 +39,7 @@ static const int MAX_PAYMENT_REQUEST_SIZE = 50000; // bytes #define EXPORT_IMAGE_SIZE 256 /* Number of frames in spinner animation */ -#define SPINNER_FRAMES 35 +#define SPINNER_FRAMES 5 #define QAPP_ORG_NAME "Mini-Blockchain" #define QAPP_ORG_DOMAIN "cryptonite.info" diff --git a/src/qt/res/movies/spinner-005.png b/src/qt/res/movies/spinner-005.png deleted file mode 100644 index 153330fcd66154be58e01069d9d090433176438d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8637 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�%X}Oi^pk^sgmG`fdU0z`I%;Byr@?jhb zY?n{PJ&Y+s;v|aQ9EB>Gd^B{sd6h=*vG2$VCinDuW0?E7V}>4M1JEo};U#K1Q{Pub zRY^Ioap-^lx_9nDT1(FR8~U)gsEc@Kt}px%ZR$@H(iLPQFsdGu`j{fB4~Z@Y<2u7f zfd*%}Psf{RP2+|>{lQJ6-_JLQ=I@{oaCheXmBkfJzsNQ%te3tYgDe9|>lD}-=<0SJ z^^?vD=m4nHx`6z#lWJS^wm3ktGpp=5LI&2H*w*HB8Rhs1Tl28$?S;w@7EHJkA+A-) zcq&ril6+wL=Gfey8yjL3>t_(@cs<$&Q_!W?%6xdaswt}L35AZL;fd9m{cp^2hf+)i zCx!;fKcgPQ>XsjWO5d6Nxqq^R<-$W z6mxmoL|*B2T@+RTpMv#4E`U9PJ~{SrxAKQMKV+r;OFiQk3r=r251Vr7Uq42)3LK6M zeP-lB-Cyt4{Mff^NL8~i6SF(t`CLQif0C~)pXkJtHBx*6Ak`|E=6~~+kG0!&Ae_6x z=#gWUG!qlk-vYQA`p@^XXVrh@$<|IdX}OVXI@F-#n~2ULTf~Rh#1=Q$2<7cf9v79x z(=Wf0Dj<93av71VW*9FXRxg1Cf56aimt!1dcv9gO9miQdc{o)nVU+8!zP2^fBkfwV zsDtf-s(9?iI=g`4PRg~)X!q!?vohj;qk<$Xgu{N~&x$fx_*PBV8JhC70B6Ym+m0*p z2tUBujH>Wbd80n0R#RCIC{*p|+wh6}o8oB!#q-fT#Y5FnwXv{?Zi8I0Y!n9Kz4try z7=-d!?@w|ce)6|JOY)DxZylRFtN}J;WUffnc{vg@#$=xY9S4 zTwdf{Avv$07}12~j`Cu5>&Z(;lH0JJ>b{`m?yrHoJ1Vj;%=#(Q@+EW$)K$K*U6z*{ zv?aHk6|~ODdOYJiEwL}AN0cn4bVqj}osTgDs#Zx>?yko?G8p&2@w_~;?r6RLdt<`L zxj|}q8QL+@Ysv@NpZ`(QdR`z@tbqn^Si#kUNc#^2TIy`5CsF?=4XLG>tv<`wGynG;OBo|8ox^s`ewk1N`qQ(P>sm zk%#$HjJ|M$@(vOQ)`w_a==`m?k8Gw1xD=0PSRvo^$h$GCpy8T^RSAzJygWK3zd~1h zrY+XDIwT2;v|!>?<}jp2vK=b%*~8_S->;wW5Lv{Ie00!u!!bv*MLf3SX(@xg50iB=;ZnzG@+b*w|l&P?ceyjuHjBWI$*x;cfq%&MNY7_I4SKs z*d~JuA3DdvbGrVUv(m+B!25!*ocU+^EPEWxN?+jxq0S^F6}atthy*)AX+UF?`e?^` z&CqOcoAaBJt94#Q6GpSk6rlMNo4~|p6fIyS;x@M3IVk%1iVFQ_6pqaCo<~akz5A~I z4ElWDCGTp^AOotgl^0_ubCdU|(|GPBMBE;!o8R|HWuin>3XhqBX)CCu>d&PUllR=% z%X?y%tY9k>px2h9n6C~n)HTf|<~DBC^*qnzjpqju6$a3*t<}-@C;8Mo3RI{*T5*M6 zqS+mTtt*+**NXS1RlNl;yjD8dZr748^nh*A8Uamr?}zd2Cc@SwmkNE9q-uTYVTqpn zW?Ki>r@e1Kynk!_B6}W|lkA7gOiUttTjc-@6is!N(0mMrl*neRY3*@C?E7&W8} zb{y-f*-$uYgX*CGTaXC!H<4x>c$zXp#JIb^tKl5pvtgU1CD}kPBDNO@NULLFj}zB% z+_S4|VLP~+%^d6R5>5CXC(675v3}S4m{}qshR3Bjfc*O)+qYo8dPCGmC~r-K(z!?h zC{Y5@PNG;TMxo|W1W;#3QD$77w^(})%+0;3P0!fNO+2hV2~_Ate`gm9r-<()=O#pd(N7F_h;m@KK$%4Q1RIIxBPPLGaTa zu!Y|?cSq{hpN5%#(9|n@)(2uYI4|4Gg31W5X~k%DfV%m*_3RaF1>#+$g`W|}abMUY z)nmb0@`4?_)PFBitSMh<1>-Dst)N@K=V^oP#=Q}|TolQe=Ur?lc*OX_AwZZ-Cp%w> z4W+G0H#$^z%lJ@*=ygDmxC&TR{F)=JntwU9`CabV@0W0>7#+(yXSm|^ctZNktXQ{( zl0eum_%I)@{V)yVJnrJem?*)vyCeePxqpJ1G?|tdxBnqX(f}12bi_v7;S~G6K(1f}pc$OZVEqp86UOyEn}aVmo}?^{Y8nfs z==r3!&rsp%5x5Jf>b%8rqFN2(Uyk?%sftu@JM;yT8Q2LQ+D3_Mw%L=v2Ac(*P4&LAc*V4uq60Chy2JA$ z*GJIz*p6Ix7Fic>UUb|C)=IL%27w8)sdl+wZ$cV8=0SgR)QC#W_+yp&FZ0)Q1aY?K zzrfc#n>mK32K*1V-Q(ej64_m%h<4*mI<+c;H!9wo;s~>zVUs95#)5<6-bD8?C*X-O zir8Rcj(9X%#sDi8@it3(4lxE4;8)1k_(PJBHNC+srecdm2r-u+wY)N^7@MLPMB|V& zBP}L1CMB}N#BpY5_CugPqb;=#ac!C;p16DM@Vd1YR^NgPoQNh%TcA132~Ru^y#eDp zZ_ah2#Gg!zGGnppA_!6DIEktm3x8+#<3DOk#YfBJt_l=ia%6Fzn;)*tnC!?s9C5ln z*)yeu5?^;-@Gex&(4VR==UUCj-QUVKcgsG7w1M&K{8fV5v*`szpzSRA1I+lveY3;_ z-$s}wvVROad_n9}2=DInT6hxNt-)uBu$wyLboy6ZQxe{Cz_(UM?txjOEc$6lrVh)Sf4;b1yo20A|rJKt8n6T zH*B>D;}6IXe_BJZlc`cZ#$9Fs@R|vkH?N-&EOuRvNu9pcSpMO{_G;G8kYLDUn=(S=HV?+9)lE{&(ZbvF^$0GAyTtcwdeiPdfK z9ru`z-lEmYeICelgVUVVOoyHr@W+W%@FGN>p#0#O#E27~tPyQ%3YoFwG6yD;a+mE3Y=9zSuE|H!F9T=-oX?fB$dki}_;N z)y(N_UOxcZk!sP)qKpd*YK|wHu;TB&g@@5ye{&ek#mN0JZ z9?!~_kX>U0E*dXK>iPp{JS)8o69L>47-2YHw=uUy!+SyqE$9B zo{75wzp+G+Yer^V!Fpb6(!~qmSsD=F(=ZB=IhZbgR&oRi-t0#+aN=`5QS{w;pzw!@ zr$FeqczAB^qtr7HIRo_of>OChsRn<>%p;CIA3u_QeYZ0Ikks{ALOqLO(1I`-9yu#y z&nv#H0w+gri_A}ylm$ttlPz7_tFguI!muXsDOq5PA6l#)PFG+t1Z(j8;`!T@c8&AQ zly-!&Ot|$(rB;FoK&N1D0(9Q;8ayBod5J|$O&(h@-~IIckbAZ&h$#rM?YdHTj@tjh zFBAO`#<##1SU*nCGk@;n1SJ=LL(`2$>IopMd*d&Fr;O0$o^}%o=~zRqslUGyC&BKN z9_-I8PKcAC4tO@+JxA{QDd{yxnn%9v2hJ; z!Aj22LiLeX++8HK?0a1cyOYxw)$jgRO&Mk+gWR7Z24#!A@cPqc&H6^ ziap|9bAw_p2+#ghTbvWL0mi07QYSz#J)AXxRwtS`)EQtUrv_DG~v#4-m9duu6Q1hpAIu~FKZlPAKR9T2W0s?t+7O_*PemU4{wltQ#+?L3Y)>9 zw^)h*i%7rfv!Zbbhi=Ph=6w~o@rf}Z#Ote(tnrVES0c*tUdi}e+tt1XB$c}SI=Kk`2~H%#vvt=-S} zW}(iPXV34&6)=$=H2%>7iWv*v1D(z=0~PmwN1-zqTh^Q3r&$iU{CxqQlM_YYy;R#3 z>6`Jg<}LL!BQ2fG2d{QhXanjT*i59z&l6+ zUl&I9DgHgyBN;Xx{yt-|dw4v+=Xq~DkH+mIF_`6fQ}vrCiRd~NL#HOt>S`}hdFXk6 zcafmwih4PcEmJfzoxDI)_0%5D!nK3MU`Za}$}y1AZ|fvq&gO{LD&tIv}Ew)Rr41U?ZeZzYZgrj3}Tq1zpkX?bnxy6~3To`-()6Od6^Jp0j69Yv z2FYUvO(HtBFu9^nbYi(6e!dx#+x%D43;NXQ47qHL4U&f-l-~oCzxvtSJQVK9zUZna4xA&1(BU%UldF#9U`7A$e!qM`ziaENu>dTj_4V@rNillS)(>mCUZC^ZDA@9@P%}sm5LrZvg zdxi@hNSn>5l?|p(wDCOQ%k13IEzioviwiZ!h3U=oC`>1wK(m#C51+uL>u?gMI?s z@uGHS>MQEUy7A|46fHvBrBRag9*8qteL&)^2Cz8w#Th&N&k{=wP7+c5RE*Ywbsnol zWW!e$zumRIgd1)ePLUa%(R7>Jf24FU?9vpbFIh)A-!Hr2fvDk3BJ$$FQm)816O^)U zUJrbh1AkbSvPHj+otm2BZ{tTkVW1KWwTH&#b*R6gy=Q`w7YE-WAfQpNSCHm>8db&Z zqX%uz?H>)uv&&zuge{>b>ua^~L^^4BwJ!-7q3?+!&%UU5rt;y~8rmgI;IO~hblsV( z*ghFm?BH(a9qy9*v*V>R4tDPZd_B;!LHH_prm*9SjYute{#rM}CR7{aD1ot7zL*%n zjh$meL=tIuk*Mq#r-!eq6!dv@zGk=Haob^FjkqKr@zS*3KO%_<@fa})R?1dmB_wWZ zX15BoQh)4mj946OQNG@2WUY9Lu#f71WS+xeRuT zCmxMc5Rxt}_Ry%LDA&%n73q6H7k#Id+WVVJUgt(r_u_tP|0uYix}D>889cfpGgosx z$wGgEshKXTZl7A4d%09eLo)jx;bpW=fDHzl?_6-XcuuDSq>iU)icZKsr6p8B>Z;l` z)~^J2a~s~XdMf7+xQ)4`HiCwyH47N- z;8U%O`^Lv8$qRz8KFrb(AI+h87eX5E3C<%xOjGnITNVgFX~yTs<7Qk(u`vnDKe=WT zbkb{L{w!xvQuz$*v@E}w(^3v9#IAlbTM~XHEbzIyoq27;>QqZOqdwrcm!21kGcjef z1H?^h@p6NfMm#dMkMdxE6tT`7rU&VQZNdeL@_9Rj0{6o^`#+W;ciTF_gChU`^@0ES gyRE-i)~%u@^e`xhIuIXw)dELTP5Vi;idE?U0x-Y1%>V!Z diff --git a/src/qt/res/movies/spinner-007.png b/src/qt/res/movies/spinner-007.png deleted file mode 100644 index 8bff4d7490150d3fd930dcf7157b6b81b2bb9bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8641 zcma)ibySp3^f#T0G%Q^zO9+dA^ir~f(kLL!O1FT7G|Qr}uym(1NGT!ROG=lB^b(46 z=eytEdCz(Oc>npGGxN-ubDp_#pJzVz&gb5lPdZwv6lBa~I5;>I>T1vRuxsl?rr|1 z*3T_%-9TzagXI2V8iPAdP28?Kco9~>|4rF3=4(KQ_#Jc+H!`-cNctUZytT2xD0yt} zx7=O*E%90M+iL0K>j4A)Ul|zVxWDMHxAxHiIC`CI$=_d|9QJeM%HEz#B{nVxWyW_5 z#Q?s+-dvBYXEx_ahci9S&(7Ar`HNl;x&w=NzeAe_P)AIgsehH@g)fZ= zFdZk8FL2EhuMvH*MX}O0T z6l1hm3b*2;-#E;tyv_7Wmz3QpCnAgIQv0eqy^p?uItqKd8)p7mjkg`|MK@J}_t{5L zitVeX#$2tbH;(s5!@{{i>nzKb!A{5XFw`aS%KPEY!z#0u*42nD$p`zG`5AZ5b$NC+@ z&!^ki%}u-l%~x_}W@dIqvt@1}CjV&1^CLNe(r%q^S~Mp`U-IAYXa_Hh3qD1*dn7lx zO)k6lP$cdL-(M&Ga&4*fi5RiQZSmR9(Q`k&2JkSR2s8QMY)SFT-yNcOeSUizR%u3lbkSacjdkv69KV-Hm~-ESK8@6H_gMezI`7~ z);pNO%p0A)2u=8)1XUD~1W=WFq~&3<{FHbkfGev#k!`r2Q@45T?`KWiH1{YHnO9Lk zCp_{L`7=PTuuwdwW$?T1i(V`$$G%3xtE@wqt1te!1iIo`;CJQ*w&VBisAc3JCkk}Cg;SD57j^@ajJfrqhl8Um6 z8+o0eGNM-($?jiDcc!C=tMl-vEQ1Q8c)?nb#ackMSa3U4qJ4dD@fxy6NpUj}&yy%> zH|mRd825|{l_UxD&`|N36Ua6f1v{ zPnm3ke^f(qrFkPCdPje#V+)A)w2D@>nS|6-(Q5a4atZ@;SA0pJBwD$=TDg&xBd?73 zH=beM733q%Jxy}Mi7BDUV|)o6V|+gAb)9_QP?0OhQ~c{f44}r8==I_<5YzG|$8m+d z`|kFdrDO}xgp5?UJKz1eer{Lv(}$De!}*>~Cj4!nl5}eoPT$0)GP^AkvLQ4hQgfn{ zVI}Y&>}WKEv5$P!>~M29BYrrp-;9VIu#ki*23__?<1dxC+_k`GaoMlRN^&%;KdK`S zs#^Ar(p73Q>D!pU0Wxy(Y&BWzb8zW9n>@Dy^eLEVyMuTU6A?612BwHf2N-++Aq#^W z2(oUuBFK)EQbSwi&gNl#KV8+=%1w()%Ht#VD6-=+ZO2V!z8)P?HI)E6?RfyX>_Z_w zefm~71L>Z=ikwd<%D;P7PDcB^Pomr=Zf+IR7{e_8CHI(!EY!?M{=p3 z-|@vVmq_&C^9v0r7SSXIaTshYK#N7yC(XUGjXG3}p9wfZ`Z@z0HJ%X?5&}@)<0{vB zsdVX(@pU9-20`` z2;&-C9v1JMz31gBnyqTI;-pK!A~T&$#tsTg5<%oNY5x1s3QSxW&H#ZJ9C*m>fH9bV z8-t6vDD5HU6hah=%keAAWy@ceoN5a%;YW0<5Rfn-R_!aLyE0j|)TjhI#uO1^{_2yG zvUb7G$0Xz$+G#D1l|QbAZ&(ex>*O`$)RZT^n*PGSnXxeNp=wLTn4G72sO9*ioaobG z$JL(-7lCvN2WrMKKziHJkU-y0*-{$H|5>IT+3qmC(%~dA@j}#UEvAdcpn_iPb=K*r zcL&Id+TYhjE^%1C!YUv@OvS;9iWir1u$8OE3kh+b*l^9t5hb|4<5h%@>0KMV9il9` z9lSaSe*qcmEzpQ)>IeT|Mb47w0{Q%1xe_RkbbyKuAta2#7`leqHM(CB_F9xS-eL@h z;SLEh&gIn&$tSVgcjKISF$c!)7}4UiZ-?!DS8Lx4>)CMq`)naYQYaBSO5c1;q6q!C zMw~u|hki_`V&(h2d{xSIVWNF4N}#wzEBi>ZSVbpXuO~4_Gz)zM3Ai{&x?@NC9ISMG z9eaK=kp6T{PEva%OB9LTk&?P3R(-@BmpTqH0no2Yd2YTeIH_v>Q@-OlCbzY&V{EVr zci2?8dI1^8O!Qd-%ybGrd@p`R%+PbjHbA~QUkjUZ3;b*1=R^SG>$t%Pm&jjqQ5JLD zZmZsUW}d#h25f|`0CYMcWF8F2GNGv|BK}B!-x$)FUV^Ynx_7$mH*K*upw*hrmpr|*oEzgg8K9Z4J8 z4?35zD66Wjb}O~F+fkmgnue<3)@d@SDO1{Fx1gX8_qXRL4I?NkuU6LlLDsdsL)p7j zk!CP+(rP;4-=`q9Kpn&#{1Ar$b&9tIQ3e#S){U9ixc(VPbHj}^(9(0I*H8MNVRQ1TO zjIoE)%POQ51~sjM?Hab!>=STQp|OIx11^UxguKH#A;VXAxAue;J|9&ps`TPCLfd!& z3~kS#Vb4nm;EIc(IwK^Fk}o%o9}}BL4`qm#NQMY`QT03)Vv;PmiFlxH3nwWc*H-Hi zX$K35Q)4}G^I-1%%@*3m_q?Mj+x+e0EH;DdeF5Uf9DWBKEOIfZz+KpsU5+1`h0MQ% zF}pscfnqync8fuJz6t&CRoMCIP}?&yH6 zK6!I0_s+|~eO24qYl7x)_*>|F1g_FH;mcPoskjnJvcGP>bvEle9DDYqF2C|_qSfXm z)WvE#``5^doE1s;t5&`>2}F-YhtG!sVkGs@!8`|k_}C-7WN_IhFa(iTmj35pG&qBi zm6pSA{XVKqQp`1EPRVY&s_rz5%MAVM(I@HzD?}s=KxjpO9NZc!FDgm-ks!bw@x7bn zkK4?R`Qn*}K@_yBAw$|?JDhTxTwXe&YGjf(0@$NB)i8W#lU!K7L-uC(N2F4DwH+|< zY0{=+f~jQy*|25YqoN84q~E~s6Q$;KJ=Mflgd#*BJt5MkNWWg76~{yIZX@L{uo^^s zxaL1nhg6ge=;yp?FM#!I;?8IzV(_5$%%Gy`5~6TOXc;=KcCXX+JKQL+7g zFjnV+91$i}$wfvYI69>%-Q9s2`Y94~{``cd#0p3A#SUej43IUsaa4b>Kwdib5Z!Xr3us-84Q?7^i)AKqeZuhzwW zj|c1#m1o38`+%6|3zi!DhCWrVmJq5F2UzN{XUFXgfTW;}-LH(ep^+EC5e5%Ml>q!` zD!weoM}E?=J-N-Qodlx-T2DMg0i{8aRB~1hunTCwA$7i9hxMuGVsYMS97RUvX*~a1-sh^#30N8>19HK2SV?+czAWk{cd!Tzk1{W7akwU6m&vV2$feGAZB{c|DKz?bb!cj`GaX z9uX0`{UBdh0Y0i3%J$tB<<>F$kbH;^m>rsz&f@_BmO+ZzlAC=vXJy|f1cKb4=Srt8 zH!4`o$!ZZKG*l53PGYfT_47vyv?c`2?d^N}B7nFm2S-4UGRmOqn{eCbgnk9s5=_$} zfV+j4AVwiHBggp=?%V2qfcRh&hv1rC?ESv6GfsU%Y-X)RC9JMvW8UAX#|%4zaN!l$ zPF7pt5<>086disYFENH~u)}|NUtvetKfzsQ0}z{H1KF)p!rxsN;}R#1YRio;ZQ+g@ zLinp-i|~@3;o71GCAIR}`FFXFqBV@6F;qK*BaRUwB+BqPdr{z|%-JH7Z(QaU z$-@f$2JWOHK#PYtwxkuqYrPfhO0z_uVP2r!*^m?B9^_?yNfNux+jDr`#G!99hcbTb z%zlrWa_9tW40T?ucV|UDWByXvPo`)3Qm>sVw4C^hL>`~QMG$HhsK<}-)`J>+rO0AJ zk9swMjSaP#Rbk9@*Jl{5V{M zhTA33EIMX+o>`4!oY9L+PSK)JhLiH6$UBOH7@N8raEfx|16`R)$$ZYiWY4Y9%O_oa zUGJ7p84a`MPOhu?x@N($CEB?{r|^&}(010}voDgcHy((lu=dKz%BHDHtVK*Kh}07w zi=UA%LLXQ+i-|dL?Hazsl$y>spltX1{t5S?RPKeTLwDuxyO z@f#B2C5pw6s1gsc_lZzZEcUCP#aJTQjX>E2<{m8O-K!MZ$by8&kg7S9z6wb!~x=uguWYn$7$@x|O z2uC85-Q+V3cv+`xu0FBjOTVexlOEHj!O|Tg?HD~NS$KFdvVsosfEdhXV+c zW^*2^;kFa5e?F=)R17fDnTVi+lv~+?t^?m+>}}D;otm03Cuf!%8&E#AM2nB4VxoxfwxIKt9J$uMUjPgsOs8f>+gc~()Kt72I|^EDw<;{8lzU+d zf643h3P)5DCYsnwf+@4!B>ihmX;9YOjbu&BaK?Eo(0|Y16GO>c0tJq}~v>7n6}Z7BeLqt!+099S0kY{)%Ga zA>er~Z{!`pen^q1lWN5Gt-1LRMPeV9GIu&P_eWr9@=AF{)e&CO%0XCw8U0BhZk2=7 zuXrBSn_2KmXDGh;mXRjmHj>|Md`QrXL|NAVWSfX5JF?XVIp?fVo>l^kPa%7vRG)I} zyrZ#G(+EPV{%HhdacSKjqJrsEzjawoz#1YZ-shBHod--D$trt)bKJM|PS3x4H&6*V z10jKJDE!V=DHMam|EAR&fRH%?U+tRE5!N;So0~u$=Ik6B&=c zv|x-*N#pG`x<9QBKJ>i6Xr~@0Vs2hG#nMZ@4?C8R9J}2!6=Ot*JbL?F@7xcI%(1^8 zD=yk%sU$ZO$+l^)rB&xUg6~f-sTS{BF4e8!%uJP2!W(_&Pb@0#I@%4pL^`To{wrh* zh51?8)X$5eJNuR^&zYwLs$16@eFc|TrlVW@e=?p}OJ+d=rT>smG+X?ld&`lQFIApf zXZK1bhkDgA?#*jBr&P&tYp_wHe&C7BeWF$rno~i(P;@&UKpeQroGc*?EgB8HQb#Ug zc`H!)IcGC!6BjzDL9`TCyxFaA7(@e{%e<@Wv+&^%I74zxo!FRrJ&*n>BDpj3Lbz?C z+A3|EzOqz0y3tDigA&1KN-vyjo1p1Wu+|(rJOV$33^tVPk(wzt;oMFClt6IXM)TSL zkXw@?ZW-0pB66;(U^l;p8~Ox4#CtBf7`xE?5tEWB^mtudKseNezG|!I;AAxQ?DU24 z^jnGFUQ-*C!57K}Pi4=uO-fXSW#xb7n4{4&qvrDvso;sd!PWgcw}O&GEWQG+MnuPw z0wMg4JG%3`Nw5{^t(iY>;A_?<$hcT23{**}1tQ1i$sX;zX+wTQ-1pDUm+6qXrO^y>Wcw9=VB(TnEBjNk5fdw-auqsek<~$`6$LcN3AsM6 zSH|hI;5y?gJ&EtOyF{w1N?V2RDuGs$q*}USB42cyRIGw@rf5&D$BD1PMni5w*nd5f zglR3Y{(yj|Qch1#2Ww&dSL!1`I$0kk&hdVpafvT7S5lM|8`Es#On5deGG71q@Emr3 zxA^#<|Mtn`a^-42tFOKkqWtkZ135|PLMr34x0olO8NMdaZGZ63zTq3$j16ZDC(tB> zA+wj65W8MiF(3dooqMSj{+nG`4T+SANjiNUaX-vG1x#k+c6t7miq)ckP@<# zPj0qj0o0C1+k-^e7(gnV6nNdAZQp)a4m^*+#^SR1UDV^Df2@PO6#6F4$M`oxo@@C}Y`UdZ7mYglN4s&`(~f! zGiQ``_ot%zS&GDq8ei2>zHn6T*P0^J5vy8=-cCY_{_7=n`z&^R^TI88h7!q?qQB|u`4#_{*-NNQVdWF!>P3B` zWK)ygIhp*E({YXNnPHl4a9J>2MC6yqD4OHEU!VtvR2-!#vq5T%L?lO>y{g|dp^tl} z+mn*-OikWya|;%n>1qLp(w{v-Qu@AT)z>qVJ@ZV$L3uVaguves}@_&5-uxbzOs7!dkld_$^ziiBZd8d9e+a;yb{yZWwMgUlsc zIk_BcW@k5XxR-oHYRtn4@`Xiq%8$D3rak|nj=~qC?SA_q5|YMeX7%a9kjI>!2}2~= z9+wjnHX1bk{Bv8_46L2kly&bEPef5u$ky;XA}UNRA)KpKwtB z5Xr)pu=}pNx<0;9Y1ZYfbmBwEYjH1?pAz&SO#qM|p(_%*aBvTjhEh1PJK*p*f5z)~ z$rt|y*ibMp$LI6rT=tdYWFJz)#2jrAu@$2z%6FTKJu8GjmBK!r+{wHK$KYB0@kWop zFVDIyXP`f|3zEAaJNi2j?6n6PyA2vB`C5#CeMZiHyUv6T^wk@KhciJA%cTK-UP~?v zcs*8^U47EHxaOofvye#*0HgIk3d!o19u#VW=nBLXkl)CgV1PFibx5q+)Z#ax=q}B2 zF`+c;Q~=VmzPlT-gXm|mQHC4INA+{Vw+2k8GS=?pkv^~8DQlwZ4qR3m|r20v;*|QYFQhK9{Mn+x@WB&q`rQbKF95s z-gJc%^I}g$KWu60s@cMGZ+Gov9Kwo-gg>3TN9{VvH25+(b{%AlN8^&nOd z&!$_FEF!}^=n?~A!#kXO!^xIC<=2X{;~oQpZf*a~F9dQPQiIj_Dvp$Cqnc#Qak(Er zD`xmTQUe2g*@n73wkuJrQfrL>WUs7z<&(aPxw*O9`>z)!9tqFBk`E6+c06OMd8mo~ ziU(C?#Y#w(OM74O1sq0OocyADSnFJi4RrbH`MRGoQ45CIK99-mP<5ETlR&bn-Cr;T z%H~wm1^f-u0NfUK3!FSluY7n6cR$)tck?R$IbRY2T$w0P4aCKsDvCv(Rw{WVy~aV8 zrl@G(!wchkPUkG-1J8ciN!0B-Y_70*oMz~YAz8tAU!*jU)RZ4xCnGF-FB5ZbHa5;X z?r*=xP;EzB`W{6&WBwc>5%J{Wsy1GEk34;q=TtST^3*d6)_CPF)g7FHod4Wn_L!iq z;D(wa1n!#P64REmB16cEqb-+c6Hy}QCiEN_lBsR z`v{v$`qg`c$LswGKaAZ^ZxP`;$DkBUqrX{yl!+fVr%5M{{AroCX3%lw^2K`l;2NoN zcMx~t1&Kxln2H9$%-xesc+cXRe|4WnjHg)@UiEE8nSylP=sjEa-_>@yR~`oIr1U!Q zYb$n!TEUK241FxJ?`0 x3%h(!z*U9CZIsjh=4!(K{|MB~#tCTFm{tuUCu=D@` diff --git a/src/qt/res/movies/spinner-008.png b/src/qt/res/movies/spinner-008.png deleted file mode 100644 index c48d9e487c70f26013711635b785d71d9b9807ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 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 diff --git a/src/qt/res/movies/spinner-009.png b/src/qt/res/movies/spinner-009.png deleted file mode 100644 index 6d4f2c572d6435355a7fcf9a2bed0427f39b5b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 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 diff --git a/src/qt/res/movies/spinner-010.png b/src/qt/res/movies/spinner-010.png deleted file mode 100644 index 153330fcd66154be58e01069d9d090433176438d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8637 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�%X}Oi^pk^sgmG`fdU0z`I%;Byr@?jhb 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 diff --git a/src/qt/res/movies/spinner-012.png b/src/qt/res/movies/spinner-012.png deleted file mode 100644 index 8bff4d7490150d3fd930dcf7157b6b81b2bb9bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8641 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 diff --git a/src/qt/res/movies/spinner-013.png b/src/qt/res/movies/spinner-013.png deleted file mode 100644 index c48d9e487c70f26013711635b785d71d9b9807ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 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 diff --git a/src/qt/res/movies/spinner-014.png b/src/qt/res/movies/spinner-014.png deleted file mode 100644 index 6d4f2c572d6435355a7fcf9a2bed0427f39b5b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 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 diff --git a/src/qt/res/movies/spinner-015.png b/src/qt/res/movies/spinner-015.png deleted file mode 100644 index 153330fcd66154be58e01069d9d090433176438d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8637 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�%X}Oi^pk^sgmG`fdU0z`I%;Byr@?jhb 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 diff --git a/src/qt/res/movies/spinner-017.png b/src/qt/res/movies/spinner-017.png deleted file mode 100644 index 8bff4d7490150d3fd930dcf7157b6b81b2bb9bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8641 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 diff --git a/src/qt/res/movies/spinner-018.png b/src/qt/res/movies/spinner-018.png deleted file mode 100644 index c48d9e487c70f26013711635b785d71d9b9807ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 zcma)iby!qS_%9_TEwOa7l)$3YN_Qv?g3_&k)FRyrh{S>{p>#=ir!>+_3kV2HEZtpq zzxVgYz5m@i&&-)K&&)aJJ@3T(na?{>+L|iFgmi=$7#PHAs*1YkeD%MCkBh!a*G~GP zGfWR%6?u$`F@|k)0mokMjT{C>HSFn~Rd~hUN8h3#}!Zu?z!l|3C4h*6?`-)h3_$_0aN1Px{Mcze5LS=lz0@FEYJO zN5x==O~|;EQqwr3`2UG|nJW($jr21+>eafnc``Q>uzphMtAD6SnY&dK^WzoXi=e!K z+lyE;-|d2lVZrgtqs3OQLkCGF*u(XBP(SBUP^HhP~!WWyK(klN{if*+*lXE`XCP@aqvwJ3 z_Z(AJ(q8lQ+g+e$Iv{BEskudf*J&pJ8pf6wQlRL$nstcQ}_FWa9Emw5cS;evuFY8^L{}xB3}~T? zdC?kca|s;@wQ>cpAds$M$pHrh8Iu;lK&{Le+%IOiS=r~89hdF%?Ush@ce9NhR4xjr z4@9_KvSIZH;+&R&YvVx=r#4@p6;{DNDzDH3Px@y0vLj`NthQwVQFR3XpY7dCN)REbCvX~J3c8IIe*ty_S3A?t-ki9NWJdck_3*-X@TQc;s{v1nMxy^8@ z%0$P_Or<8Yy(Alho8nww>&pp?e}j%@gAV@K#7(ou*4pD-J?ykRBn#~M5%O?%U6jr- zgnN?UzMu#UVWSwU)eHy*TX455DbR99k6HRTIywq>B!pDg?cR|_^j|yuI`FJat0OMz zVFQRAKXUZHT~|m0DPGKfQE{FGADI9%zwFAI3Q2ce@B&zI0+^lzm^s^KMyP~$Tb(pb zl>B`Au~l*a#;oxW^fVC!P48Y3xbg`gE zTh0_9tlfymZHW4hh_aIRg9s*oU{Pjmi{w0H6Fws_!9goK0uCLh-K8&Rye+yHjl zgcj7DE)hmv4pWTYA`3FlBjN2_4aaXC-!eypNXB~+gd@8woy7nzCksT+Aq>kSrxi6X zZw5*%ZZmr_0Q#z)v+&zbmux6_3$adioyYy-HEVt;mpfew&52F2``U)h^i=RFrD3HOEpNqOmjH6zB%H>wxmLQsO|^oI|>4FRP{EcK9Ew(8FGqU=jMcj%jpov|l0lyXCWa{EtHejesAX$zjLgkP2Bf3pFUt$px(+z$me zfwuL|T}bOME%UK=J;$PRV$u*nPRh@W`YB(3ZYTxhJV2P>8Y+YJwa)w@3w-w4rleC=CrRf1q_zv880p$DWn!wYBkvo}>S9uXem) z-=-l+$;{-1&FAB_zK<@n(^2%z4GG(?!Q)j{Y|~)QQQ{42Z~o>gj`NRHu~haR9xtTf zRrscD4VgUCS%sEXfzVtMAg@KhY`dZdZA4M}X@H<&L3juOlnQ^DK(7unNYf5u~DQs9w__4o77&4beI9$7nw~ zP|CLNkGiqN@di1Pp~sb^yZz}8f*M=VwiBar+u{c8&mtA31o>hiV^l4tL~_bs*3yP( zFs&0qbA?Py&X1hL7#+<0_Un#ymLnf8Fyf&gXoOiy16&wEDxTf-rPGve!Ux=c`qj?bKV(EZgQFe}EV==qMT(|6AJ z2VK$~>UGlwc?~jV4ic%0Ql^OgS2{G4Z^V{fKAfcdGHFn8{dhg76)61BFV+DHoJw1! ztXwQ}T(Hk2$+rl;dH&Z@cB5D*LVT&HLXZ2?x02;oKOHNYxdhN==~MEUZ1Yy8-oEaK8JQ9BuzI%k4dFCjXq`Xsbvcxl678X)DFPf~!yDg+=R>3nvt>w5;7MF2 zLh@_@KtPf6jSSa^KBtNNz`ZG9JdMHoIoL5%q7M_269y3V8SI>=B88}mvMT~iz2)iR zj_2Db+1id{T^OVuu8^^dM<+opu?n-AmWchwR&T4bh|5QEV&U#1J-Tb@2!|5k@byPriN~7_4OH|bu%*E?>Cu^ z43(FfN6XrPbu1%uhj}s^?YpAf~Y-H!q97TwF>X{;dSr2jcdiZE9D8sds zk<3N>#Hcedr89F9)wjDi# zwKQE-0&YA7+nz&tSlNlEjmF(>Yz(?*`0G2b;5!!II15X?(tW0tKCmo}6z9#igi>Nt zN-z_+r~BjsESYUYy7d)I`Yjj>ab7JvqevmO<(;25&L63|1nKjBg1(%T%BfA`IS6gK z+_IK0#2J>H75(iBzl9c4UAj&i8@%+H+VCivDuZ5B4)G_|w*DI|HORh7)h7K7)?E1m z+Zj=q_{-9xqYCP^?YKV>H?8UDFe^_gXacUc?)safCH;A@_$|51w_E=x0w#I#Wu?&7 zx8R`mbNtkmqMH`J|JI>3^DSVd8=2J*aK;WT0UduAxwXwCQ?G)gf9dEhsB>BAxT?;! zP&~F4K*4ADI_$e(3guXRQmkfVSG_NCcpP#gs@Zlqa3}C%Goy^3-@a#yJ5Bj@$0@MU z+_dkxF_cuqH_~y+s<%8lu`krY?|*f)+LYOi7THcpk2lU$e4Go~|IP2k#ROXn1?li% z)F0*`cLsTlZPM&l0EUdli>bjpnFY;b=(?P4hlEiSC>e-LV;Ew?QdJxAMv#7y)l0B z_Q34-bniA<%*W#N;w#dFKj{!n;-`>fZJ7m}&$wmWhQ3S<;22dWCqZShUIw>N)YQH} zjN1(vAxN2UR=u1joQ!=R4K&;r`{BH{`gJnR{wWT7YK2u% z%e!u(gWNno(IMBo_~t{3goD(^GrBt9OS{F^M@zqAm)W;WRi38Qt1@9SlJ1X0fx&of zr8C#R)$}1|h5mV?ie%krAXoByU>mku(OU72Ps5SjAC1XM>VxFQ<s; zCC{hzW)}R{dGsXh^lE&%r)ggkxf(3*x__qejr~Oa!+B|vH%qLbQ z2%d1J6HV4aklisf{@n*L*+RhFHFY%lGkj z60exeW@nW#f)kXVgwv7dMfIFn{?_eZ|9gDbq zj$;LmezFx0f)ln%&xs;fYy)(H8O4124o6WYse$xC{=D%NRc(VUf1 z)r#3^X=%p{1DM-CKE+ykqY}X0vjuM3m@j zh8)*t$Zv%TDhOsslwYW~+Bfj2EfIeqh?@Bsn~*QpJsmZ|0;-I!?lkUaj{nVrOmu)& z0UXEj4y)sp1JFdkyo2HV$x_!9LhS5gQisd;QG6=(*$~$z^RU96;p+TGdDWe2Blk?- z7e_Q9jL~OUc1o77yM?5u+vQ>=9>ygp3s!O5b^boHGV+#B4nC%6opN~7;Ti*Ft;ssh zBerD3>#2?CZV2qaGS$&9a0YvgX8w#{)Bf@8O``p|a&6~7A<1yOADFgT_xrTa&On?< z`}O5qB!0I}4B35--T(seyrEtIFp2uZtNk~F%y4IM6+d#Gp9m4!DXy&Rl0u;_j@EI+ z7_BvjTI608ZoUk_ZirNB<19G03CN*5fZX;cBK|YmM9N-|#m?}CJiFGfvowds@R0KJ zf>4sP()(dWJ&9OQDeyH&vELV(iXU@oytd)+5_gCcyLNhyrk!puf+kL(FviTn6$O{q z2D|$x#Z3(6Y4Cfx_>#AFKO0IFl7vQfIu#At#6VTcDy@sJU$tUyW8Z{o<^WOA5WICv zkaC=5T`|$@v!6Bf^-70z)X-3lx&PFjlK<}saM!Y}iMq|sgfs_7V<0O1mDi_SAO}QA z?Y6th{yAXkozRHLnX|Pu`CuPYDYDA87 zN0fLH2{XK5tZgO-7Z@cCwy$Nz8}o`O7UH~Ko1TdLM12YUr;LJI(6$d3=NU`otSGxi z#QDh&41Teb)&rCQA?XHo|IOrMS4z2jN$GWQ(?nrVp8a>cZGz%Dx+;7o!O3xQ@v)K+ z_Ccw}gi(AwA~J8!!4+bNxlzo7{kN2ca0sr;;6&W zuk%>)oHKB=9o(?Kmbi7W@NCB$C`E`k{*!u`NnXLD1vt9Mq!|FQkl=eo7$#$RZtK`C zyzkkhP$u{-Hg!%`13scV^^d&^4ePJLo6Suww9;PhY9P9t7yT{|mKp;7bz(yJ z%LH(dFK|=C`IU>r!F~AG#ANsXNCe*r>kSPji<-?ja_~!}fbt&?imX>Hoj!TyFt^#t zj5`QPE;pzg>N5S~%1Xz@H~uTtPS&4qmQM_*J?X^vxyM0P5P_N>nBquaw%s}%-8MmI zH23c}4GMfzAB{+O84M05W-%D;#p3($SodHEahRvH3iMAtr7QOzgwoDAqlACJ;@ZuNRu`o6?7$ z(yY|w^Y?U0k%USAaUASZHAZZ>{5S~`Qy$1QpPCJ0LlN$_xVa==6rkcEP0@aFr@yJ= z1hCEZp5Ry$r$p429~!W{Buc)2=#8=N!k-|`Y>|guMMTYTX2Oll&0!IPyB?*AXaGsZ zgW&5rpEGBE!ris{)*^%=oG?5b__m-%0Q2jUFpH#Z3kNY?i_jBMOW7III&XRM z9uR;G2Y9;B1mwWS^33$is;g8o>vPg>aZZG*J^BAEbuVjR5#X_x56{06t~o!}ixlEq zWXynZY2tJ(iTFI*2D0beZn)5z?lfL!E4?U;$dA(tg}2xHIBb-*(<+Coa6mbu6EL92h(MLx|;9cnN^vV%>7H5NSW*HlXkz${w$uk28u;F z*W;}t37I{O&4QFABuSKQ<=jM`N?sf^PG$!`%2~QNSh~6*Am4f*E>_T_iOg^q-PIy5 zT1J}UY5dNw7S0}b{ivKyPdCmqeaXd>>;;%hXVY0-XMV}F!>P>Lyg>rTMr~q6G+yU5 zf~Y=MajyfDNt#^Gj${dLX^?_=iHpvW{;N##Rf~AvGJLrjty`Z**Lk_~?aN25EXs@| zjQjYpY!zXKvv6z3G769Z-r5F&)Dty8i88VM-tj=13X^8teIKP@-)=_i84wOnmnAf3 z?tRI_FTeGBBz@e2OZ`R}FR}UN((LZr8y)9%EZ;uq+opFJfw=>Bu)#_XG`1xm-~$O0 zgmnqa?DUG7X%S$CO0r-zqxXZ8gvCwA0i>1p58dT6$+cf!2Bc-Kz`9y3UvfYqI2pyN z@_QO_Q{^)fKFd{5aP{lV;p0SFkkOfqNsrr0<<6dK824Vf1fHg;{CYUAq_1BcjC^$V zzd2%7_PgY_9ni!Tkox5U+2{+)OFZ;zo2d6+TwE3nJeyDfT1$gJZYL1G+5m`;1)dcj zT06qmLxu0s==<1`hE4ugS^ z7*1cC@wC~2ZOU{7Nv+{{T!pf;GG)&U>HBRhQgtECOZ~=Dt_%qRg|q^};h$vvpFAj8 zJvAF#;YT&@E5^n0F6|qA~v>S&W3A_&a~ApU=@|KQHZ5 zOL10rdQ#}F05(p)H%EWO@ExR&?PWsk9(0UXD5|yGaXf(=`8$Cfi6&}?iQQ<9zmNNK zk@(<0BcLsK`tIAs;mWT!Z+~!Yye;S=Lpmha(#_cB5+$aac8dMF9(C~EL6ujdH{7nd zG=QRuMzwX@Nek2{zKHeLBV*mBT94+(huZ;PP5ACO1-p%!{2?N|;%t0VF9`(TN@^e; zO5hHIR-tH(121Z`7~xgvkg~1>M96mJ{RF17hSm?Rr62Kg#2>6;V}ST+ot7LTcs&7q4dVyQ#OC;{ytOGF}38iBE{V$ zu_)oO8DsW-*qymbpqc!0e9_b4_b%<8+E{-_{g0!~8Gda%cZr(QM9NU$hJeVv?QEB9 z?=E@nurn~;joyH}!=o?bLS>Ps#nT^le7cl{5pS#l^m~_S>USkyjI)VX=;S&F_CHNl&sf zVuuzN7Ugfzda5?225&l^R*F@whuvM;J7 zi(uFIkPon!>*CeSj%~|(J*buO<)rUlQS`sIo%H?<^3YLX+|n~$ZH1|m27*zOv_GOl zIRSNZLy080FfXjaiVtay;)!K4F4crb(rh&PX3*Ynr$sr{Z5?@mZ<8Aw5FmJhC26CV&!Ou}F_dGIh3*aZ{TBKw1vHB~&5$}}7 zxzb>9G@T_0Ql-ZYBg#V1D6F>$43&pnEZCBKZXlvt?S$>xg1c9zJAq!*4{m zbKb0uCQ<)`FU#NoJXw&+1Lz{6x!c zBvFx;h}@)6@?8$UDLt56I?wD~kUsOend$BrAG{zur;#a-Oh5gp@i!A?Kn&kl+$>Mj zxxVEHns@C&_0PoED-vonmAg{*)NSD`n5;xu^2^us@;y;-(r02MVvGuSPJmR7_vA`xr+w%z#v?VDA+noa+e@RZpsLT*2z24kU(-lIa6hPef7Y=l5Uic4SGW zZGG8nX^X_nNPkC)PWt5C705->T8DvKE4KfZ@Nvz)1*iYsAfRIU=}XuzY8f-543Mk` z(H4^1R%u>Cd}rAW&7x)uH;#ez0aR~>qkCw;bPGkA(Q!7uCJSO8vm&TMM1?cdsI{&# zFWZ0@aXa;1YygX|g=D7QT%|{FtrALWt6+dVjr#!L?4>p%+L@ODY4`!vd9|oaYTBs? zU}SKA_=hKBw9iPwcYMdq6m4^uuhwo==bI3!Bq|9AkrNwxgnExJB)i9{5x#^qY~$;>j-J3 z!uvlB%Qw@-dTxWgszc{fwFQ93%}u*IbEXHwOnB^`6TNYvf84Pr$4T}W)PG$;{LQ;? zO_Pl70hx#6rV%;nVe0=}Z&PV(ui@lfYz}tQSJ!@U<>OySxa`fqI0|_zUr3er6bw2` zB&nQSbZYoE`mDSCa+y9>Q;L4~B^kD4zzxJH8wrnaHCo|SREfe8QdXjtASSD^BN1Ei zKfQ_qX8xgGdA9kF(e1pY5GBrOfopWh4N{h5X&EF7rQP!CIL*j2M>E7dqVg8}p{s*@ zHSp4b7hp{u%D5qvENoUrGRmsSG9hnypo}J7_-5J2v zt@BH16^?s9rD&;iC^|8m>iWYX*pc}jrGjiCWBmiQq#*gnx*ym;POa8odhf({{7cj= zu4?Ni6Agpjqy)zdo<0y!4M*}u_XctfSvgsaPX$s;-#?x;+?yAbR#rVao~BEy+!|!H zAg#pEl6uK{KN;J@Ym{eF``2F}G%CXBcEgqFj0AE-`GM>0<}k`%~?$ zp2RS`-?$=u?P;qk)G+u0Ci(%?Uf<9H2ar=J5V!sR;(@1RoUk3>O l@52QDkNZ6*<-A8ccihz*Nri(N^ic~8H6=~O3VDmr{{_oT=mh`( diff --git a/src/qt/res/movies/spinner-019.png b/src/qt/res/movies/spinner-019.png deleted file mode 100644 index 6d4f2c572d6435355a7fcf9a2bed0427f39b5b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 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 diff --git a/src/qt/res/movies/spinner-020.png b/src/qt/res/movies/spinner-020.png deleted file mode 100644 index 153330fcd66154be58e01069d9d090433176438d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8637 zcma)iXEfYT)W6<>C5Y8q5-njDQKBzaiB6QLt1S{itmwUl6`klUdW$GQ^xk{#okjGz z+T-`U_`mtTdCr;n&Y5#&?#!9F-_O1GbLX47syqo1EfEF=28p7Atmb38`d=l$d;CgN zj=4WJm`sXG(lnmG81Vr{@Br_HS_?B4_tN3SbseE~Vx#oUTV$)^T zdA7QENMCX$zYK1oQ(8UUG^tC`4kG?P6y#Y6rGa_Ng4gAuX!xSag7dUdYG6w*s&}uSD1$^e^Hh0mbwKU zx?eqH*E4O&Z@1lIO}C3Vr7@p1f1<*eZE4ucT0oGtdF8U#LhE`WPiVFh_hh1Zuk~;? zB`+78*vp&HMZ<@Q&9|GEP50;J8TF5Q{!aA==+MpJqC7n{6}3M>xM)wvbTiYPcffLO z=bFBPvs><%es`2ywwDY!XY}_7l@MrbdgYB<7Mme={eq#aveXz5aFFI=GT)ug|`Fz!=G%Q(Lk4L`xb;y zynpw9_X2#b+I!EZO_u*ctSWpPJuX!_Ytdf8(NEBcNKxO@)L5p6tM1qo`=&bGT*HN8 z6%4#9^j^6Kwg7TL*y}7nXoszpW@V$}8%3j_+D*0VG!z~;cz*3k;cJ>c((?`aLGu1M zQfguwWH(n$+ z2baBFSN_b_E6$RW38cp(m=IPT`7$Jy6-`Hc)Dz9NgfaT=jH1eC(RupCWw2tzk-Q{2 zIwN?*miTR}lwY+yPz2_=rsjjznw5j-f~6vK#jZDEV>9md;ff^S!eVFKl%~@m(aup& zv@UdqMGV93V-5YOFTvb)>uc_e11jf~mA@{B7lSS*8YJiXRd2|Z!<{H~$;U4!6Y^d2>yfA_%4&2$-p=Y6&_+MC1= zZ}{?5fi6_Oj|Pv6kTQBp>}CVM2Rk?$#W*IVj{tPj(a~8xK=HZ+7q)#s0teey4W~og z{dgNN^0SmHAFMm>wX6Xk>vr3-$iAOmrbg`Pq1#f%Ac@vvG9+25gj%Wuz#yskmv)a` z-zHRsglVHjB7~G7j4MOyxle}HL6?o6mK77Am1a-=Lb0F5w2ru>wi(>#QY|*wA|4ok z4-ixxrujkx@VhN9D?{Ju+gvd8bT@h3%)DgL&xj%|=azD;I*$s`$IG$H+=6Kd{K9o* zYRGKhUy(b8xau}s|F+uT+i*JXqx%tFioS$?w&16in^ zbl0V1`8SMMGTQ?ru1pbV=8(AJQ>>GJBXFAm-o?@~GoOqx)g7*9nz7?Zm zZ6L;%EqY@zg?9m52ZqIGX6X!@*l0f<-iR@$>q|7m@QkHUyI_O)&wYVs&yTx2OGDYB zrwNnZpILa?32QX)3avr@mYeIXR78C+bC@sy9KX#bF_wVeVGcuR{_quS%a1Jd9L_B; z49n?4sT});g?~{m?D)BiPgPeFjZ%)OqBdfmve!r`4NF!7J7grss7Om=wzKhA6bpl8 zDRIr8zlKo9n;+_t7@oepI6foPGlt``X3vB|h zPBZ@&%o-X>#3&gu`RxJavefN1j9v!vt%wK+%ieN?;b~cqQDKWjj5|5#@IsEnC;kLzDNR_XqAN+k4cD?+E2;0e$bJ$Ilv?qI|djW4YNIvq6>vetq0` zHbuPQJ7R7AV-#Cuy<}!r%x*J$^ppjq>?K^5RBwvI>hc6n()ZjnrrLUnPY%Qyi=@qN z%NtIV=9R3pK6G^Q%UJO?o@qJ?0*X4Y|M!~SM*hmA+~s?rLV_}P{p9uwXVMlof(q{C zwaBZa7x;+V!y6~Vwm>E(6^#$T4#gH3K6`>!3^@QpfjYYUZQ|DE2Su{g$_WXoq?2|V zpWhO1|T#|4_O1F$kbe$E>RB{VGEAao-@j1sC&%iPxaP9(^#M7Z-SOY*pkK0`#% z>d9dQR*#FYh-!FFsH6aaHJfL`LXhJi&MY6Tv1`fHZ*6^rzdO^USg42`r=SBdNECVY zmGoAnZ-t_?29UAL*7bYJ*DA^5Z)(bFX>T`El*2Rea)a5$;ldG{UK>5poOj~L!;vf* z%ZzVV(fpPj9uDa(B5>fNmV7w@d{>fX=FRe|0djRYZ4D$rQAVD}o#T?Xs{jeocsVN7 zA6BG4n>PX)MBKIq)k$t4X1eA+7T{0Iehp+ibsI6LG?%5MKTuG@$&7iV%HiL`Ce$NF z9%Rgyz~|u1035h4`t^dN)K)JjSnsv=bn6S<;OvWwRsSbENAm{ujq#;m&Ch@T2|lET z|55jxsf4Rt@5>k|kdMH|S_#6>LNj)wP&TYsQrk#(xa2-~IsJ|x;^9|%iPET@0KPN!g{hfru}4Q|lb?NH>>E!24NSJ>iIV!|vd=?7poPHtw&a7` z^#B|to0tVea*ngzRjfS8wCj_iCFn`coDVt=xYuG(g{uQ=NC}9|3j#nFT-6hndv5Vv9m2i%W9wpK_B#YEB%4Lqn@=yc5 za<@a`d{ZYR2&l!*`a%BL=||7D3TeZ$_%|O_9Wjh{n1fXe`5aWQpD@G>5RgNu)1&;& zJz<8nte)ucjP%N0Ms&l`ojIbJ+1in;<9>M_md4pdybtnW5m>l zIl)Yi4;cnKrrTVxXF`O3tx1{nlC%8H33CfEm-dj6rg*~iI_X}ml8FzuAwGqr0vQjt z+wTIN_&m)CPtap}&fmsEOa|fYY5Gp?PT@MzSq7F`x*r^mrSN$eu1+5%5n2G9R_F6X zMDiSkx4SHG+2*~)+mRrY6g)I;}h~1i=cp7yc4-1x5WtHBKHdx;J*}*2# z<_A{9VFYdO8#vd5g4@3p-xrQzcM({+?nnByZa?)?`Y|C3WRe+~P@y~*o(jdB4s8|RRR%kPC`S4pwQ*DRn!~S3hq^KMY^x})#vW+n` z^(5*yje3z=EQECH>3NIy^uvaoP zxqLO$B@MJ#vp0bsm_Gu&D7>}djJAUjzeR|^!Ft>Chry#S@JZ=8E>2<=DNYuhoBrEl z<^FsOOU`*<#R>_N&#hxhKFHm27XFVp_xRg>I@#6GvTif_eN#}kq#b%E@^W6*xI!)-|P_v^nCrYB#Z8~Hidjx(S!{V2Q z&BG1MxLfqnIhq3a0`MMsbzO*H4IX+{ndS+)6+-4c{cI890!gEZxqsCB89{+d@*l!- z>LuR^LjuUBc6W=YIbzS;*C7V&7%w+R2~ppXG3E$v!=M*th|mXJ1vx&pj!ZM+=(a+g znEZ9&+d>Z<<&}oDiKjyCzPm02qZA2(!S)^0OypeW+&Yr&c0?Zl*R@#x9D-)g4w^;F z&Ii$L*fm4_toz~0>p887NxN-Whh{DkU!LNoZF3sg^FIyzWxw3C)&oMXXNU7}U7U=~ z5imVEX=aBq1tJ7sW3ot*J?zNf=;Z$*gw7?;4Nh}0E3Fu}wi$9|Vh4^xXPWsZjnF>? z5jCGtoJ2(3JNd9Pl>yPhoqPz_SSLN9%9I06KM0*YL@8IIWdr%jCV({TKfM0d0Ok*IN(iba#16FHybru~FD)f7LAZop1#H1|}F<2CJ$-PEmCIuBedySG5-C|6F${U3~8k&Ngnp z*R+YDqw)CR-~WZ;R0*&82@0(G>`bS!`N}n8?@O}n*t7K}LQE%Zms{-6d9d8KC$sQ#su zDfDBKJc_Wlis%Uzg@5+=mS5-ZA-t4h#Dh{b#DW5 zWZrpZMF;#4+OzcK6gRs_=Vav1gYqHE>UOfj!x|fYo>bhXHVXZ+tj3=X&-*wQeAyVA zBM9K*^9H#|6sij6^`B9Q;~}c77oF4dpFcV}6}yJGdV$_^ZPJ8ZGu0n;uNnM6wO4(2 z=jYBf!K;P4;p43;-J&iB3y22zFe75%9}nL86JijdB2xX|4v=j_Na`#=w86Spfs@xD z_@8qlv@O8{B{O&UotEWQmsQb|yOq~BZqR_$;~H^y>Pp`fS4~>x=U~VrJvga*2FTKB zO-@{%_^aHPWiOs$Z8M+ns_qF*84Lq0wHe`^DX+bi#i&@00NjAlobqjVg$ibYd{W3R z5VG@8MyOZi5-1ocwz4C}g0S?3t;+cQqzr?dDe^sHX=w+CI7~MweeToAXM8Sa*nSl4}70L!CQOh}xlHwy78TPF19yDpX|3*0q$W=3eDkS+HNJf2jDO z1kh0LU%N!&YjiKOcq%lvTKuq=K>GB2&tqs<{6qad5b`u#nej>ylJfRUzn5O7UP(@< zWDs|suqVOhsa?S;cPh!lLO|n%tSz6t4P;>y{rV|3dPru8uj`}Wi}wRsNQHMn&$2%B zyVW3a5iul!+ltX0s!;%l4jskSV&%~_^fOgw%eFubKo%Wtqr(tp3{nzZd?2pLR zq4zHU1SOqV)R$FSrgej_74O&|0Y&l;N_N*cWOJcbsg z%mS9;hnVktvQe`R;Cr-7h;jga^di9^1#KO$&$e{`a}V)Ij~oLV{eMeU`itj9m3;UG zXakC@l%`pJ3U`Ab&x5FqSGJG(GkCVy`>&I}FmOBU<81qoX51{+SuY7iigN8rlt0pF z9t@6D&C}#q-JY75US=lS1o!~P)TXPo@Xtb$k4nmxMnnoKb8U^ceBREU#6#+N<*(>{^nV>D+9!2wMU5q)$FIhxxNch8}p zACCgb!b-L%e~OV~@dDdkLCXo2=_*Nx+*9$HGrN4_qq|QdlZWbW*a>}RY3?vq-26!7 z-qQwuGad~qs&u8RsbZI9MoZz3=x@oV33u&rGD}6_|D1JP>-bhHOLTwU%xEy{e7@Nk z4VF!&Wo~8)a4|oK^d0)uiH&7|hp|^itzzTJ`kpA)@fA0YzYK^VVvfsjIAj%-#`|wC z@pnOQS?yX_uf5OBJk;_kviYtX%z^zB#FDA};QB zVllg&lbygAG^i?qSLS3~S|-QAQ`1Rc<6gW^ptKi2(bv|Zkk1eD;bqHSeW-A*PF&{u zy*YQfdCm+Bp2mf9q#(@g>`KKVzgNgbw%rt=^+<+9u5PNFVFFjm!(7_as|L&HsRA5x zgc{iBz0MX6v0Xyb1W6gq-(HQ{5s}{H906V}Rfn+bZ{XyY{-du40JiS_-b`pIlM$LI zrV;abJorFwO3p04)!gr^b`}ipD04H zy_7`cqKSA@^@Dar7u@$sbDpMFBt1Hid)3v?PksCSX<+z%4ZrRN;1c{?n4jUFo9`}A z@w&#Sj5M?l4l$N_ree|L`^oJ^=bappx9DE9Wi9^p_V-k&JGAzRwm$ES0$%d-DS5dz zw^4@-x%P&?U2SK&#%{S44f_6_qF+>LJa6NIUT>O_hMz|(C03>WKDm%uKLZ}Iisv77 z(y$kpt{L3??EP6Ai@*6PZmFxQi<0IzHFf%!FXcRs*ro_M2RMzxT9a>*o=ao@QG^o! zhTwE(+sElLMd5s(FY(QUCX6Y7nHNIT9qH{h{#hz{7Rgfb;>jE1TvA;Ms7Ah=d1X!z zZ%jlxBG9M;d6FK%ONUaI=%ee4C4z)kYH7OV*`=>4$CUn{A!>;1!H%b9IbxpIA=7k^ ziwgOv9^}OFv>aX?RQnTo@>MFSfEXlE6Ii2OreCb8t%`Ly@>E@7&R06xXJwW{wU4_U z{;tm1un+^1GA4a|jL=la+FYkM zNM5lci53Qb&O#8tl3py=m>z9p2!nfm(Gc@_CN}|DFP)p29UY5%tF*#s9T^pcsfUD5NAL?CELdJO}A98B;;Rl(zyk9>K|0 zhkT_9^kw@*Q(XMLp@GE?>#Lj#4OL>iB*7O*fU6F@mg>cO{WZ*Jkj zk*CZ~F?|GSj@P53mP$|Exu&;mUfIJD<7OS>Y(cqorCS`qG)wE&r=IWH^#U!v>3#{G z;SlEna>X1~KS$Cr#O!}*E3c0J1DUe3cpLj%Lgx)aZuSo)hYB%}D_8^keeURi<1LiL zmeB@-?Nc^Zw_VnoO5zPE<05QMXXa&Bac0Ioh0TbQZ9Im&NRp!c|Hx+^j#6G1C)Rj& z?NiW{*2o`6uM)vF(@E&8T26ec1WF4P#8`2pv|pnXDOs_}ZJnHc*rYzH4t@VY`}w4| z&2oX~u8#0r58|bw*lP8(@!m)I$vFdZVo;Y>D36#{!O>4O4$2$>DP-l7I&S|Rk1Cq9aR67HJQHvCiivG)e8+DUJT{;^81p_$OtZPSZ<_fK`wQw@4o zscN2?;YCWSTfW;YnUI$z=&{7N_F)h{w%ax8<{3qbS8rSu8$z@!Oy(;(`_-QWPa}pn zze&36P85D|upsB4=+fYrI6GQxmtep;9{a$|kT&ktfPr#|Fo$mM>}CA~G9QzJ6gZ1d zWGKSwM2#_7NukA)T#kueo~{giZH_yok&NQIe~6JCVv?n=JFotW_a1&<892rW{(jQm zBY|>?C}$(bcgyRQ7Zb=Qlqu+V&*}N^qsi$!<@1V974`LRa|PvoaIpEyjUWq-PcJzl z<{pBhu~AHtIg#CuSxtK*^>0}j+O9!MFDv6M(#a0$_jv3PMYA*czQC0V^KMT}5;h@$ zkn>UqB2EXRs~|y62|Ms-bo+m)5zB+a zHuPVHj{QHw-)$EtWrEWlt82ln8wr2p0}4dAatUSA3dq}qwe^so^ZnZVm+Z0=C16x=Uv8l#*PKIY)EU&3nAA%iq4oBTK;j_+Q-g{f`gv~$hM%`fsZmi4(Ef|uQb;By@u4{xo z3qty0FohX4i>FM|HdJ_!Hgy?`+R7E5_Sf1EOlMM=z0M=fHSPs0F#7&78CUUz#B8qb zwqjXWVGfc5?W~Vd`?6izYrpg-UX5}OK7e0$flvKge>VVF`#SK|Kx{)81&fVFwbI#s#KKnTvt*fn0_JHvL4h{~Prp6O}Y`gle5))#d zkopNfY=i5eudaeqJ;J<=?ch5oKUc=VsZAigwI;y!NnABdJaBNxyZ=?(K9_Pk92|Bn z%_qu+z83pA=2hG;()vbA<_}7RCjwoTJ(vG>Dy?)Kq~mKMC^Dr{!_O|MRUB0c37hgOn}q5p4~O_#YIg-^-X15v%sApDqVNFMk}Zgi&a} zeED*TU-AxCrk(R~$zxREkgf&L4gPv*%YU%SR|7cRgvK^E}V@PxL@S@a@{b zyi3Q=;bptgT!j>$C71)|prxMo*86ZtAxpa~rQ`nYFo@)K`E`c*X2x6@H+;9ndmr=k zoc|3|KkFt7#l5BBO!u{;rLpCTudzdX3jA+I2{jv2rjLB;r*q}TY7Bm#BmJ44Lie?M z03W6V6q|o%Waiep9w)VQbaprF0695uP`sHvxmfTRjs8Q6*Z%jcMrUSbCTVYyWKmd? z^|F(w^nl~)bz|N-{!T(|-q}%R{BEZH8FO+=6huP7BBO)4uVS?DTA#enIvE%*Hblh?e(y|+P+%?*UztQ{FmDUmyVEu?;^MA z_Wc^0w1yxooIjiSig#p&Koki-WvhE+)+K7%Zx0LCw6e=YWqu4CA2CzUPn}#^GO%wM zCOo92STRG0sr|1cRvDcU6Gu9jk4f=)g? zwobA>joTd#)Cj&l-5yY-P!Mmr+Wh2i)GtW)HTeE7KiN#L0G8snXn(KkNTuab7 zXuDXlNOM0fm&66Gd~#{uCL060ubqzTEafL~IfSG{vIaHI9DTEl^%0S+fA@ZPOBE*> zrozel@lD$;W{B6N?JRv6%KOibI*|LT(Tl?DKtC0ikj8*TZ#Iw=B0E0;YtfIl8^XcI zsL1zqhwV29oZ|bvoaZ*%!*({V@Pbq6;JaPRzy#H`t;KsW1Vq~RXk|Uk$l@5KF5TSR zEPHj5cfXfV@OeZ!WnRNwr(ckdFcSAa1#&6JS%=)QelkMez271(A!zPvl2`YqWr{fq zOgs`ub=JVi<%qFgKtSjRLZ?NrJMy-N_5QNYJqliJ6Y{adsu5M{gbb-N#Lhrz|B;V z0Z5lx0P_xE1=Yqw*a z39O2cCg0;iBW>!}cvl)S-A{Nwa8QrbYX^qNTJbe6sxt7!j#&G9c+@j5_jejc?A}sD zpswBpABC|B&J#{rQz1TG22-y+!W8@ja@-)J)SV|}kIZ;;qjr_d!H}+VN(5y#L?;_U zVVd>%s65d$HGzptqRnW2L&kkw!|*1X&syYshQr-{(|HP5rfjA& zUU=m5@gBOBz@t#iNC8knhrkAxH3#QR)r7QpW4Y68% zG@6}91nGa+He*EB_1@_8?K2j5ZvNL&GPr{hk?ZyZH)|!kt-ka@54c&^Mx|HQP@9SK ziR2^$XR)odoDWc-oK%%?=lr*A!bATS?�%X}Oi^pk^sgmG`fdU0z`I%;Byr@?jhb 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 diff --git a/src/qt/res/movies/spinner-022.png b/src/qt/res/movies/spinner-022.png deleted file mode 100644 index 8bff4d7490150d3fd930dcf7157b6b81b2bb9bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8641 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 diff --git a/src/qt/res/movies/spinner-023.png b/src/qt/res/movies/spinner-023.png deleted file mode 100644 index c48d9e487c70f26013711635b785d71d9b9807ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 zcma)iby!qS_%9_TEwOa7l)$3YN_Qv?g3_&k)FRyrh{S>{p>#=ir!>+_3kV2HEZtpq zzxVgYz5m@i&&-)K&&)aJJ@3T(na?{>+L|iFgmi=$7#PHAs*1YkeD%MCkBh!a*G~GP zGfWR%6?u$`F@|k)0mokMjT{C>HSFn~Rd~hUN8h3#}!Zu?z!l|3C4h*6?`-)h3_$_0aN1Px{Mcze5LS=lz0@FEYJO zN5x==O~|;EQqwr3`2UG|nJW($jr21+>eafnc``Q>uzphMtAD6SnY&dK^WzoXi=e!K z+lyE;-|d2lVZrgtqs3OQLkCGF*u(XBP(SBUP^HhP~!WWyK(klN{if*+*lXE`XCP@aqvwJ3 z_Z(AJ(q8lQ+g+e$Iv{BEskudf*J&pJ8pf6wQlRL$nstcQ}_FWa9Emw5cS;evuFY8^L{}xB3}~T? zdC?kca|s;@wQ>cpAds$M$pHrh8Iu;lK&{Le+%IOiS=r~89hdF%?Ush@ce9NhR4xjr z4@9_KvSIZH;+&R&YvVx=r#4@p6;{DNDzDH3Px@y0vLj`NthQwVQFR3XpY7dCN)REbCvX~J3c8IIe*ty_S3A?t-ki9NWJdck_3*-X@TQc;s{v1nMxy^8@ z%0$P_Or<8Yy(Alho8nww>&pp?e}j%@gAV@K#7(ou*4pD-J?ykRBn#~M5%O?%U6jr- zgnN?UzMu#UVWSwU)eHy*TX455DbR99k6HRTIywq>B!pDg?cR|_^j|yuI`FJat0OMz zVFQRAKXUZHT~|m0DPGKfQE{FGADI9%zwFAI3Q2ce@B&zI0+^lzm^s^KMyP~$Tb(pb zl>B`Au~l*a#;oxW^fVC!P48Y3xbg`gE zTh0_9tlfymZHW4hh_aIRg9s*oU{Pjmi{w0H6Fws_!9goK0uCLh-K8&Rye+yHjl zgcj7DE)hmv4pWTYA`3FlBjN2_4aaXC-!eypNXB~+gd@8woy7nzCksT+Aq>kSrxi6X zZw5*%ZZmr_0Q#z)v+&zbmux6_3$adioyYy-HEVt;mpfew&52F2``U)h^i=RFrD3HOEpNqOmjH6zB%H>wxmLQsO|^oI|>4FRP{EcK9Ew(8FGqU=jMcj%jpov|l0lyXCWa{EtHejesAX$zjLgkP2Bf3pFUt$px(+z$me zfwuL|T}bOME%UK=J;$PRV$u*nPRh@W`YB(3ZYTxhJV2P>8Y+YJwa)w@3w-w4rleC=CrRf1q_zv880p$DWn!wYBkvo}>S9uXem) z-=-l+$;{-1&FAB_zK<@n(^2%z4GG(?!Q)j{Y|~)QQQ{42Z~o>gj`NRHu~haR9xtTf zRrscD4VgUCS%sEXfzVtMAg@KhY`dZdZA4M}X@H<&L3juOlnQ^DK(7unNYf5u~DQs9w__4o77&4beI9$7nw~ zP|CLNkGiqN@di1Pp~sb^yZz}8f*M=VwiBar+u{c8&mtA31o>hiV^l4tL~_bs*3yP( zFs&0qbA?Py&X1hL7#+<0_Un#ymLnf8Fyf&gXoOiy16&wEDxTf-rPGve!Ux=c`qj?bKV(EZgQFe}EV==qMT(|6AJ z2VK$~>UGlwc?~jV4ic%0Ql^OgS2{G4Z^V{fKAfcdGHFn8{dhg76)61BFV+DHoJw1! ztXwQ}T(Hk2$+rl;dH&Z@cB5D*LVT&HLXZ2?x02;oKOHNYxdhN==~MEUZ1Yy8-oEaK8JQ9BuzI%k4dFCjXq`Xsbvcxl678X)DFPf~!yDg+=R>3nvt>w5;7MF2 zLh@_@KtPf6jSSa^KBtNNz`ZG9JdMHoIoL5%q7M_269y3V8SI>=B88}mvMT~iz2)iR zj_2Db+1id{T^OVuu8^^dM<+opu?n-AmWchwR&T4bh|5QEV&U#1J-Tb@2!|5k@byPriN~7_4OH|bu%*E?>Cu^ z43(FfN6XrPbu1%uhj}s^?YpAf~Y-H!q97TwF>X{;dSr2jcdiZE9D8sds zk<3N>#Hcedr89F9)wjDi# zwKQE-0&YA7+nz&tSlNlEjmF(>Yz(?*`0G2b;5!!II15X?(tW0tKCmo}6z9#igi>Nt zN-z_+r~BjsESYUYy7d)I`Yjj>ab7JvqevmO<(;25&L63|1nKjBg1(%T%BfA`IS6gK z+_IK0#2J>H75(iBzl9c4UAj&i8@%+H+VCivDuZ5B4)G_|w*DI|HORh7)h7K7)?E1m z+Zj=q_{-9xqYCP^?YKV>H?8UDFe^_gXacUc?)safCH;A@_$|51w_E=x0w#I#Wu?&7 zx8R`mbNtkmqMH`J|JI>3^DSVd8=2J*aK;WT0UduAxwXwCQ?G)gf9dEhsB>BAxT?;! zP&~F4K*4ADI_$e(3guXRQmkfVSG_NCcpP#gs@Zlqa3}C%Goy^3-@a#yJ5Bj@$0@MU z+_dkxF_cuqH_~y+s<%8lu`krY?|*f)+LYOi7THcpk2lU$e4Go~|IP2k#ROXn1?li% z)F0*`cLsTlZPM&l0EUdli>bjpnFY;b=(?P4hlEiSC>e-LV;Ew?QdJxAMv#7y)l0B z_Q34-bniA<%*W#N;w#dFKj{!n;-`>fZJ7m}&$wmWhQ3S<;22dWCqZShUIw>N)YQH} zjN1(vAxN2UR=u1joQ!=R4K&;r`{BH{`gJnR{wWT7YK2u% z%e!u(gWNno(IMBo_~t{3goD(^GrBt9OS{F^M@zqAm)W;WRi38Qt1@9SlJ1X0fx&of zr8C#R)$}1|h5mV?ie%krAXoByU>mku(OU72Ps5SjAC1XM>VxFQ<s; zCC{hzW)}R{dGsXh^lE&%r)ggkxf(3*x__qejr~Oa!+B|vH%qLbQ z2%d1J6HV4aklisf{@n*L*+RhFHFY%lGkj z60exeW@nW#f)kXVgwv7dMfIFn{?_eZ|9gDbq zj$;LmezFx0f)ln%&xs;fYy)(H8O4124o6WYse$xC{=D%NRc(VUf1 z)r#3^X=%p{1DM-CKE+ykqY}X0vjuM3m@j zh8)*t$Zv%TDhOsslwYW~+Bfj2EfIeqh?@Bsn~*QpJsmZ|0;-I!?lkUaj{nVrOmu)& z0UXEj4y)sp1JFdkyo2HV$x_!9LhS5gQisd;QG6=(*$~$z^RU96;p+TGdDWe2Blk?- z7e_Q9jL~OUc1o77yM?5u+vQ>=9>ygp3s!O5b^boHGV+#B4nC%6opN~7;Ti*Ft;ssh zBerD3>#2?CZV2qaGS$&9a0YvgX8w#{)Bf@8O``p|a&6~7A<1yOADFgT_xrTa&On?< z`}O5qB!0I}4B35--T(seyrEtIFp2uZtNk~F%y4IM6+d#Gp9m4!DXy&Rl0u;_j@EI+ z7_BvjTI608ZoUk_ZirNB<19G03CN*5fZX;cBK|YmM9N-|#m?}CJiFGfvowds@R0KJ zf>4sP()(dWJ&9OQDeyH&vELV(iXU@oytd)+5_gCcyLNhyrk!puf+kL(FviTn6$O{q z2D|$x#Z3(6Y4Cfx_>#AFKO0IFl7vQfIu#At#6VTcDy@sJU$tUyW8Z{o<^WOA5WICv zkaC=5T`|$@v!6Bf^-70z)X-3lx&PFjlK<}saM!Y}iMq|sgfs_7V<0O1mDi_SAO}QA z?Y6th{yAXkozRHLnX|Pu`CuPYDYDA87 zN0fLH2{XK5tZgO-7Z@cCwy$Nz8}o`O7UH~Ko1TdLM12YUr;LJI(6$d3=NU`otSGxi z#QDh&41Teb)&rCQA?XHo|IOrMS4z2jN$GWQ(?nrVp8a>cZGz%Dx+;7o!O3xQ@v)K+ z_Ccw}gi(AwA~J8!!4+bNxlzo7{kN2ca0sr;;6&W zuk%>)oHKB=9o(?Kmbi7W@NCB$C`E`k{*!u`NnXLD1vt9Mq!|FQkl=eo7$#$RZtK`C zyzkkhP$u{-Hg!%`13scV^^d&^4ePJLo6Suww9;PhY9P9t7yT{|mKp;7bz(yJ z%LH(dFK|=C`IU>r!F~AG#ANsXNCe*r>kSPji<-?ja_~!}fbt&?imX>Hoj!TyFt^#t zj5`QPE;pzg>N5S~%1Xz@H~uTtPS&4qmQM_*J?X^vxyM0P5P_N>nBquaw%s}%-8MmI zH23c}4GMfzAB{+O84M05W-%D;#p3($SodHEahRvH3iMAtr7QOzgwoDAqlACJ;@ZuNRu`o6?7$ z(yY|w^Y?U0k%USAaUASZHAZZ>{5S~`Qy$1QpPCJ0LlN$_xVa==6rkcEP0@aFr@yJ= z1hCEZp5Ry$r$p429~!W{Buc)2=#8=N!k-|`Y>|guMMTYTX2Oll&0!IPyB?*AXaGsZ zgW&5rpEGBE!ris{)*^%=oG?5b__m-%0Q2jUFpH#Z3kNY?i_jBMOW7III&XRM z9uR;G2Y9;B1mwWS^33$is;g8o>vPg>aZZG*J^BAEbuVjR5#X_x56{06t~o!}ixlEq zWXynZY2tJ(iTFI*2D0beZn)5z?lfL!E4?U;$dA(tg}2xHIBb-*(<+Coa6mbu6EL92h(MLx|;9cnN^vV%>7H5NSW*HlXkz${w$uk28u;F z*W;}t37I{O&4QFABuSKQ<=jM`N?sf^PG$!`%2~QNSh~6*Am4f*E>_T_iOg^q-PIy5 zT1J}UY5dNw7S0}b{ivKyPdCmqeaXd>>;;%hXVY0-XMV}F!>P>Lyg>rTMr~q6G+yU5 zf~Y=MajyfDNt#^Gj${dLX^?_=iHpvW{;N##Rf~AvGJLrjty`Z**Lk_~?aN25EXs@| zjQjYpY!zXKvv6z3G769Z-r5F&)Dty8i88VM-tj=13X^8teIKP@-)=_i84wOnmnAf3 z?tRI_FTeGBBz@e2OZ`R}FR}UN((LZr8y)9%EZ;uq+opFJfw=>Bu)#_XG`1xm-~$O0 zgmnqa?DUG7X%S$CO0r-zqxXZ8gvCwA0i>1p58dT6$+cf!2Bc-Kz`9y3UvfYqI2pyN z@_QO_Q{^)fKFd{5aP{lV;p0SFkkOfqNsrr0<<6dK824Vf1fHg;{CYUAq_1BcjC^$V zzd2%7_PgY_9ni!Tkox5U+2{+)OFZ;zo2d6+TwE3nJeyDfT1$gJZYL1G+5m`;1)dcj zT06qmLxu0s==<1`hE4ugS^ z7*1cC@wC~2ZOU{7Nv+{{T!pf;GG)&U>HBRhQgtECOZ~=Dt_%qRg|q^};h$vvpFAj8 zJvAF#;YT&@E5^n0F6|qA~v>S&W3A_&a~ApU=@|KQHZ5 zOL10rdQ#}F05(p)H%EWO@ExR&?PWsk9(0UXD5|yGaXf(=`8$Cfi6&}?iQQ<9zmNNK zk@(<0BcLsK`tIAs;mWT!Z+~!Yye;S=Lpmha(#_cB5+$aac8dMF9(C~EL6ujdH{7nd zG=QRuMzwX@Nek2{zKHeLBV*mBT94+(huZ;PP5ACO1-p%!{2?N|;%t0VF9`(TN@^e; zO5hHIR-tH(121Z`7~xgvkg~1>M96mJ{RF17hSm?Rr62Kg#2>6;V}ST+ot7LTcs&7q4dVyQ#OC;{ytOGF}38iBE{V$ zu_)oO8DsW-*qymbpqc!0e9_b4_b%<8+E{-_{g0!~8Gda%cZr(QM9NU$hJeVv?QEB9 z?=E@nurn~;joyH}!=o?bLS>Ps#nT^le7cl{5pS#l^m~_S>USkyjI)VX=;S&F_CHNl&sf zVuuzN7Ugfzda5?225&l^R*F@whuvM;J7 zi(uFIkPon!>*CeSj%~|(J*buO<)rUlQS`sIo%H?<^3YLX+|n~$ZH1|m27*zOv_GOl zIRSNZLy080FfXjaiVtay;)!K4F4crb(rh&PX3*Ynr$sr{Z5?@mZ<8Aw5FmJhC26CV&!Ou}F_dGIh3*aZ{TBKw1vHB~&5$}}7 zxzb>9G@T_0Ql-ZYBg#V1D6F>$43&pnEZCBKZXlvt?S$>xg1c9zJAq!*4{m zbKb0uCQ<)`FU#NoJXw&+1Lz{6x!c zBvFx;h}@)6@?8$UDLt56I?wD~kUsOend$BrAG{zur;#a-Oh5gp@i!A?Kn&kl+$>Mj zxxVEHns@C&_0PoED-vonmAg{*)NSD`n5;xu^2^us@;y;-(r02MVvGuSPJmR7_vA`xr+w%z#v?VDA+noa+e@RZpsLT*2z24kU(-lIa6hPef7Y=l5Uic4SGW zZGG8nX^X_nNPkC)PWt5C705->T8DvKE4KfZ@Nvz)1*iYsAfRIU=}XuzY8f-543Mk` z(H4^1R%u>Cd}rAW&7x)uH;#ez0aR~>qkCw;bPGkA(Q!7uCJSO8vm&TMM1?cdsI{&# zFWZ0@aXa;1YygX|g=D7QT%|{FtrALWt6+dVjr#!L?4>p%+L@ODY4`!vd9|oaYTBs? zU}SKA_=hKBw9iPwcYMdq6m4^uuhwo==bI3!Bq|9AkrNwxgnExJB)i9{5x#^qY~$;>j-J3 z!uvlB%Qw@-dTxWgszc{fwFQ93%}u*IbEXHwOnB^`6TNYvf84Pr$4T}W)PG$;{LQ;? zO_Pl70hx#6rV%;nVe0=}Z&PV(ui@lfYz}tQSJ!@U<>OySxa`fqI0|_zUr3er6bw2` zB&nQSbZYoE`mDSCa+y9>Q;L4~B^kD4zzxJH8wrnaHCo|SREfe8QdXjtASSD^BN1Ei zKfQ_qX8xgGdA9kF(e1pY5GBrOfopWh4N{h5X&EF7rQP!CIL*j2M>E7dqVg8}p{s*@ zHSp4b7hp{u%D5qvENoUrGRmsSG9hnypo}J7_-5J2v zt@BH16^?s9rD&;iC^|8m>iWYX*pc}jrGjiCWBmiQq#*gnx*ym;POa8odhf({{7cj= zu4?Ni6Agpjqy)zdo<0y!4M*}u_XctfSvgsaPX$s;-#?x;+?yAbR#rVao~BEy+!|!H zAg#pEl6uK{KN;J@Ym{eF``2F}G%CXBcEgqFj0AE-`GM>0<}k`%~?$ zp2RS`-?$=u?P;qk)G+u0Ci(%?Uf<9H2ar=J5V!sR;(@1RoUk3>O l@52QDkNZ6*<-A8ccihz*Nri(N^ic~8H6=~O3VDmr{{_oT=mh`( diff --git a/src/qt/res/movies/spinner-024.png b/src/qt/res/movies/spinner-024.png deleted file mode 100644 index 6d4f2c572d6435355a7fcf9a2bed0427f39b5b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 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 diff --git a/src/qt/res/movies/spinner-025.png b/src/qt/res/movies/spinner-025.png deleted file mode 100644 index 153330fcd66154be58e01069d9d090433176438d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8637 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�%X}Oi^pk^sgmG`fdU0z`I%;Byr@?jhb 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 diff --git a/src/qt/res/movies/spinner-027.png b/src/qt/res/movies/spinner-027.png deleted file mode 100644 index 8bff4d7490150d3fd930dcf7157b6b81b2bb9bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8641 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 diff --git a/src/qt/res/movies/spinner-028.png b/src/qt/res/movies/spinner-028.png deleted file mode 100644 index c48d9e487c70f26013711635b785d71d9b9807ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 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 diff --git a/src/qt/res/movies/spinner-029.png b/src/qt/res/movies/spinner-029.png deleted file mode 100644 index 6d4f2c572d6435355a7fcf9a2bed0427f39b5b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 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 diff --git a/src/qt/res/movies/spinner-030.png b/src/qt/res/movies/spinner-030.png deleted file mode 100644 index 153330fcd66154be58e01069d9d090433176438d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8637 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�%X}Oi^pk^sgmG`fdU0z`I%;Byr@?jhb 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 diff --git a/src/qt/res/movies/spinner-032.png b/src/qt/res/movies/spinner-032.png deleted file mode 100644 index 8bff4d7490150d3fd930dcf7157b6b81b2bb9bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8641 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 diff --git a/src/qt/res/movies/spinner-033.png b/src/qt/res/movies/spinner-033.png deleted file mode 100644 index c48d9e487c70f26013711635b785d71d9b9807ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 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 diff --git a/src/qt/res/movies/spinner-034.png b/src/qt/res/movies/spinner-034.png deleted file mode 100644 index 6d4f2c572d6435355a7fcf9a2bed0427f39b5b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 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 diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index 04a73bc..543eb02 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -88,91 +88,78 @@ class TransactionTablePriv } /* Update our model of the wallet incrementally, to synchronize our model of the wallet - with that of the core. + with that of the core. - Call with transaction that was added, removed or changed. - */ + Call with transaction that was added, removed or changed. + */ void updateWallet(const uint256 &hash, int status) { - qDebug() << "TransactionTablePriv::updateWallet : " + QString::fromStdString(hash.ToString()) + " " + QString::number(status); - { - LOCK2(cs_main,wallet->cs_wallet); + LOCK2(cs_main,wallet->cs_wallet); + + auto mi = wallet->mapWallet.find(hash); + bool inWallet = mi != wallet->mapWallet.end(); + bool showTransaction = (inWallet && TransactionRecord::showTransaction(mi->second)); - // Find transaction in wallet - std::map::iterator mi = wallet->mapWallet.find(hash); - bool inWallet = mi != wallet->mapWallet.end(); + auto lower = qLowerBound(cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); + auto upper = qUpperBound(cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); + bool inModel = (lower != upper); - // Find bounds of this transaction in model - QList::iterator lower = qLowerBound( - cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); - QList::iterator upper = qUpperBound( - cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); - int lowerIndex = (lower - cachedWallet.begin()); - int upperIndex = (upper - cachedWallet.begin()); - bool inModel = (lower != upper); + if(status == CT_UPDATED && showTransaction == inModel) + return; - // Determine whether to show transaction or not - bool showTransaction = (inWallet && TransactionRecord::showTransaction(mi->second)); + #ifdef DEBUG + qDebug() << "TransactionTablePriv::updateWallet : " + QString::fromStdString(hash.ToString()) + " " + QString::number(status); + qDebug() << " inWallet=" + QString::number(inWallet) + " inModel=" + QString::number(inModel) + + " Index=" + QString::number(lower - cachedWallet.begin()) + "-" + QString::number(upper - cachedWallet.begin()) + + " showTransaction=" + QString::number(showTransaction) + " derivedStatus=" + QString::number(status); + #endif - if(status == CT_UPDATED) + switch(status) + { + case CT_NEW: + if(inModel) { - if(showTransaction && !inModel) - status = CT_NEW; /* Not in model, but want to show, treat as new */ - if(!showTransaction && inModel) - status = CT_DELETED; /* In model, but want to hide, treat as deleted */ + #ifdef DEBUG + qDebug() << "TransactionTablePriv::updateWallet : Warning: Got CT_NEW, but transaction is already in model"; + #endif + break; } - - qDebug() << " inWallet=" + QString::number(inWallet) + " inModel=" + QString::number(inModel) + - " Index=" + QString::number(lowerIndex) + "-" + QString::number(upperIndex) + - " showTransaction=" + QString::number(showTransaction) + " derivedStatus=" + QString::number(status); - - switch(status) + if(!inWallet) { - case CT_NEW: - if(inModel) - { - qDebug() << "TransactionTablePriv::updateWallet : Warning: Got CT_NEW, but transaction is already in model"; - break; - } - if(!inWallet) - { - qDebug() << "TransactionTablePriv::updateWallet : Warning: Got CT_NEW, but transaction is not in wallet"; - break; - } - if(showTransaction) + #ifdef DEBUG + qDebug() << "TransactionTablePriv::updateWallet : Warning: Got CT_NEW, but transaction is not in wallet"; + #endif + break; + } + if(showTransaction) + { + QList toInsert = TransactionRecord::decomposeTransaction(wallet, mi->second); + if(!toInsert.isEmpty()) { - // Added -- insert at the right position - QList toInsert = - TransactionRecord::decomposeTransaction(wallet, mi->second); - if(!toInsert.isEmpty()) /* only if something to insert */ + int lowerIndex = lower - cachedWallet.begin(); + parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex+toInsert.size()-1); + for (const TransactionRecord &rec : toInsert) { - parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex+toInsert.size()-1); - int insert_idx = lowerIndex; - for (const TransactionRecord &rec : toInsert) - { - cachedWallet.insert(insert_idx, rec); - insert_idx += 1; - } - parent->endInsertRows(); + cachedWallet.append(rec); } + parent->endInsertRows(); } - break; - case CT_DELETED: - if(!inModel) - { - qDebug() << "TransactionTablePriv::updateWallet : Warning: Got CT_DELETED, but transaction is not in model"; - break; - } - // Removed -- remove entire transaction from table - parent->beginRemoveRows(QModelIndex(), lowerIndex, upperIndex-1); - cachedWallet.erase(lower, upper); - parent->endRemoveRows(); - break; - case CT_UPDATED: - // Miscellaneous updates -- nothing to do, status update will take care of this, and is only computed for - // visible transactions. + } + break; + case CT_DELETED: + if(!inModel) + { + #ifdef DEBUG + qDebug() << "TransactionTablePriv::updateWallet : Warning: Got CT_DELETED, but transaction is not in model"; + #endif break; } + parent->beginRemoveRows(QModelIndex(), lower - cachedWallet.begin(), upper - cachedWallet.begin() - 1); + cachedWallet.erase(lower, upper); + parent->endRemoveRows(); + break; + case CT_UPDATED: + break; } } diff --git a/src/triesync.cpp b/src/triesync.cpp index aedb35f..edf8975 100644 --- a/src/triesync.cpp +++ b/src/triesync.cpp @@ -212,9 +212,6 @@ bool overlap(list::iterator it, list::iterator it2){ return (overlap_left(it,it2) || overlap_left(it2,it)); } - - - void TrieSync::GetIntervals(multimap &slices, list &intervals){ //We want to produce a vector of all intervals that either have requests outstanding //or have already been fetched @@ -347,46 +344,46 @@ bool TrieSync::ReadyToBuild(){ return true; } -//TODO: all wrong void TrieSync::ApplyTransactions(map &data, CBlock &block){ - //Txout first + // Process outputs first for (CTransaction tx : block.vtx){ - for (CTxOut txout : tx.vout){ - AccountData ad; - if(data.find(txout.pubKey)!=data.end()) - ad = data[txout.pubKey]; - ad.SetKey(txout.pubKey); - //No set age on output -// ad.SetAge(block.nHeight); - ad.SetBalance(ad.Balance()+txout.nValue); - data[txout.pubKey] = ad; - } + for (CTxOut txout : tx.vout){ + AccountData ad; + if(data.find(txout.pubKey) != data.end()) + ad = data[txout.pubKey]; + ad.SetKey(txout.pubKey); + // No set age on output + // ad.SetAge(block.nHeight); + ad.SetBalance(ad.Balance() + txout.nValue); + data[txout.pubKey] = ad; + } } + // Then process inputs for (CTransaction tx : block.vtx){ - for (CTxIn txin : tx.vin){ - if(data.find(txin.pubKey)==data.end()) - continue; //Account not in slices yet, no worries - AccountData ad = data[txin.pubKey]; - - if(txin.nValue >= ad.Balance()){ - data.erase(txin.pubKey); - continue; - } - if(tx.fSetLimit) - ad.SetFutureLimit(tx.nLimitValue); - - if(ad.FutureLimit() < ad.Limit()) - ad.SetLimit(ad.FutureLimit()); - - if(block.nHeight - ad.Age() > MIN_LIMIT_TIME){ - ad.SetLimit(ad.FutureLimit()); - } - ad.SetAge(block.nHeight); - - ad.SetBalance(ad.Balance()-txin.nValue); - data[txin.pubKey] = ad; - } + for (CTxIn txin : tx.vin){ + if(data.find(txin.pubKey) == data.end()) + continue; // Account not in slices yet, no worries + AccountData ad = data[txin.pubKey]; + + if(txin.nValue >= ad.Balance()){ + data.erase(txin.pubKey); + continue; + } + if(tx.fSetLimit) + ad.SetFutureLimit(tx.nLimitValue); + + if(ad.FutureLimit() < ad.Limit()) + ad.SetLimit(ad.FutureLimit()); + + if(block.nHeight - ad.Age() > MIN_LIMIT_TIME){ + ad.SetLimit(ad.FutureLimit()); + } + ad.SetAge(block.nHeight); + + ad.SetBalance(ad.Balance() - txin.nValue); + data[txin.pubKey] = ad; + } } } diff --git a/src/txdb.cpp b/src/txdb.cpp index 0f2284d..d4cced1 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -92,46 +92,38 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) { } bool CBlockTreeDB::LoadBlockIndexGuts() { - leveldb::Iterator *pcursor = NewIterator(); - CDataStream ssKeySet(SER_DISK, CLIENT_VERSION), ssKey(SER_DISK, CLIENT_VERSION), ssValue(SER_DISK, CLIENT_VERSION); + std::unique_ptr pcursor(NewIterator()); + CDataStream ssKeySet(SER_DISK, CLIENT_VERSION); ssKeySet << std::make_pair('b', uint256(0)); pcursor->Seek(ssKeySet.str()); while (pcursor->Valid()) { boost::this_thread::interruption_point(); - - // Reusing the streams by clearing them for new data - ssKey.clear(); - ssValue.clear(); - + leveldb::Slice slKey = pcursor->key(); leveldb::Slice slValue = pcursor->value(); - - ssKey.reserve(slKey.size()); - ssKey.write(slKey.data(), slKey.size()); + + CDataStream ssKey(slKey.data(), slKey.data() + slKey.size(), SER_DISK, CLIENT_VERSION); + CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION); + char chType; ssKey >> chType; if (chType == 'b') { - ssValue.reserve(slValue.size()); - ssValue.write(slValue.data(), slValue.size()); CDiskBlockIndex diskindex; - try { ssValue >> diskindex; } catch (std::exception &e) { - delete pcursor; return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what()); } if (!diskindex.CheckIndex()) { error("LoadBlockIndex() : CheckIndex failed: %s", diskindex.GetBlockHash().ToString().c_str()); - pcursor->Next(); continue; } CBlockIndex* pindexNew = InsertBlockIndex(diskindex.GetBlockHash(), diskindex.GetBlockHeader()); - if (pindexNew) { // Check for null pointer + if (pindexNew) { pindexNew->nFile = diskindex.nFile; pindexNew->nDataPos = diskindex.nDataPos; pindexNew->nUndoPos = diskindex.nUndoPos; @@ -139,11 +131,9 @@ bool CBlockTreeDB::LoadBlockIndexGuts() { pindexNew->nTx = diskindex.nTx; } } else { - break; // Finished loading block index + break; } pcursor->Next(); } - - delete pcursor; // Always free resources return true; } diff --git a/src/util.h b/src/util.h index 74fac6a..9464644 100644 --- a/src/util.h +++ b/src/util.h @@ -275,19 +275,19 @@ inline int64_t abs64(int64_t n) } template -std::string HexStr(const T itbegin, const T itend, bool fSpaces=false) +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', - '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - rv.reserve((itend-itbegin)*3); - for(T it = itbegin; it < itend; ++it) + static const 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) { unsigned char val = (unsigned char)(*it); - if(fSpaces && it != itbegin) + if (fSpaces && it != itbegin) rv.push_back(' '); - rv.push_back(hexmap[val>>4]); - rv.push_back(hexmap[val&15]); + rv.push_back(hexmap[val >> 4]); + rv.push_back(hexmap[val & 15]); } return rv; @@ -456,7 +456,7 @@ template class CMedianFilter nSize(size) { vValues.reserve(size); - vValues.push_back(initial_value); + vValues.emplace_back(initial_value); vSorted = vValues; } @@ -466,7 +466,7 @@ template class CMedianFilter { vValues.erase(vValues.begin()); } - vValues.push_back(value); + vValues.emplace_back(value); vSorted.resize(vValues.size()); std::copy(vValues.begin(), vValues.end(), vSorted.begin()); From 922c8c25e7e5cec1a1928da0a116e1836d322990 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Tue, 23 Jan 2024 22:48:03 +1000 Subject: [PATCH 21/22] Duplicate Tx check sets. Use seperate sets for tx inputs & outputs in duplicate checks to avoid false positives. --- src/main.cpp | 116 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 45 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 6bb6d94..3501bcc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -440,72 +440,98 @@ unsigned int GetLegacySigOpCount(const CTransaction& tx) bool CheckTransaction(const CTransaction& tx, CValidationState &state) { - // Store the sizes of vin and vout to avoid multiple calls - size_t vinSize = tx.vin.size(); - size_t voutSize = tx.vout.size(); - - // Combined checks for empty transaction inputs and outputs - if (vinSize == 0 || voutSize == 0) - return state.DoS(10, error("CheckTransaction() : vin or vout empty"), - REJECT_INVALID, "bad-txns-vin-empty"); - + // Basic checks that don't depend on any context + if (tx.vin.empty()) + return state.DoS(10, error("CheckTransaction() : vin empty"), + REJECT_INVALID, "bad-txns-vin-empty"); + if (tx.vout.empty()) + return state.DoS(10, error("CheckTransaction() : vout empty"), + REJECT_INVALID, "bad-txns-vout-empty"); // Size limits if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_BLOCK_SIZE) return state.DoS(100, error("CheckTransaction() : size limits failed"), - REJECT_INVALID, "bad-txns-oversize"); + REJECT_INVALID, "bad-txns-oversize"); // Check for negative or overflow output values - uint64_t nValueOut = tx.GetValueOut(); - uint64_t nValueIn = tx.GetValueIn(); + uint64_t nValueOut; + try { + nValueOut = tx.GetValueOut(); + } catch (int e) { + return state.DoS(100, error("CheckTransaction() : txout total out of range"), + REJECT_INVALID, "bad-txns-txouttotal-toolarge"); + } - if (nValueIn < nValueOut) - { + uint64_t nValueIn; + try { + nValueIn = tx.GetValueIn(); + } catch (int e) { + return state.DoS(100, error("CheckTransaction() : txin total out of range"), + REJECT_INVALID, "bad-txns-txintotal-toolarge"); + } + + if(nValueIn < nValueOut){ return state.DoS(100, error("CheckTransaction() : txin < txout"), - REJECT_INVALID, "bad-txns-makes-money"); + REJECT_INVALID, "bad-txns-makes-money"); } + //uint64_t nFees = nValueIn - nValueOut; //Check message size - if(tx.msg.size() > MAX_MSG_SIZE) - { + if(tx.msg.size() > MAX_MSG_SIZE){ return state.DoS(100, error("CheckTransaction() : msg too long"), - REJECT_INVALID, "bad-txns-msg-length"); + REJECT_INVALID, "bad-txns-msg-length"); + } + + if (!tx.IsCoinBase()) { + for (const CTxIn& txin : tx.vin) + { + uint64_t balance=0; + pviewTip->Balance(txin.pubKey,balance); + if(balance > 1800000000 * COIN) + return state.DoS(100, error("CheckTransaction() : txin out of range"), + REJECT_INVALID, "bad-txns-txintotal-toolarge"); + } + } + + // Check for duplicate inputs + set vInOutPoints; + for (const CTxIn& txin : tx.vin) + { + if (vInOutPoints.count(txin.pubKey)) + return state.DoS(100, error("CheckTransaction() : duplicate inputs"), + REJECT_INVALID, "bad-txns-inputs-duplicate"); + vInOutPoints.insert(txin.pubKey); + } + + // Check for duplicate outputs + vInOutPoints.clear(); + for (const CTxOut& txout : tx.vout) + { + if (vInOutPoints.count(txout.pubKey)) + return state.DoS(100, error("CheckTransaction() : duplicate outputs"), + REJECT_INVALID, "bad-txns-output-duplicate"); + vInOutPoints.insert(txout.pubKey); } - // Early return for coinbase transactions if (tx.IsCoinBase()) { - if (tx.vin[0].scriptSig.size() != 0) - { - printf("SciptSig: %ld\n", tx.vin[0].scriptSig.size()); + if (tx.vin[0].scriptSig.size() != 0){ + printf("SciptSig: %ld\n", tx.vin[0].scriptSig.size()); return state.DoS(100, error("CheckTransaction() : coinbase script size"), - REJECT_INVALID, "bad-cb-length"); - } - - if (voutSize != 1) - { + REJECT_INVALID, "bad-cb-length"); + } + if(tx.vout.size() != 1){ return state.DoS(100, error("CheckTransaction() : coinbase outputs"), - REJECT_INVALID, "bad-cb-output"); - } - return true; + REJECT_INVALID, "bad-cb-output"); + } } - - // Single loop for duplicate checks - set vInOutPoints; - for (size_t i = 0; i < max(vinSize, voutSize); i++) + else { - if (i < vinSize && !vInOutPoints.insert(tx.vin[i].pubKey).second) - return state.DoS(100, error("CheckTransaction() : duplicate inputs"), - REJECT_INVALID, "bad-txns-inputs-duplicate"); - if (i < voutSize && !vInOutPoints.insert(tx.vout[i].pubKey).second) - return state.DoS(100, error("CheckTransaction() : duplicate outputs"), - REJECT_INVALID, "bad-txns-output-duplicate"); + for (const CTxIn& txin : tx.vin) + if (txin.IsNull()) + return state.DoS(10, error("CheckTransaction() : input is null"), + REJECT_INVALID, "bad-txns-input-null"); } - for (const CTxIn& txin : tx.vin) - if (txin.IsNull()) - return state.DoS(10, error("CheckTransaction() : input is null"), - REJECT_INVALID, "bad-txns-input-null"); - return true; } From 7c42b76a0fbc63003dbfc644b47e3896a2454df0 Mon Sep 17 00:00:00 2001 From: e-nexus <34931578+e-nexus@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:05:31 +1000 Subject: [PATCH 22/22] Minor cleanup of configure.ac --- configure.ac | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) diff --git a/configure.ac b/configure.ac index a270e80..a2b6ccd 100644 --- a/configure.ac +++ b/configure.ac @@ -75,23 +75,6 @@ AC_PATH_PROG(XGETTEXT,xgettext) AC_PATH_PROG(HEXDUMP,hexdump) PKG_PROG_PKG_CONFIG -# Define variables for each check -AC_CHECK_HEADER([mm3dnow.h], [mm3dnow=yes], [mm3dnow=no]) -AC_CHECK_HEADER([avxintrin.h], [avx=yes], [avx=no]) -AC_CHECK_HEADER([avx2intrin.h], [avx2=yes], [avx2=no]) -AC_CHECK_HEADER([avx512fintrin.h], [avx512=yes], [avx512=no]) -AC_CHECK_HEADER([xopintrin.h], [xop=yes], [xop=no]) -AC_CHECK_HEADER([fma4intrin.h], [fma4=yes], [fma4=no]) -AC_CHECK_HEADER([fmaintrin.h], [fma3=yes], [fma3=no]) -AC_CHECK_HEADER([mmintrin.h], [mmx=yes], [mmx=no]) -AC_CHECK_HEADER([xmmintrin.h], [sse=yes], [sse=no]) -AC_CHECK_HEADER([emmintrin.h], [sse2=yes], [sse2=no]) -AC_CHECK_HEADER([pmmintrin.h], [sse3=yes], [sse3=no]) -AC_CHECK_HEADER([tmmintrin.h], [ssse3=yes], [ssse3=no]) -AC_CHECK_HEADER([smmintrin.h], [sse41=yes], [sse41=no]) -AC_CHECK_HEADER([nmmintrin.h], [sse42=yes], [sse42=no]) -AC_CHECK_HEADER([wmmintrin.h], [sse4=yes], [sse4=no]) - # Enable wallet AC_ARG_ENABLE([wallet], [AS_HELP_STRING([--enable-wallet], @@ -306,22 +289,6 @@ case $host in ;; esac -AS_IF([echo "$CXXFLAGS" | grep -q -e "-march"], - [ - AC_MSG_WARN([CXXFLAGS already contains -march flag; additional optimizations will not be checked]) - ], - [ - AX_CHECK_COMPILE_FLAG([-march=native], - [ - CXXFLAGS="$CXXFLAGS -march=native" - ], - [ - AC_MSG_WARN([Compiler optimizations specific to the native architecture cannot be used]) - ] - ) - ] -) - if test x$use_comparison_tool != xno; then AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) fi @@ -642,7 +609,6 @@ AC_MSG_RESULT($build_bitcoin_cli) dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) - if test x$use_ipv6 = xyes; then dnl Check for ipv6 build requirements AC_MSG_CHECKING(for operating system IPv6 support) @@ -875,20 +841,6 @@ echo "${MEDIUM_GREY}============================ System Information ============ echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" echo "${MEDIUM_GREY}Target OS: ${LIGHT_GREY}$TARGET_OS${NC}" echo "${MEDIUM_GREY}Build OS: ${LIGHT_GREY}$BUILD_OS${NC}" -echo " ${MEDIUM_GREY}3DNow!: ${LIGHT_GREY}${mm3dnow}${NC}" -echo " ${MEDIUM_GREY}AVX: ${LIGHT_GREY}${avx}${NC}" -echo " ${MEDIUM_GREY}AVX2: ${LIGHT_GREY}${avx2}${NC}" -echo " ${MEDIUM_GREY}AVX-512: ${LIGHT_GREY}${avx512}${NC}" -echo " ${MEDIUM_GREY}XOP: ${LIGHT_GREY}${xop}${NC}" -echo " ${MEDIUM_GREY}FMA4: ${LIGHT_GREY}${fma4}${NC}" -echo " ${MEDIUM_GREY}FMA3: ${LIGHT_GREY}${fma3}${NC}" -echo " ${MEDIUM_GREY}MMX: ${LIGHT_GREY}${mmx}${NC}" -echo " ${MEDIUM_GREY}SSE: ${LIGHT_GREY}${sse}${NC}" -echo " ${MEDIUM_GREY}SSE2: ${LIGHT_GREY}${sse2}${NC}" -echo " ${MEDIUM_GREY}SSE3: ${LIGHT_GREY}${sse3}${NC}" -echo " ${MEDIUM_GREY}SSSE3: ${LIGHT_GREY}${ssse3}${NC}" -echo " ${MEDIUM_GREY}SSE4.1: ${LIGHT_GREY}${sse41}${NC}" -echo " ${MEDIUM_GREY}SSE4.2: ${LIGHT_GREY}${sse42}${NC}" echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}" echo "${MEDIUM_GREY}=========================== Application Options ===========================${NC}" echo "${DARK_GREY}═══════════════════════════════════════════════════════════════════════════${NC}"