Update CHANGELOG.md

This commit is contained in:
hinto-janaiyo 2022-11-18 21:47:14 -05:00
parent 1b96d3ba02
commit 14c7664177
No known key found for this signature in database
GPG key ID: B1C5A64B80691E45
4 changed files with 92 additions and 27 deletions

View file

@ -1,3 +1,38 @@
## v0.2.0
## Prototype Release
* Added `Simple` P2Pool tab:
- Monero address input with valid address check (base58 regex)
- [Community Monero node selector](https://github.com/hinto-janaiyo/gupax/tree/main/README.md#community-monero-nodes)
- Community node ping button (asynchronous `JSON-RPC` calls to all nodes)
- `<300ms = GREEN`
- `<1000ms = YELLOW`
- `<5000ms = RED`
- `>5000ms = BLACK`
- `Auto-select` - Pick the fastest node after ping automatically
- `Auto-ping` - Automatically ping nodes on Gupax startup
* Added `Advanced` P2Pool tab:
- Overriding command arguments to P2Pool
- Manual node database, select/add/delete a custom `Name/IP/RPC/ZMQ` (max 1000 nodes)
- P2Pool main/mini toggle
- Out/In Peers slider
- Log level slider
* Added command arguments:
- `-h | --help Print this help message`
- `-v | --version Print version and build info`
- `-l | --node-list Print the manual node list`
- `-s | --state Print Gupax state`
- `-n | --no-startup Disable all auto-startup settings for this instance`
- `-r | --reset Reset all Gupax state and the manual node list`
- `-f | --ferris Print an extremely cute crab`
* Added a native `File Explorer/Finder/GTK` file selector for picking P2Pool/XMRig binary path in `Gupax` tab
* Added detailed console log levels `RUST_LOG=(trace|debug|info|warn|error) ./gupax`
* [Added new PGP key](https://github.com/hinto-janaiyo/gupax/blob/main/pgp/hinto-janaiyo.asc)
* Created website (HTML/CSS only, no JavaScript): https://gupax.io
---
## v0.1.0 ## v0.1.0
## Prototype Release ## Prototype Release
* Added package updater (by default, via Tor using [`Arti`](https://blog.torproject.org/arti_100_released/)) * Added package updater (by default, via Tor using [`Arti`](https://blog.torproject.org/arti_100_released/))

View file

@ -4,6 +4,7 @@
## Contents ## Contents
* [What is Monero, P2Pool, XMRig, and Gupax?](##what-is-monero-p2pool-xmrig-and-gupax) * [What is Monero, P2Pool, XMRig, and Gupax?](##what-is-monero-p2pool-xmrig-and-gupax)
* [Community Monero Nodes](#community-monero-nodes)
* [Demo](#Demo) * [Demo](#Demo)
* [Implementation](#Implementation) * [Implementation](#Implementation)
* [Planned](#Planned) * [Planned](#Planned)
@ -51,6 +52,27 @@ Both Monero and P2Pool have built in miners but XMRig is quite faster than both
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**. 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 |
| Rino | node.community.rino.io | 18081 |
| Seth | node.sethforprivacy.com | 18089 |
| Singapore | node.supportxmr.com | 18081 |
| SupportXmr | node.supportxmr.ir | 18081 |
| SupportXmrIr | singapore.node.xmr.pm | 18089 |
| XmrVsBeast | p2pmd.xmrvsbeast.com | 18081 |
**Note: All have ZMQ port on 18083**
## Demo ## Demo
https://user-images.githubusercontent.com/101352116/194763334-d8e936c9-a71e-474e-ac65-3a339b96a9d2.mp4 https://user-images.githubusercontent.com/101352116/194763334-d8e936c9-a71e-474e-ac65-3a339b96a9d2.mp4

View file

@ -8,11 +8,11 @@
| File/Folder | Purpose | | File/Folder | Purpose |
|----------------|---------| |----------------|---------|
| `constants.rs` | General constants needed in Gupax | `constants.rs` | General constants needed in Gupax
| `disk.rs` | Code for writing to disk: `state.toml`, `nodes.toml`; This holds the structs for mutable [State] | `disk.rs` | Code for writing to disk: `state.toml`, `node.toml`; This holds the structs for mutable [State]
| `ferris.rs` | Cute crab `--ferris` | `ferris.rs` | Cute crab bytes
| `gupax.rs` | `Gupax` tab | `gupax.rs` | `Gupax` tab
| `main.rs` | `App/Tab/State` + misc functions | `main.rs` | `App/Tab/State` + misc data/functions
| `node.rs` | Community node feature | `node.rs` | Community node ping code for the `P2Pool` simple tab
| `p2pool.rs` | `P2Pool` tab | `p2pool.rs` | `P2Pool` tab
| `status.rs` | `Status` tab | `status.rs` | `Status` tab
| `update.rs` | Update code for the `Gupax` tab | `update.rs` | Update code for the `Gupax` tab
@ -22,29 +22,27 @@
This is how Gupax works internally when starting up, divided into 3 sections. This is how Gupax works internally when starting up, divided into 3 sections.
1. **INIT** 1. **INIT**
- Initialize custom console logging with `log`, `env_logger` || *warn!* - Initialize custom console logging with `log`, `env_logger`
- Initialize misc data (structs, text styles, thread count, images, etc) || *panic!* - Initialize misc data (structs, text styles, thread count, images, etc)
- Check for admin privilege (for XMRig) || *warn!* - Check for admin privilege (for XMRig)
- Attempt to read `gupax.toml` || *warn!*, *initialize config with default options* - Start initializing main `App` struct
- Parse command arguments
- Attempt to read disk files `state.toml`, `node.toml`
- If errors were found, pop-up window - If errors were found, pop-up window
2. **AUTO** 2. **AUTO**
- If `auto_update` == `true`, pop-up auto-updating window || *info!*, *skip auto-update* - If `auto_update` == `true`, spawn auto-updating thread
- Multi-threaded GitHub API check on Gupax -> P2Pool -> XMRig || *warn!*, *skip auto-update* - If `auto_select` == `true`, spawn community node ping thread
- Multi-threaded download if current version != new version || *warn!*, *skip auto-update*
- After download, atomically replace current binaries with new || *warn!*, *skip auto-update*
- Update version metadata || *warn!*, *skip auto-update*
- If `auto_select` == `true`, ping community nodes and select fastest one || *warn!*
3. **MAIN** 3. **MAIN**
- All data must be initialized at this point, either via `gupax.toml` or default options || *panic!* - All data should be initialized at this point, either via `state.toml` or default options
- Start `App` frame || *panic!* - Start `App` frame
- Write state to `gupax.toml` on user clicking `Save` (after checking input for correctness) || *warn!* - Do `App` stuff
- If `ask_before_quit` == `true`, check for running processes, unsaved state, and update connections before quitting - If `ask_before_quit` == `true`, ask before quitting
- Kill processes, kill connections, exit - Kill processes, kill connections, exit
## State ## State
Internal state is saved in the "OS data folder" as `gupax.toml`, using the [TOML](https://github.com/toml-lang/toml) format. If the version can't be parsed (not in the `vX.X.X` or `vX.X` format), the auto-updater will be skipped. [If not found, a default `gupax.toml` file will be created with `State::default`.](https://github.com/hinto-janaiyo/gupax/blob/main/src/state.rs) Gupax will `panic!` if `gupax.toml` has IO or parsing issues. Internal state is saved in the "OS data folder" as `state.toml`, using the [TOML](https://github.com/toml-lang/toml) format. If not found, a default `state.toml` file will be created. Given a slightly corrupted state file, Gupax will attempt to merge it with a new default one. This will most likely happen if the internal data structure of `state.toml` is changed in the future (e.g removing an outdated setting). Merging silently in the background is a good non-interactive way to handle this. If Gupax can't read/write to disk at all, or if there are any other big issues, it will show an un-recoverable error window.
| OS | Data Folder | Example | | OS | Data Folder | Example |
|----------|----------------------------------------- |-----------------------------------------------------------| |----------|----------------------------------------- |-----------------------------------------------------------|
@ -57,8 +55,7 @@ Every frame, the max available `[width, height]` are calculated, and those are u
``` ```
Main [App] outer frame (default: [1280.0, 720.0]) Main [App] outer frame (default: [1280.0, 720.0])
├─ Inner frame (1264.0, 704.0) ├─ TopPanel = height: 1/12th
├─ TopPanel = [width: (max-90.0)/5.0, height: max/10.0] ├─ BottomPanel = height: 1/20th
├─ BottomPanel = [width: max, height: max/18.0] ├─ CentralPanel = height: the rest
├─ CentralPanel = [width: (max/8.0), height: the rest
``` ```

View file

@ -213,6 +213,9 @@ pub fn format_enum(id: NodeEnum) -> String {
// default = GRAY // default = GRAY
#[tokio::main] #[tokio::main]
pub async fn ping(ping: Arc<Mutex<Ping>>, og: Arc<Mutex<State>>) -> Result<(), anyhow::Error> { pub async fn ping(ping: Arc<Mutex<Ping>>, og: Arc<Mutex<State>>) -> Result<(), anyhow::Error> {
// Timer
let now = Instant::now();
// Start ping // Start ping
ping.lock().unwrap().pinging = true; ping.lock().unwrap().pinging = true;
ping.lock().unwrap().prog = 0.0; ping.lock().unwrap().prog = 0.0;
@ -251,6 +254,7 @@ pub async fn ping(ping: Arc<Mutex<Ping>>, og: Arc<Mutex<State>>) -> Result<(), a
let info = format!("Fastest node: {}ms ... {} @ {}", node_vec[0].ms, node_vec[0].id, node_vec[0].ip); let info = format!("Fastest node: {}ms ... {} @ {}", node_vec[0].ms, node_vec[0].id, node_vec[0].ip);
info!("Ping | {}", info); info!("Ping | {}", info);
info!("Ping | Took [{}] seconds...", now.elapsed().as_secs_f32());
let mut ping = ping.lock().unwrap(); let mut ping = ping.lock().unwrap();
ping.fastest = node_vec[0].id; ping.fastest = node_vec[0].id;
ping.nodes = node_vec; ping.nodes = node_vec;
@ -267,9 +271,18 @@ async fn response(client: hyper::client::Client<hyper::client::HttpConnector>, r
let id = ip_to_enum(ip); let id = ip_to_enum(ip);
let now = Instant::now(); let now = Instant::now();
let ms; let ms;
let info;
match tokio::time::timeout(Duration::from_secs(5), client.request(request)).await { match tokio::time::timeout(Duration::from_secs(5), client.request(request)).await {
Ok(_) => ms = now.elapsed().as_millis(), Ok(_) => {
Err(e) => { warn!("Ping | {}: {} ... FAIL ... {}", id, ip, e); ms = 5000; }, ms = now.elapsed().as_millis();
info = format!("{}ms ... {}: {}", ms, id, ip);
info!("Ping | {}", info)
},
Err(e) => {
ms = 5000;
info = format!("{}ms ... {}: {}", ms, id, ip);
warn!("Ping | {}", info)
},
}; };
let color; let color;
if ms < 300 { if ms < 300 {
@ -281,8 +294,6 @@ async fn response(client: hyper::client::Client<hyper::client::HttpConnector>, r
} else { } else {
color = Color32::BLACK; color = Color32::BLACK;
} }
let info = format!("{}ms ... {}: {}", ms, id, ip);
info!("Ping | {}", info);
let mut ping = ping.lock().unwrap(); let mut ping = ping.lock().unwrap();
ping.msg = info; ping.msg = info;
ping.prog += percent; ping.prog += percent;