GUI Uniting P2Pool And XMRig
Find a file
hinto-janaiyo d30fb5563b
helper: optimize [String] output buffers
Instead of cloning the entirety of the process's output, this
commit adds a sort of hierarchy of string buffers:

We need:
1. The full output for stat parsing (max 1 month/56m bytes)
2. GUI output to be lightweight (max 1-2 hours/1m bytes)
3. GUI output buffered so it's on a refresh tick of 1 second

------------------------------------------------------------------
So this is the new buffer hierarchy, from low to high level:
[Process] <-> [Watchdog] <-> [Helper] <-> [GUI]
------------------------------------------------------------------
Process: Writes to 2 buffers, a FULL (stores everything) and
a BUF which is exactly the same, except this gets [mem:take]n later
Stuff gets written immediately if there is output detected.

Watchdog: [std::mem::take]'s [Process]'s BUF for itself.
Both FULL and BUF output overflows are checked in this loop.
This is done on a slightly faster tick (900ms).

Helper: Appends watchdog's BUF to GUI's already existing [String]
on a 1-second tick.

GUI: Does nothing, only locks & reads.
------------------------------------------------------------------

This means Helper's buffer will be swapped out every second, meaning
it'll almost always be empty. Process's FULL output will be the
heaviest, but is only used for backend parsing. GUI will be in the
middle. This system of buffers makes it so not every thread has to
hold it's own FULL copy of the output, in particular the GUI thread
was starting to lag a little due to loading so much output.
2022-12-08 12:29:38 -05:00
external icons: custom icon per OS, build.rs, cargo-bundle 2022-10-31 17:03:59 -04:00
images main: add [zeroize] and implement sudo input/test screen for xmrig 2022-12-07 18:02:08 -05:00
pgp add ed25519 PGP key 2022-11-14 22:11:22 -05:00
src helper: optimize [String] output buffers 2022-12-08 12:29:38 -05:00
utils add utils/skel 2022-11-23 22:32:17 -05:00
.gitignore root 2022-10-09 14:08:16 -04:00
.gitmodules icons: custom icon per OS, build.rs, cargo-bundle 2022-10-31 17:03:59 -04:00
build.rs icons: custom icon per OS, build.rs, cargo-bundle 2022-10-31 17:03:59 -04:00
Cargo.lock main: add [zeroize] and implement sudo input/test screen for xmrig 2022-12-07 18:02:08 -05:00
Cargo.toml main: add [zeroize] and implement sudo input/test screen for xmrig 2022-12-07 18:02:08 -05:00
CHANGELOG.md [Simple/Advanced] for [Gupax/XMRig] tabs 2022-11-23 16:50:15 -05:00
LICENSE root 2022-10-09 14:08:16 -04:00
README.md helper: add functions for p2pool/xmrig UI -> command arguments 2022-12-03 13:41:14 -05:00

WORK IN PROGRESS - ETA: December 25th, 2022

banner.png Gupax (guh-picks) is a cross-platform GUI for mining Monero on P2Pool, using XMRig.

Contents

What is Monero, P2Pool, XMRig, and Gupax?

Monero is a secure, private, and untraceable cryptocurrency.

The Monero GUI software lets you run a Monero node (among other things). A Monero node connects you to other peers and lets you download Monero's blockchain. But you already knew all of this, right?

More info here.


P2Pool is software that lets you create/join decentralized peer-to-peer Monero mining pools.

P2Pool as a concept was first developed for Bitcoin but was never fully realized due to many limitations. These limitations were fixed when SChernykh rewrote P2Pool from scratch for Monero. P2Pool combines the best of solo mining and traditional pool mining:

  • It's decentralized: There's no central server that can be shutdown or pool admin that controls your hashrate
  • It's permissionless: It's peer-to-peer so there's no one to decide who can and cannot mine on the pool
  • It's trustless: Funds are never in custody, all pool blocks pay out to miners directly and immediately
  • 0% transaction fee, 0 payout fee, immediate ~0.0003 XMR minimum payout

More info here.


XMRig is an optimized miner which lets you mine Monero at higher speeds.

Both Monero and P2Pool have built in miners but XMRig is quite faster than both of them. Due to issues like anti-virus flagging, it is not feasible to integrate XMRig directly into Monero or P2Pool, however, XMRig is still freely available for anyone to download. The issue is: you have to manually set it up yourself.

