mirror of
https://github.com/xmrig/xmrig-proxy.git
synced 2026-02-09 02:59:17 +08:00
Sync changes with XMRig.
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
# v6.21.1
|
||||
- The dependencies of all prebuilt releases have been updated. Support for old Ubuntu releases has been dropped.
|
||||
- [#3391](https://github.com/xmrig/xmrig/pull/3391) Added support for townforge (monero fork using randomx).
|
||||
- [#3420](https://github.com/xmrig/xmrig/pull/3420) Fixed segfault in HTTP API rebind.
|
||||
- [#3436](https://github.com/xmrig/xmrig/pull/3436) Fixed, the file log writer was not thread-safe.
|
||||
|
||||
# v6.21.0
|
||||
- [#548](https://github.com/xmrig/xmrig-proxy/pull/548) Sync changes with XMRig.
|
||||
- [#553](https://github.com/xmrig/xmrig-proxy/pull/553) Fixes for **Zephyr** solo mining.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* XMRig
|
||||
* Copyright (c) 2018-2023 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2023 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
*
|
||||
* 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
|
||||
@@ -25,6 +25,8 @@
|
||||
#include "base/crypto/keccak.h"
|
||||
#include "base/io/Env.h"
|
||||
#include "base/io/json/Json.h"
|
||||
#include "base/io/log/Log.h"
|
||||
#include "base/io/log/Tags.h"
|
||||
#include "base/kernel/Base.h"
|
||||
#include "base/tools/Chrono.h"
|
||||
#include "base/tools/Cvt.h"
|
||||
@@ -91,7 +93,11 @@ xmrig::Api::Api(Base *base) :
|
||||
xmrig::Api::~Api()
|
||||
{
|
||||
# ifdef XMRIG_FEATURE_HTTP
|
||||
if (m_httpd) {
|
||||
m_httpd->stop();
|
||||
delete m_httpd;
|
||||
m_httpd = nullptr; // Ensure the pointer is set to nullptr after deletion
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
@@ -109,8 +115,15 @@ void xmrig::Api::start()
|
||||
genWorkerId(m_base->config()->apiWorkerId());
|
||||
|
||||
# ifdef XMRIG_FEATURE_HTTP
|
||||
if (!m_httpd) {
|
||||
m_httpd = new Httpd(m_base);
|
||||
m_httpd->start();
|
||||
if (!m_httpd->start()) {
|
||||
LOG_ERR("%s " RED_BOLD("HTTP API server failed to start."), Tags::network());
|
||||
|
||||
delete m_httpd; // Properly handle failure to start
|
||||
m_httpd = nullptr;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
@@ -118,7 +131,9 @@ void xmrig::Api::start()
|
||||
void xmrig::Api::stop()
|
||||
{
|
||||
# ifdef XMRIG_FEATURE_HTTP
|
||||
if (m_httpd) {
|
||||
m_httpd->stop();
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
@@ -126,14 +141,16 @@ void xmrig::Api::stop()
|
||||
void xmrig::Api::tick()
|
||||
{
|
||||
# ifdef XMRIG_FEATURE_HTTP
|
||||
if (m_httpd->isBound() || !m_base->config()->http().isEnabled()) {
|
||||
if (!m_httpd || !m_base->config()->http().isEnabled() || m_httpd->isBound()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (++m_ticks % 10 == 0) {
|
||||
m_ticks = 0;
|
||||
if (m_httpd) {
|
||||
m_httpd->start();
|
||||
}
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* XMRig
|
||||
* Copyright (c) 2018-2023 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2023 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
*
|
||||
* 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
|
||||
|
||||
@@ -54,6 +54,7 @@ static const CoinInfo coinInfo[] = {
|
||||
{ Algorithm::KAWPOW_RVN, "RVN", "Ravencoin", 0, 0, BLUE_BG_BOLD( WHITE_BOLD_S " raven ") },
|
||||
{ Algorithm::RX_WOW, "WOW", "Wownero", 300, 100000000000, MAGENTA_BG_BOLD(WHITE_BOLD_S " wownero ") },
|
||||
{ Algorithm::RX_0, "ZEPH", "Zephyr", 120, 1000000000000, BLUE_BG_BOLD( WHITE_BOLD_S " zephyr ") },
|
||||
{ Algorithm::RX_0, "Townforge","Townforge", 30, 100000000, MAGENTA_BG_BOLD(WHITE_BOLD_S " townforge ") },
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ public:
|
||||
RAVEN,
|
||||
WOWNERO,
|
||||
ZEPHYR,
|
||||
TOWNFORGE,
|
||||
MAX
|
||||
};
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
|
||||
#include <cassert>
|
||||
#include <uv.h>
|
||||
|
||||
|
||||
namespace xmrig {
|
||||
@@ -40,6 +39,32 @@ static void fsWriteCallback(uv_fs_t *req)
|
||||
} // namespace xmrig
|
||||
|
||||
|
||||
xmrig::FileLogWriter::FileLogWriter()
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
xmrig::FileLogWriter::FileLogWriter(const char* fileName)
|
||||
{
|
||||
init();
|
||||
open(fileName);
|
||||
}
|
||||
|
||||
xmrig::FileLogWriter::~FileLogWriter()
|
||||
{
|
||||
uv_close(reinterpret_cast<uv_handle_t*>(&m_flushAsync), nullptr);
|
||||
|
||||
uv_mutex_destroy(&m_buffersLock);
|
||||
}
|
||||
|
||||
void xmrig::FileLogWriter::init()
|
||||
{
|
||||
uv_mutex_init(&m_buffersLock);
|
||||
|
||||
uv_async_init(uv_default_loop(), &m_flushAsync, on_flush);
|
||||
m_flushAsync.data = this;
|
||||
}
|
||||
|
||||
bool xmrig::FileLogWriter::open(const char *fileName)
|
||||
{
|
||||
assert(fileName != nullptr);
|
||||
@@ -77,11 +102,12 @@ bool xmrig::FileLogWriter::write(const char *data, size_t size)
|
||||
uv_buf_t buf = uv_buf_init(new char[size], size);
|
||||
memcpy(buf.base, data, size);
|
||||
|
||||
auto req = new uv_fs_t;
|
||||
req->data = buf.base;
|
||||
uv_mutex_lock(&m_buffersLock);
|
||||
|
||||
uv_fs_write(uv_default_loop(), req, m_file, &buf, 1, m_pos, fsWriteCallback);
|
||||
m_pos += size;
|
||||
m_buffers.emplace_back(buf);
|
||||
uv_async_send(&m_flushAsync);
|
||||
|
||||
uv_mutex_unlock(&m_buffersLock);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -89,18 +115,38 @@ bool xmrig::FileLogWriter::write(const char *data, size_t size)
|
||||
|
||||
bool xmrig::FileLogWriter::writeLine(const char *data, size_t size)
|
||||
{
|
||||
const uv_buf_t buf[2] = {
|
||||
uv_buf_init(new char[size], size),
|
||||
uv_buf_init(const_cast<char *>(m_endl), sizeof(m_endl) - 1)
|
||||
};
|
||||
if (!isOpen()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(buf[0].base, data, size);
|
||||
constexpr size_t N = sizeof(m_endl) - 1;
|
||||
|
||||
auto req = new uv_fs_t;
|
||||
req->data = buf[0].base;
|
||||
uv_buf_t buf = uv_buf_init(new char[size + N], size + N);
|
||||
memcpy(buf.base, data, size);
|
||||
memcpy(buf.base + size, m_endl, N);
|
||||
|
||||
uv_fs_write(uv_default_loop(), req, m_file, buf, 2, m_pos, fsWriteCallback);
|
||||
m_pos += (buf[0].len + buf[1].len);
|
||||
uv_mutex_lock(&m_buffersLock);
|
||||
|
||||
m_buffers.emplace_back(buf);
|
||||
uv_async_send(&m_flushAsync);
|
||||
|
||||
uv_mutex_unlock(&m_buffersLock);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void xmrig::FileLogWriter::flush()
|
||||
{
|
||||
uv_mutex_lock(&m_buffersLock);
|
||||
|
||||
for (uv_buf_t buf : m_buffers) {
|
||||
uv_fs_t* req = new uv_fs_t;
|
||||
req->data = buf.base;
|
||||
|
||||
uv_fs_write(uv_default_loop(), req, m_file, &buf, 1, m_pos, fsWriteCallback);
|
||||
m_pos += buf.len;
|
||||
}
|
||||
m_buffers.clear();
|
||||
|
||||
uv_mutex_unlock(&m_buffersLock);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
#include <uv.h>
|
||||
|
||||
|
||||
namespace xmrig {
|
||||
@@ -30,8 +32,10 @@ namespace xmrig {
|
||||
class FileLogWriter
|
||||
{
|
||||
public:
|
||||
FileLogWriter() = default;
|
||||
FileLogWriter(const char *fileName) { open(fileName); }
|
||||
FileLogWriter();
|
||||
FileLogWriter(const char* fileName);
|
||||
|
||||
~FileLogWriter();
|
||||
|
||||
inline bool isOpen() const { return m_file >= 0; }
|
||||
inline int64_t pos() const { return m_pos; }
|
||||
@@ -49,6 +53,16 @@ private:
|
||||
|
||||
int m_file = -1;
|
||||
int64_t m_pos = 0;
|
||||
|
||||
uv_mutex_t m_buffersLock;
|
||||
std::vector<uv_buf_t> m_buffers;
|
||||
|
||||
uv_async_t m_flushAsync;
|
||||
|
||||
void init();
|
||||
|
||||
static void on_flush(uv_async_t* async) { reinterpret_cast<FileLogWriter*>(async->data)->flush(); }
|
||||
void flush();
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* XMRig
|
||||
* Copyright (c) 2014-2019 heapwolf <https://github.com/heapwolf>
|
||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
*
|
||||
* 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
|
||||
@@ -17,7 +17,6 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include "base/net/http/HttpApiResponse.h"
|
||||
#include "3rdparty/rapidjson/prettywriter.h"
|
||||
#include "3rdparty/rapidjson/stringbuffer.h"
|
||||
@@ -65,7 +64,7 @@ void xmrig::HttpApiResponse::end()
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_doc.MemberCount()) {
|
||||
if (m_doc.IsObject() && m_doc.ObjectEmpty()) {
|
||||
return HttpResponse::end();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* XMRig
|
||||
* Copyright (c) 2019 jtgrassie <https://github.com/jtgrassie>
|
||||
* Copyright (c) 2018-2023 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2023 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
*
|
||||
* 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
|
||||
@@ -609,7 +609,7 @@ bool xmrig::Client::parseLogin(const rapidjson::Value &result, int *code)
|
||||
|
||||
parseExtensions(result);
|
||||
|
||||
const bool rc = parseJob(result["job"], code);
|
||||
const bool rc = parseJob(Json::getObject(result, "job"), code);
|
||||
m_jobs = 0;
|
||||
|
||||
return rc;
|
||||
@@ -844,7 +844,7 @@ void xmrig::Client::parseResponse(int64_t id, const rapidjson::Value &result, co
|
||||
m_listener->onLoginSuccess(this);
|
||||
|
||||
if (m_job.isValid()) {
|
||||
m_listener->onJobReceived(this, m_job, result["job"]);
|
||||
m_listener->onJobReceived(this, m_job, Json::getObject(result, "job"));
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* XMRig
|
||||
* Copyright (c) 2019 Howard Chu <https://github.com/hyc>
|
||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
*
|
||||
* 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
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
static const char *kCoin;
|
||||
static const char *kDaemon;
|
||||
static const char *kDaemonPollInterval;
|
||||
static const char* kDaemonJobTimeout;
|
||||
static const char *kDaemonJobTimeout;
|
||||
static const char *kEnabled;
|
||||
static const char *kFingerprint;
|
||||
static const char *kKeepalive;
|
||||
@@ -70,11 +70,11 @@ public:
|
||||
static const char *kSOCKS5;
|
||||
static const char *kSubmitToOrigin;
|
||||
static const char *kTls;
|
||||
static const char* kSni;
|
||||
static const char *kSni;
|
||||
static const char *kUrl;
|
||||
static const char *kUser;
|
||||
static const char* kSpendSecretKey;
|
||||
static const char* kDaemonZMQPort;
|
||||
static const char *kSpendSecretKey;
|
||||
static const char *kDaemonZMQPort;
|
||||
static const char *kNicehashHost;
|
||||
|
||||
constexpr static int kKeepAliveTimeout = 60;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* XMRig
|
||||
* Copyright (c) 2012-2013 The Cryptonote developers
|
||||
* Copyright (c) 2014-2021 The Monero Project
|
||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright (c) 2018-2023 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2023 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
*
|
||||
* 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
|
||||
@@ -207,7 +207,11 @@ bool xmrig::BlockTemplate::parse(bool hashes)
|
||||
setOffset(MINER_TX_PREFIX_OFFSET, ar.index());
|
||||
|
||||
ar(m_txVersion);
|
||||
|
||||
if (m_coin != Coin::TOWNFORGE) {
|
||||
ar(m_unlockTime);
|
||||
}
|
||||
|
||||
ar(m_numInputs);
|
||||
|
||||
// must be 1 input
|
||||
@@ -280,6 +284,10 @@ bool xmrig::BlockTemplate::parse(bool hashes)
|
||||
ar(m_viewTag);
|
||||
}
|
||||
|
||||
if (m_coin == Coin::TOWNFORGE) {
|
||||
ar(m_unlockTime);
|
||||
}
|
||||
|
||||
ar(m_extraSize);
|
||||
|
||||
setOffset(TX_EXTRA_OFFSET, ar.index());
|
||||
@@ -335,6 +343,11 @@ bool xmrig::BlockTemplate::parse(bool hashes)
|
||||
uint8_t vin_rct_type = 0;
|
||||
ar(vin_rct_type);
|
||||
|
||||
// no way I'm parsing a full game update here
|
||||
if (m_coin == Coin::TOWNFORGE && m_height % 720 == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// must be RCTTypeNull (0)
|
||||
if (vin_rct_type != 0) {
|
||||
return false;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* XMRig
|
||||
* Copyright (c) 2012-2013 The Cryptonote developers
|
||||
* Copyright (c) 2014-2021 The Monero Project
|
||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright (c) 2018-2023 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2016-2023 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
*
|
||||
* 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
|
||||
@@ -33,6 +33,25 @@
|
||||
|
||||
bool xmrig::WalletAddress::decode(const char *address, size_t size)
|
||||
{
|
||||
uint64_t tf_tag = 0;
|
||||
if (size >= 4 && !strncmp(address, "TF", 2)) {
|
||||
tf_tag = 0x424200;
|
||||
switch (address[2])
|
||||
{
|
||||
case '1': tf_tag |= 0; break;
|
||||
case '2': tf_tag |= 1; break;
|
||||
default: tf_tag = 0; return false;
|
||||
}
|
||||
switch (address[3]) {
|
||||
case 'M': tf_tag |= 0; break;
|
||||
case 'T': tf_tag |= 0x10; break;
|
||||
case 'S': tf_tag |= 0x20; break;
|
||||
default: tf_tag = 0; return false;
|
||||
}
|
||||
address += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
static constexpr std::array<int, 9> block_sizes{ 0, 2, 3, 5, 6, 7, 9, 10, 11 };
|
||||
static constexpr char alphabet[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||
constexpr size_t alphabet_size = sizeof(alphabet) - 1;
|
||||
@@ -114,6 +133,10 @@ bool xmrig::WalletAddress::decode(const char *address, size_t size)
|
||||
if (memcmp(m_checksum, md, sizeof(m_checksum)) == 0) {
|
||||
m_data = { address, size };
|
||||
|
||||
if (tf_tag) {
|
||||
m_tag = tf_tag;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -228,6 +251,16 @@ const xmrig::WalletAddress::TagInfo &xmrig::WalletAddress::tagInfo(uint64_t tag)
|
||||
{ 0x54, { Coin::GRAFT, TESTNET, PUBLIC, 28881, 28882 } },
|
||||
{ 0x55, { Coin::GRAFT, TESTNET, INTEGRATED, 28881, 28882 } },
|
||||
{ 0x70, { Coin::GRAFT, TESTNET, SUBADDRESS, 28881, 28882 } },
|
||||
|
||||
{ 0x424200, { Coin::TOWNFORGE, MAINNET, PUBLIC, 18881, 18882 } },
|
||||
{ 0x424201, { Coin::TOWNFORGE, MAINNET, SUBADDRESS, 18881, 18882 } },
|
||||
|
||||
{ 0x424210, { Coin::TOWNFORGE, TESTNET, PUBLIC, 28881, 28882 } },
|
||||
{ 0x424211, { Coin::TOWNFORGE, TESTNET, SUBADDRESS, 28881, 28882 } },
|
||||
|
||||
{ 0x424220, { Coin::TOWNFORGE, STAGENET, PUBLIC, 38881, 38882 } },
|
||||
{ 0x424221, { Coin::TOWNFORGE, STAGENET, SUBADDRESS, 38881, 38882 } },
|
||||
|
||||
};
|
||||
|
||||
const auto it = tags.find(tag);
|
||||
|
||||
Reference in New Issue
Block a user