diff --git a/CHANGELOG.md b/CHANGELOG.md index ee596c3..4a137cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v6.9.0 +- [#2104](https://github.com/xmrig/xmrig/pull/2104) Added [pause-on-active](https://xmrig.com/docs/miner/config/misc#pause-on-active) config option and `--pause-on-active=N` command line option. +- [#2112](https://github.com/xmrig/xmrig/pull/2112) Added support for [Tari merge mining](https://github.com/tari-project/tari/blob/development/README.md#tari-merge-mining). +- [#2117](https://github.com/xmrig/xmrig/pull/2117) Fixed crash when GPU mining `cn-heavy` on Zen3 system. + # v6.8.2 - [#2080](https://github.com/xmrig/xmrig/pull/2080) Fixed compile error in Termux. - [#2089](https://github.com/xmrig/xmrig/pull/2089) Optimized CryptoNight-Heavy for Zen3, 7-8% speedup. diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a927ab..c1f403a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,8 +147,10 @@ elseif (XMRIG_OS_APPLE) src/App_unix.cpp src/crypto/common/VirtualMemory_unix.cpp ) + find_library(IOKIT_LIBRARY IOKit) - set(EXTRA_LIBS ${IOKIT_LIBRARY}) + find_library(CORESERVICES_LIBRARY CoreServices) + set(EXTRA_LIBS ${IOKIT_LIBRARY} ${CORESERVICES_LIBRARY}) else() list(APPEND SOURCES_OS src/App_unix.cpp diff --git a/README.md b/README.md index 6596983..dddb396 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ XMRig is a high performance, open source, cross platform RandomX, KawPow, Crypto * **[Build from source](https://xmrig.com/docs/miner/build)** ## Usage -The preferred way to configure the miner is the [JSON config file](src/config.json) as it is more flexible and human friendly. The [command line interface](https://xmrig.com/docs/miner/command-line-options) does not cover all features, such as mining profiles for different algorithms. Important options can be changed during runtime without miner restart by editing the config file or executing API calls. +The preferred way to configure the miner is the [JSON config file](https://xmrig.com/docs/miner/config) as it is more flexible and human friendly. The [command line interface](https://xmrig.com/docs/miner/command-line-options) does not cover all features, such as mining profiles for different algorithms. Important options can be changed during runtime without miner restart by editing the config file or executing [API](https://xmrig.com/docs/miner/api) calls. * **[Wizard](https://xmrig.com/wizard)** helps you create initial configuration for the miner. * **[Workers](http://workers.xmrig.info)** helps manage your miners via HTTP API. diff --git a/doc/CPU.md b/doc/CPU.md index 508f1e2..41f1813 100644 --- a/doc/CPU.md +++ b/doc/CPU.md @@ -1,3 +1,5 @@ +**:warning: Recent version of this page https://xmrig.com/docs/miner/config/cpu.** + # CPU backend All CPU related settings contains in one `cpu` object in config file, CPU backend allow specify multiple profiles and allow switch between them without restrictions by pool request or config change. Default auto-configuration create reasonable minimum of profiles which cover all supported algorithms. diff --git a/src/backend/cpu/CpuWorker.cpp b/src/backend/cpu/CpuWorker.cpp index 794d773..aed7919 100644 --- a/src/backend/cpu/CpuWorker.cpp +++ b/src/backend/cpu/CpuWorker.cpp @@ -83,7 +83,7 @@ xmrig::CpuWorker::CpuWorker(size_t id, const CpuLaunchData &data) : { # ifdef XMRIG_ALGO_CN_HEAVY // cn-heavy optimization for Zen3 CPUs - if ((N == 1) && (m_av == CnHash::AV_SINGLE) && (m_algorithm.family() == Algorithm::CN_HEAVY) && (Cpu::info()->arch() == ICpuInfo::ARCH_ZEN3)) { + if ((N == 1) && (m_av == CnHash::AV_SINGLE) && (m_algorithm.family() == Algorithm::CN_HEAVY) && (m_assembly != Assembly::NONE) && (Cpu::info()->arch() == ICpuInfo::ARCH_ZEN3)) { std::lock_guard lock(cn_heavyZen3MemoryMutex); if (!cn_heavyZen3Memory) { cn_heavyZen3Memory = new VirtualMemory(m_algorithm.l3() * m_threads, data.hugePages, false, false, node()); diff --git a/src/base/io/log/Tags.cpp b/src/base/io/log/Tags.cpp index 3960a14..23ef63d 100644 --- a/src/base/io/log/Tags.cpp +++ b/src/base/io/log/Tags.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,6 +37,14 @@ const char *xmrig::Tags::network() } +const char* xmrig::Tags::origin() +{ + static const char* tag = YELLOW_BG_BOLD(WHITE_BOLD_S " origin "); + + return tag; +} + + const char *xmrig::Tags::signal() { static const char *tag = YELLOW_BG_BOLD(WHITE_BOLD_S " signal "); diff --git a/src/base/io/log/Tags.h b/src/base/io/log/Tags.h index 9f690ef..07312d4 100644 --- a/src/base/io/log/Tags.h +++ b/src/base/io/log/Tags.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ class Tags public: static const char *config(); static const char *network(); + static const char *origin(); static const char *signal(); # ifdef XMRIG_MINER_PROJECT diff --git a/src/base/kernel/Platform.cpp b/src/base/kernel/Platform.cpp index 955a4ea..ef2b67e 100644 --- a/src/base/kernel/Platform.cpp +++ b/src/base/kernel/Platform.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2020 SChernykh - * Copyright (c) 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/base/kernel/Platform.h b/src/base/kernel/Platform.h index 293cedc..04c212e 100644 --- a/src/base/kernel/Platform.h +++ b/src/base/kernel/Platform.h @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2020 SChernykh - * Copyright (c) 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -46,9 +46,11 @@ public: static void setProcessPriority(int priority); static void setThreadPriority(int priority); - static inline const String &userAgent() { return m_userAgent; } + static inline bool isUserActive(uint64_t ms) { return idleTime() < ms; } + static inline const String &userAgent() { return m_userAgent; } static bool isOnBatteryPower(); + static uint64_t idleTime(); private: static char *createUserAgent(); diff --git a/src/base/kernel/Platform_mac.cpp b/src/base/kernel/Platform_mac.cpp index 20ad965..d07e925 100644 --- a/src/base/kernel/Platform_mac.cpp +++ b/src/base/kernel/Platform_mac.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2020 SChernykh - * Copyright (c) 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -107,3 +107,18 @@ bool xmrig::Platform::isOnBatteryPower() { return IOPSGetTimeRemainingEstimate() != kIOPSTimeRemainingUnlimited; } + + +uint64_t xmrig::Platform::idleTime() +{ + uint64_t idle_time = 0; + const auto service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOHIDSystem")); + const auto property = IORegistryEntryCreateCFProperty(service, CFSTR("HIDIdleTime"), kCFAllocatorDefault, 0); + + CFNumberGetValue((CFNumberRef)property, kCFNumberSInt64Type, &idle_time); + + CFRelease(property); + IOObjectRelease(service); + + return idle_time / 1000000U; +} diff --git a/src/base/kernel/Platform_unix.cpp b/src/base/kernel/Platform_unix.cpp index bbded9f..f5bbc19 100644 --- a/src/base/kernel/Platform_unix.cpp +++ b/src/base/kernel/Platform_unix.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2020 SChernykh - * Copyright (c) 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,6 +34,7 @@ #include #include #include +#include #include "base/kernel/Platform.h" @@ -158,3 +159,9 @@ bool xmrig::Platform::isOnBatteryPower() } return false; } + + +uint64_t xmrig::Platform::idleTime() +{ + return std::numeric_limits::max(); +} diff --git a/src/base/kernel/Platform_win.cpp b/src/base/kernel/Platform_win.cpp index a487e17..75f8104 100644 --- a/src/base/kernel/Platform_win.cpp +++ b/src/base/kernel/Platform_win.cpp @@ -1,6 +1,6 @@ /* XMRig - * Copyright (c) 2018-2020 SChernykh - * Copyright (c) 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include #include #include +#include #include "base/kernel/Platform.h" @@ -161,3 +162,16 @@ bool xmrig::Platform::isOnBatteryPower() } return false; } + + +uint64_t xmrig::Platform::idleTime() +{ + LASTINPUTINFO info{}; + info.cbSize = sizeof(LASTINPUTINFO); + + if (!GetLastInputInfo(&info)) { + return std::numeric_limits::max(); + } + + return static_cast(GetTickCount() - info.dwTime); +} diff --git a/src/base/kernel/config/BaseConfig.cpp b/src/base/kernel/config/BaseConfig.cpp index 27aa2ce..1f2b09c 100644 --- a/src/base/kernel/config/BaseConfig.cpp +++ b/src/base/kernel/config/BaseConfig.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -61,7 +55,6 @@ const char *BaseConfig::kColors = "colors"; const char *BaseConfig::kDryRun = "dry-run"; const char *BaseConfig::kHttp = "http"; const char *BaseConfig::kLogFile = "log-file"; -const char *BaseConfig::kPauseOnBattery = "pause-on-battery"; const char *BaseConfig::kPrintTime = "print-time"; const char *BaseConfig::kSyslog = "syslog"; const char *BaseConfig::kTitle = "title"; @@ -91,7 +84,6 @@ bool xmrig::BaseConfig::read(const IJsonReader &reader, const char *fileName) m_dryRun = reader.getBool(kDryRun, m_dryRun); m_syslog = reader.getBool(kSyslog, m_syslog); m_watch = reader.getBool(kWatch, m_watch); - m_pauseOnBattery = reader.getBool(kPauseOnBattery, m_pauseOnBattery); m_logFile = reader.getString(kLogFile); m_userAgent = reader.getString(kUserAgent); m_printTime = std::min(reader.getUint(kPrintTime, m_printTime), 3600U); diff --git a/src/base/kernel/config/BaseConfig.h b/src/base/kernel/config/BaseConfig.h index f97a711..37d4641 100644 --- a/src/base/kernel/config/BaseConfig.h +++ b/src/base/kernel/config/BaseConfig.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,7 +49,6 @@ public: static const char *kDryRun; static const char *kHttp; static const char *kLogFile; - static const char *kPauseOnBattery; static const char *kPrintTime; static const char *kSyslog; static const char *kTitle; @@ -72,7 +65,6 @@ public: inline bool isAutoSave() const { return m_autoSave; } inline bool isBackground() const { return m_background; } inline bool isDryRun() const { return m_dryRun; } - inline bool isPauseOnBattery() const { return m_pauseOnBattery; } inline bool isSyslog() const { return m_syslog; } inline const char *logFile() const { return m_logFile.data(); } inline const char *userAgent() const { return m_userAgent.data(); } @@ -100,7 +92,6 @@ protected: bool m_autoSave = true; bool m_background = false; bool m_dryRun = false; - bool m_pauseOnBattery = false; bool m_syslog = false; bool m_upgrade = false; bool m_watch = true; @@ -112,7 +103,7 @@ protected: String m_logFile; String m_userAgent; Title m_title; - uint32_t m_printTime = 60; + uint32_t m_printTime = 60; # ifdef XMRIG_FEATURE_TLS TlsConfig m_tls; diff --git a/src/base/kernel/config/BaseTransform.cpp b/src/base/kernel/config/BaseTransform.cpp index 119fa67..55e082b 100644 --- a/src/base/kernel/config/BaseTransform.cpp +++ b/src/base/kernel/config/BaseTransform.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -260,8 +254,8 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch case IConfig::DryRunKey: /* --dry-run */ case IConfig::HttpEnabledKey: /* --http-enabled */ case IConfig::DaemonKey: /* --daemon */ + case IConfig::SubmitToOriginKey: /* --submit-to-origin */ case IConfig::VerboseKey: /* --verbose */ - case IConfig::PauseOnBatteryKey: /* --pause-on-battery */ return transformBoolean(doc, key, true); case IConfig::ColorKey: /* --no-color */ @@ -290,6 +284,8 @@ void xmrig::BaseTransform::transformBoolean(rapidjson::Document &doc, int key, b case IConfig::TlsKey: /* --tls */ return add(doc, Pools::kPools, Pool::kTls, enable); + case IConfig::SubmitToOriginKey: /* --submit-to-origin */ + return add(doc, Pools::kPools, Pool::kSubmitToOrigin, enable); # ifdef XMRIG_FEATURE_HTTP case IConfig::DaemonKey: /* --daemon */ return add(doc, Pools::kPools, Pool::kDaemon, enable); @@ -320,9 +316,6 @@ void xmrig::BaseTransform::transformBoolean(rapidjson::Document &doc, int key, b case IConfig::NoTitleKey: /* --no-title */ return set(doc, BaseConfig::kTitle, enable); - case IConfig::PauseOnBatteryKey: /* --pause-on-battery */ - return set(doc, BaseConfig::kPauseOnBattery, enable); - default: break; } diff --git a/src/base/kernel/config/BaseTransform.h b/src/base/kernel/config/BaseTransform.h index d6c0882..0ddcebc 100644 --- a/src/base/kernel/config/BaseTransform.h +++ b/src/base/kernel/config/BaseTransform.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/base/kernel/interfaces/IConfig.h b/src/base/kernel/interfaces/IConfig.h index ba022fa..7a7f657 100644 --- a/src/base/kernel/interfaces/IConfig.h +++ b/src/base/kernel/interfaces/IConfig.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2021 SChernykh - * Copyright 2016-2021 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -86,6 +80,8 @@ public: BenchTokenKey = 1048, DmiKey = 1049, HugePageSizeKey = 1050, + PauseOnActiveKey = 1051, + SubmitToOriginKey = 1052, // xmrig common CPUPriorityKey = 1021, diff --git a/src/base/net/stratum/Pool.cpp b/src/base/net/stratum/Pool.cpp index f80f1f6..e39df3b 100644 --- a/src/base/net/stratum/Pool.cpp +++ b/src/base/net/stratum/Pool.cpp @@ -1,13 +1,7 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2019 XMR-Stak , - * Copyright 2019 Howard Chu - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2019 Howard Chu + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -80,6 +74,7 @@ const char *Pool::kPass = "pass"; const char *Pool::kRigId = "rig-id"; const char *Pool::kSelfSelect = "self-select"; const char *Pool::kSOCKS5 = "socks5"; +const char *Pool::kSubmitToOrigin = "submit-to-origin"; const char *Pool::kTls = "tls"; const char *Pool::kUrl = "url"; const char *Pool::kUser = "user"; @@ -137,7 +132,8 @@ xmrig::Pool::Pool(const rapidjson::Value &object) : setKeepAlive(Json::getValue(object, kKeepalive)); if (m_daemon.isValid()) { - m_mode = MODE_SELF_SELECT; + m_mode = MODE_SELF_SELECT; + m_submitToOrigin = Json::getBool(object, kSubmitToOrigin, m_submitToOrigin); } else if (Json::getBool(object, kDaemon)) { m_mode = MODE_DAEMON; @@ -237,7 +233,7 @@ xmrig::IClient *xmrig::Pool::createClient(int id, IClientListener *listener) con client = new DaemonClient(id, listener); } else if (m_mode == MODE_SELF_SELECT) { - client = new SelfSelectClient(id, Platform::userAgent(), listener); + client = new SelfSelectClient(id, Platform::userAgent(), listener, m_submitToOrigin); } # endif # ifdef XMRIG_ALGO_KAWPOW @@ -300,7 +296,8 @@ rapidjson::Value xmrig::Pool::toJSON(rapidjson::Document &doc) const obj.AddMember(StringRef(kDaemonPollInterval), m_pollInterval, allocator); } else { - obj.AddMember(StringRef(kSelfSelect), m_daemon.url().toJSON(), allocator); + obj.AddMember(StringRef(kSelfSelect), m_daemon.url().toJSON(), allocator); + obj.AddMember(StringRef(kSubmitToOrigin), m_submitToOrigin, allocator); } return obj; @@ -319,7 +316,7 @@ std::string xmrig::Pool::printableName() const } if (m_mode == MODE_SELF_SELECT) { - out += std::string(" self-select ") + CSI "1;" + std::to_string(m_daemon.isTLS() ? 32 : 36) + "m" + m_daemon.url().data() + CLEAR; + out += std::string(" self-select ") + CSI "1;" + std::to_string(m_daemon.isTLS() ? 32 : 36) + "m" + m_daemon.url().data() + WHITE_BOLD_S + (m_submitToOrigin ? " submit-to-origin" : "") + CLEAR; } return out; diff --git a/src/base/net/stratum/Pool.h b/src/base/net/stratum/Pool.h index dc0fec8..3f9baec 100644 --- a/src/base/net/stratum/Pool.h +++ b/src/base/net/stratum/Pool.h @@ -1,13 +1,7 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2019 Howard Chu - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2019 Howard Chu + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -73,6 +67,7 @@ public: static const char *kRigId; static const char *kSelfSelect; static const char *kSOCKS5; + static const char *kSubmitToOrigin; static const char *kTls; static const char *kUrl; static const char *kUser; @@ -144,6 +139,7 @@ private: void setKeepAlive(const rapidjson::Value &value); Algorithm m_algorithm; + bool m_submitToOrigin = false; Coin m_coin; int m_keepAlive = 0; Mode m_mode = MODE_POOL; diff --git a/src/base/net/stratum/SelfSelectClient.cpp b/src/base/net/stratum/SelfSelectClient.cpp index fc4cea6..2dca057 100644 --- a/src/base/net/stratum/SelfSelectClient.cpp +++ b/src/base/net/stratum/SelfSelectClient.cpp @@ -1,13 +1,8 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2019 jtgrassie - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2019 jtgrassie + * Copyright (c) 2021 Hansie Odendaal + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,9 +26,12 @@ #include "base/io/json/Json.h" #include "base/io/json/JsonRequest.h" #include "base/io/log/Log.h" +#include "base/io/log/Tags.h" #include "base/net/http/Fetch.h" #include "base/net/http/HttpData.h" #include "base/net/stratum/Client.h" +#include "net/JobResult.h" +#include "base/tools/Cvt.h" namespace xmrig { @@ -54,7 +52,8 @@ static const char * const required_fields[] = { kBlocktemplateBlob, kBlockhashin } /* namespace xmrig */ -xmrig::SelfSelectClient::SelfSelectClient(int id, const char *agent, IClientListener *listener) : +xmrig::SelfSelectClient::SelfSelectClient(int id, const char *agent, IClientListener *listener, bool submitToOrigin) : + m_submitToOrigin(submitToOrigin), m_listener(listener) { m_httpListener = std::make_shared(this); @@ -68,6 +67,16 @@ xmrig::SelfSelectClient::~SelfSelectClient() } +int64_t xmrig::SelfSelectClient::submit(const JobResult &result) +{ + if (m_submitToOrigin) { + submitOriginDaemon(result); + } + + return m_client->submit(result); +} + + void xmrig::SelfSelectClient::tick(uint64_t now) { m_client->tick(now); @@ -201,6 +210,9 @@ void xmrig::SelfSelectClient::submitBlockTemplate(rapidjson::Value &result) Document doc(kObjectType); auto &allocator = doc.GetAllocator(); + m_blocktemplate = Json::getString(result,kBlocktemplateBlob); + m_blockDiff = Json::getUint64(result, kDifficulty); + Value params(kObjectType); params.AddMember(StringRef(kId), m_job.clientId().toJSON(), allocator); params.AddMember(StringRef(kJobId), m_job.id().toJSON(), allocator); @@ -236,6 +248,44 @@ void xmrig::SelfSelectClient::submitBlockTemplate(rapidjson::Value &result) } +void xmrig::SelfSelectClient::submitOriginDaemon(const JobResult& result) +{ + if (result.diff == 0 || m_blockDiff == 0) { + return; + } + + if (result.actualDiff() < m_blockDiff) { + m_originNotSubmitted++; + LOG_DEBUG("%s " RED_BOLD("not submitted to origin daemon, difficulty too low") " (%" PRId64 "/%" PRId64 ") " + BLACK_BOLD(" diff ") BLACK_BOLD("%" PRIu64) BLACK_BOLD(" vs. ") BLACK_BOLD("%" PRIu64), + Tags::origin(), m_originSubmitted, m_originNotSubmitted, m_blockDiff, result.actualDiff()); + return; + } + + char *data = m_blocktemplate.data(); + Cvt::toHex(data + 78, 8, reinterpret_cast(&result.nonce), 4); + + using namespace rapidjson; + Document doc(kObjectType); + + Value params(kArrayType); + params.PushBack(m_blocktemplate.toJSON(), doc.GetAllocator()); + + JsonRequest::create(doc, m_sequence, "submitblock", params); + m_results[m_sequence] = SubmitResult(m_sequence, result.diff, result.actualDiff(), 0, result.backend); + + FetchRequest req(HTTP_POST, pool().daemon().host(), pool().daemon().port(), "/json_rpc", doc, pool().daemon().isTLS(), isQuiet()); + fetch(tag(), std::move(req), m_httpListener); + + m_originSubmitted++; + LOG_INFO("%s " GREEN_BOLD("submitted to origin daemon") " (%" PRId64 "/%" PRId64 ") " + " diff " WHITE("%" PRIu64) " vs. " WHITE("%" PRIu64), + Tags::origin(), m_originSubmitted, m_originNotSubmitted, m_blockDiff, result.actualDiff(), result.diff); + + // Ensure that the latest block template is available after block submission + getBlockTemplate(); +} + void xmrig::SelfSelectClient::onHttpData(const HttpData &data) { if (data.status != HTTP_STATUS_OK) { diff --git a/src/base/net/stratum/SelfSelectClient.h b/src/base/net/stratum/SelfSelectClient.h index b02e521..c73198a 100644 --- a/src/base/net/stratum/SelfSelectClient.h +++ b/src/base/net/stratum/SelfSelectClient.h @@ -1,13 +1,8 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2019 jtgrassie - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2019 jtgrassie + * Copyright (c) 2021 Hansie Odendaal + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,9 +26,9 @@ #include "base/kernel/interfaces/IClientListener.h" #include "base/net/http/HttpListener.h" #include "base/net/stratum/Job.h" -#include "base/tools/Object.h" +#include #include @@ -45,7 +40,7 @@ class SelfSelectClient : public IClient, public IClientListener, public IHttpLis public: XMRIG_DISABLE_COPY_MOVE_DEFAULT(SelfSelectClient) - SelfSelectClient(int id, const char *agent, IClientListener *listener); + SelfSelectClient(int id, const char *agent, IClientListener *listener, bool submitToOrigin); ~SelfSelectClient() override; protected: @@ -65,7 +60,6 @@ protected: inline int64_t send(const rapidjson::Value &obj, Callback callback) override { return m_client->send(obj, callback); } inline int64_t send(const rapidjson::Value &obj) override { return m_client->send(obj); } inline int64_t sequence() const override { return m_client->sequence(); } - inline int64_t submit(const JobResult &result) override { return m_client->submit(result); } inline void connect() override { m_client->connect(); } inline void connect(const Pool &pool) override { m_client->connect(pool); } inline void deleteLater() override { m_client->deleteLater(); } @@ -77,6 +71,7 @@ protected: inline void setRetries(int retries) override { m_client->setRetries(retries); m_retries = retries; } inline void setRetryPause(uint64_t ms) override { m_client->setRetryPause(ms); m_retryPause = ms; } + int64_t submit(const JobResult &result) override; void tick(uint64_t now) override; // IClientListener @@ -105,19 +100,26 @@ private: void retry(); void setState(State state); void submitBlockTemplate(rapidjson::Value &result); + void submitOriginDaemon(const JobResult &result); - bool m_active = false; - bool m_quiet = false; + bool m_active = false; + bool m_quiet = false; + const bool m_submitToOrigin; IClient *m_client; IClientListener *m_listener; - int m_retries = 5; - int64_t m_failures = 0; - int64_t m_sequence = 1; + int m_retries = 5; + int64_t m_failures = 0; + int64_t m_sequence = 1; Job m_job; - State m_state = IdleState; + State m_state = IdleState; + std::map m_results; std::shared_ptr m_httpListener; - uint64_t m_retryPause = 5000; - uint64_t m_timestamp = 0; + String m_blocktemplate; + uint64_t m_blockDiff = 0; + uint64_t m_originNotSubmitted = 0; + uint64_t m_originSubmitted = 0; + uint64_t m_retryPause = 5000; + uint64_t m_timestamp = 0; }; diff --git a/src/config.json b/src/config.json index 8b5532d..e25c576 100644 --- a/src/config.json +++ b/src/config.json @@ -75,7 +75,8 @@ "tls-fingerprint": null, "daemon": false, "socks5": null, - "self-select": null + "self-select": null, + "submit-to-origin": false } ], "print-time": 60, @@ -96,5 +97,6 @@ "user-agent": null, "verbose": 0, "watch": true, - "pause-on-battery": false + "pause-on-battery": false, + "pause-on-active": false } diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 8d0263e..b9e4fba 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -352,6 +352,7 @@ public: Algorithms algorithms; bool active = false; bool battery_power = false; + bool user_active = false; bool enabled = true; bool reset = true; Controller *controller; @@ -600,7 +601,8 @@ void xmrig::Miner::onConfigChanged(Config *config, Config *previousConfig) void xmrig::Miner::onTimer(const Timer *) { double maxHashrate = 0.0; - const auto healthPrintTime = d_ptr->controller->config()->healthPrintTime(); + const auto config = d_ptr->controller->config(); + const auto healthPrintTime = config->healthPrintTime(); bool stopMiner = false; @@ -620,25 +622,29 @@ void xmrig::Miner::onTimer(const Timer *) d_ptr->maxHashrate[d_ptr->algorithm] = std::max(d_ptr->maxHashrate[d_ptr->algorithm], maxHashrate); - const auto printTime = d_ptr->controller->config()->printTime(); + const auto printTime = config->printTime(); if (printTime && d_ptr->ticks && (d_ptr->ticks % (printTime * 2)) == 0) { d_ptr->printHashrate(false); } d_ptr->ticks++; - if (d_ptr->controller->config()->isPauseOnBattery()) { - const bool battery_power = Platform::isOnBatteryPower(); - if (battery_power && d_ptr->enabled) { - LOG_INFO("%s " YELLOW_BOLD("on battery power"), Tags::miner()); - d_ptr->battery_power = true; - setEnabled(false); - } - else if (!battery_power && !d_ptr->enabled && d_ptr->battery_power) { - LOG_INFO("%s " GREEN_BOLD("on AC power"), Tags::miner()); - d_ptr->battery_power = false; - setEnabled(true); + auto autoPause = [this](bool &state, bool pause, const char *pauseMessage, const char *activeMessage) + { + if ((pause && !state) || (!pause && state)) { + LOG_INFO("%s %s", Tags::miner(), pause ? pauseMessage : activeMessage); + + state = pause; + setEnabled(!pause); } + }; + + if (config->isPauseOnBattery()) { + autoPause(d_ptr->battery_power, Platform::isOnBatteryPower(), YELLOW_BOLD("on battery power"), GREEN_BOLD("on AC power")); + } + + if (config->isPauseOnActive()) { + autoPause(d_ptr->user_active, Platform::isUserActive(config->idleTime()), YELLOW_BOLD("user active"), GREEN_BOLD("user inactive")); } if (stopMiner) { diff --git a/src/core/config/Config.cpp b/src/core/config/Config.cpp index f8b7bb8..2b27ae5 100644 --- a/src/core/config/Config.cpp +++ b/src/core/config/Config.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2021 SChernykh - * Copyright 2016-2021 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,6 +16,7 @@ * along with this program. If not, see . */ + #include #include #include @@ -54,6 +49,13 @@ namespace xmrig { +constexpr static uint32_t kIdleTime = 60U; + + +const char *Config::kPauseOnBattery = "pause-on-battery"; +const char *Config::kPauseOnActive = "pause-on-active"; + + #ifdef XMRIG_FEATURE_OPENCL const char *Config::kOcl = "opencl"; #endif @@ -74,7 +76,9 @@ const char *Config::kDMI = "dmi"; class ConfigPrivate { public: + bool pauseOnBattery = false; CpuConfig cpu; + uint32_t idleTime = 0; # ifdef XMRIG_ALGO_RANDOMX RxConfig rx; @@ -89,12 +93,22 @@ public: # endif # if defined(XMRIG_FEATURE_NVML) || defined (XMRIG_FEATURE_ADL) - uint32_t healthPrintTime = 60; + uint32_t healthPrintTime = 60U; # endif # ifdef XMRIG_FEATURE_DMI bool dmi = true; # endif + + void setIdleTime(const rapidjson::Value &value) + { + if (value.IsBool()) { + idleTime = value.GetBool() ? kIdleTime : 0U; + } + else if (value.IsUint()) { + idleTime = value.GetUint(); + } + } }; } @@ -112,12 +126,24 @@ xmrig::Config::~Config() } +bool xmrig::Config::isPauseOnBattery() const +{ + return d_ptr->pauseOnBattery; +} + + const xmrig::CpuConfig &xmrig::Config::cpu() const { return d_ptr->cpu; } +uint32_t xmrig::Config::idleTime() const +{ + return d_ptr->idleTime * 1000U; +} + + #ifdef XMRIG_FEATURE_OPENCL const xmrig::OclConfig &xmrig::Config::cl() const { @@ -186,6 +212,9 @@ bool xmrig::Config::read(const IJsonReader &reader, const char *fileName) return false; } + d_ptr->pauseOnBattery = reader.getBool(kPauseOnBattery, d_ptr->pauseOnBattery); + d_ptr->setIdleTime(reader.getValue(kPauseOnActive)); + d_ptr->cpu.read(reader.getValue(CpuConfig::kField)); # ifdef XMRIG_ALGO_RANDOMX @@ -270,4 +299,5 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const doc.AddMember(StringRef(kVerbose), Log::verbose(), allocator); doc.AddMember(StringRef(kWatch), m_watch, allocator); doc.AddMember(StringRef(kPauseOnBattery), isPauseOnBattery(), allocator); + doc.AddMember(StringRef(kPauseOnActive), (d_ptr->idleTime == 0U || d_ptr->idleTime == kIdleTime) ? Value(isPauseOnActive()) : Value(d_ptr->idleTime), allocator); } diff --git a/src/core/config/Config.h b/src/core/config/Config.h index d8433be..c2da852 100644 --- a/src/core/config/Config.h +++ b/src/core/config/Config.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2021 SChernykh - * Copyright 2016-2021 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,6 +44,9 @@ class Config : public BaseConfig public: XMRIG_DISABLE_COPY_MOVE(Config); + static const char *kPauseOnBattery; + static const char *kPauseOnActive; + # ifdef XMRIG_FEATURE_OPENCL static const char *kOcl; # endif @@ -69,7 +66,11 @@ public: Config(); ~Config() override; + inline bool isPauseOnActive() const { return idleTime() > 0; } + + bool isPauseOnBattery() const; const CpuConfig &cpu() const; + uint32_t idleTime() const; # ifdef XMRIG_FEATURE_OPENCL const OclConfig &cl() const; diff --git a/src/core/config/ConfigTransform.cpp b/src/core/config/ConfigTransform.cpp index 7140837..dce9d32 100644 --- a/src/core/config/ConfigTransform.cpp +++ b/src/core/config/ConfigTransform.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2021 SChernykh - * Copyright 2016-2021 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -150,6 +144,12 @@ void xmrig::ConfigTransform::transform(rapidjson::Document &doc, int key, const case IConfig::YieldKey: /* --cpu-no-yield */ return set(doc, CpuConfig::kField, CpuConfig::kYield, false); + case IConfig::PauseOnBatteryKey: /* --pause-on-battery */ + return set(doc, Config::kPauseOnBattery, true); + + case IConfig::PauseOnActiveKey: /* --pause-on-active */ + return set(doc, Config::kPauseOnActive, static_cast(strtol(arg, nullptr, 10))); + # ifdef XMRIG_ALGO_ARGON2 case IConfig::Argon2ImplKey: /* --argon2-impl */ return set(doc, CpuConfig::kField, CpuConfig::kArgon2Impl, arg); diff --git a/src/core/config/ConfigTransform.h b/src/core/config/ConfigTransform.h index 8fd2505..db25b0a 100644 --- a/src/core/config/ConfigTransform.h +++ b/src/core/config/ConfigTransform.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2021 SChernykh - * Copyright 2016-2021 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/config/Config_default.h b/src/core/config/Config_default.h index dd7a208..6c46fa9 100644 --- a/src/core/config/Config_default.h +++ b/src/core/config/Config_default.h @@ -105,7 +105,8 @@ R"===( "tls-fingerprint": null, "daemon": false, "socks5": null, - "self-select": null + "self-select": null, + "submit-to-origin": false } ], "print-time": 60, @@ -126,7 +127,8 @@ R"===( "user-agent": null, "verbose": 0, "watch": true, - "pause-on-battery": false + "pause-on-battery": false, + "pause-on-active": false } )==="; #endif diff --git a/src/core/config/Config_platform.h b/src/core/config/Config_platform.h index 28b1e2b..d542997 100644 --- a/src/core/config/Config_platform.h +++ b/src/core/config/Config_platform.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,6 +51,7 @@ static const option options[] = { { "daemon", 0, nullptr, IConfig::DaemonKey }, { "daemon-poll-interval", 1, nullptr, IConfig::DaemonPollKey }, { "self-select", 1, nullptr, IConfig::SelfSelectKey }, + { "submit-to-origin", 0, nullptr, IConfig::SubmitToOriginKey }, # endif { "av", 1, nullptr, IConfig::AVKey }, { "background", 0, nullptr, IConfig::BackgroundKey }, @@ -98,6 +93,7 @@ static const option options[] = { { "title", 1, nullptr, IConfig::TitleKey }, { "no-title", 0, nullptr, IConfig::NoTitleKey }, { "pause-on-battery", 0, nullptr, IConfig::PauseOnBatteryKey }, + { "pause-on-active", 1, nullptr, IConfig::PauseOnActiveKey }, # ifdef XMRIG_FEATURE_BENCHMARK { "stress", 0, nullptr, IConfig::StressKey }, { "bench", 1, nullptr, IConfig::BenchKey }, diff --git a/src/core/config/usage.h b/src/core/config/usage.h index a30ea13..fb88720 100644 --- a/src/core/config/usage.h +++ b/src/core/config/usage.h @@ -1,12 +1,11 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2010 Jeff Garzik + * Copyright (c) 2012-2014 pooler + * Copyright (c) 2014 Lucas Jones + * Copyright (c) 2014-2016 Wolf9466 + * Copyright (c) 2016 Jay D Dee + * Copyright (c) 2018-2021 SChernykh + * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,6 +63,7 @@ static inline const std::string &usage() u += " --daemon use daemon RPC instead of pool for solo mining\n"; u += " --daemon-poll-interval=N daemon poll interval in milliseconds (default: 1000)\n"; u += " --self-select=URL self-select block templates from URL\n"; + u += " --submit-to-origin also submit solution back to self-select URL\n"; # endif u += " -r, --retries=N number of times to retry before switch to backup server (default: 5)\n"; @@ -181,6 +181,7 @@ static inline const std::string &usage() u += " --no-title disable setting console window title\n"; # endif u += " --pause-on-battery pause mine on battery power\n"; + u += " --pause-on-active=N pause mine when the user is active (resume after N seconds of last activity)\n"; # ifdef XMRIG_FEATURE_BENCHMARK u += " --stress run continuous stress test to check system stability\n"; diff --git a/src/crypto/cn/CnHash.cpp b/src/crypto/cn/CnHash.cpp index 89caa1b..c975190 100644 --- a/src/crypto/cn/CnHash.cpp +++ b/src/crypto/cn/CnHash.cpp @@ -300,7 +300,7 @@ xmrig::cn_hash_fun xmrig::CnHash::fn(const Algorithm &algorithm, AlgoVariant av, # ifdef XMRIG_ALGO_CN_HEAVY // cn-heavy optimization for Zen3 CPUs - if ((av == AV_SINGLE) && (xmrig::Cpu::info()->arch() == xmrig::ICpuInfo::ARCH_ZEN3)) { + if ((av == AV_SINGLE) && (assembly != Assembly::NONE) && (Cpu::info()->arch() == ICpuInfo::ARCH_ZEN3)) { switch (algorithm.id()) { case xmrig::Algorithm::CN_HEAVY_0: return cryptonight_single_hash; diff --git a/src/hw/dmi/dmi.cmake b/src/hw/dmi/dmi.cmake index b6f9161..27c2f7d 100644 --- a/src/hw/dmi/dmi.cmake +++ b/src/hw/dmi/dmi.cmake @@ -27,8 +27,6 @@ if (WITH_DMI) list(APPEND SOURCES src/hw/dmi/DmiReader_unix.cpp) elseif(XMRIG_OS_MACOS) list(APPEND SOURCES src/hw/dmi/DmiReader_mac.cpp) - find_library(CORESERVICES_LIBRARY CoreServices) - list(APPEND EXTRA_LIBS ${CORESERVICES_LIBRARY}) endif() else() remove_definitions(/DXMRIG_FEATURE_DMI) diff --git a/src/version.h b/src/version.h index 43ec81c..1542641 100644 --- a/src/version.h +++ b/src/version.h @@ -28,15 +28,15 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig miner" -#define APP_VERSION "6.8.2" +#define APP_VERSION "6.9.0" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2021 xmrig.com" #define APP_KIND "miner" #define APP_VER_MAJOR 6 -#define APP_VER_MINOR 8 -#define APP_VER_PATCH 2 +#define APP_VER_MINOR 9 +#define APP_VER_PATCH 0 #ifdef _MSC_VER # if (_MSC_VER >= 1920)