More info here.


Gupax is a GUI that helps with configuring, updating, and managing P2Pool & XMRig (both originally CLI-only).

Recap:

  1. XMRig mines to P2Pool which fetchs blocks from a Monero node
  2. Monero GUI runs the Monero node
  3. Gupax runs P2Pool/XMRig

stack.png

With Monero GUI managing the Monero node on one side and Gupax managing P2Pool/XMRig on the other, it is (hopefully) very easy for anyone to start mining Monero at max hashrate in a decentralized, permissionless, and trustless manner.

Community Monero Nodes

Name IP/Domain RPC Port
C3pool node.c3pool.com 18081
Cake xmr-node.cakewallet.com 18081
CakeEu xmr-node-eu.cakewallet.com 18081
CakeUk xmr-node-uk.cakewallet.com 18081
CakeUs xmr-node-usa-east.cakewallet.com 18081
Feather1 selsta1.featherwallet.net 18081
Feather2 selsta2.featherwallet.net 18081
MajesticBankIs node.majesticbank.is 18089
MajesticBankSu node.majesticbank.su 18089
Monerujo nodex.monerujo.io 18081
Plowsof1 node.monerodevs.org 18089
Plowsof2 node2.monerodevs.org 18089
Rino node.community.rino.io 18081
Seth node.sethforprivacy.com 18089
Singapore singapore.node.xmr 18081
SupportXmr node.supportxmr.com 18081
SupportXmrIr node.supportxmr.ir 18089
XmrVsBeast p2pmd.xmrvsbeast.com 18081

Note: Plowsof1 & Plowsof2 have ZMQ port on 18084, the rest are 18083

Demo

https://user-images.githubusercontent.com/101352116/194763334-d8e936c9-a71e-474e-ac65-3a339b96a9d2.mp4

Click me to load images!

about.png status.png gupax.png p2pool.png xmrig.png

Implementation

  • OS: Gupax will be tested for Windows, macOS, and Linux. Maybe the BSDs
  • Docs: All Gupax usage will have documentation on GitHub; General P2Pool/XMRig info will also be included
  • Packaging: Gupax will be packaged in a bundled zip/tar that includes P2Pool/XMRig, and as a standalone binary that expects you to bring your own P2Pool/XMRig. Both will be the same binary, only difference being the first will include all necessary components. Maybe an installer as well
  • Efficiency: The context for Gupax is a mining machine, it would be too ironic if it impacted the hashrate performance, and so, Gupax uses the very lightweight Rust egui library. By default egui is an "immediate mode" GUI, meaning frames are rendered 60x/sec. This is turned off in Gupax so frames are only rendered upon user interaction. This allows for a fast and lightweight GUI. For context, it uses around 5x less CPU when switching around tabs compared to Monero GUI

Planned

  • Community Node: An option to use a trusted community Monero node instead of your own. At a small privacy cost, this allows users to immediately start mining on P2Pool without downloading the entire chain
  • Update: Built-in update/upgrader for Gupax/P2Pool/XMRig and an (opt-in) auto-updater that runs at startup
  • Config: All the basic configurations you would expect with P2Pool/XMRig (main, mini, peers, thread count, etc)
  • Status: Status tab displaying mining statistics using P2Pool & XMRig's APIs

Goals

Gupax is:

  • A simple GUI solution to P2Pool mining with max hashrate
  • External mining software so Monero GUI isn't plagued with anti-virus issues
  • Fast/lightweight because the context for this software is a mining computer

Gupax is not:

  • A Monero node/wallet

Build

Windows/Linux:

cargo build --release

On macOS, if you want the binary to have an icon in Finder, you must install cargo-bundle and compile with:

cargo bundle --release

This bundles Gupax into a Gupax.app, the way it comes in the pre-built tars for macOS.

The build.rs file in the repo root sets the icon in File Explorer for Windows. The taskbar icon & App frame icon (for all OS's) get set at runtime using pre-compiled bytes in src/constants.rs from images.

The --release profile is set to prefer code performance & small binary sizes over compilation speed (see Cargo.toml). Gupax itself (with all dependencies already built) takes around 1m30s to build (vs 10s on a normal --release) with a Ryzen 5950x.