Compare commits

...

209 Commits

Author SHA1 Message Date
Codex Bot 1f72c33b02 Merge remote-tracking branch 'origin/master' into develop 2026-05-07 01:17:25 +02:00
Codex Bot 3759b59e6b Stabilize nodejs facade submissions 2026-05-07 01:15:47 +02:00
SChernykh 3e88a90d61 Build scripts: use gcc 16 2026-05-04 21:37:34 +02:00
SChernykh 3eae86d1eb Fixed port numbers in I2P docs 2026-05-03 13:06:47 +02:00
SChernykh e04a5500aa Made README.md up to date 2026-05-03 11:32:11 +02:00
Codex Bot ba570f2de9 Scale hashing blob batch by worker count 2026-05-03 10:25:00 +02:00
Codex Bot f29afbb2a5 Add nodejs pool extra nonce support 2026-05-02 23:33:23 +02:00
SChernykh 3b30129a4e P2PServer - added more checks 2026-05-02 17:43:06 +02:00
SChernykh 5733c4eae9 GCC 16 (mingw) fix 2026-05-02 13:30:06 +02:00
Codex Bot a4134bde72 Add nodejs pool facade for Monero P2Pool 2026-05-02 09:53:27 +02:00
SChernykh 77ad87cee5 Check for max value in split_reward 2026-05-02 07:45:15 +02:00
SChernykh 1963f7e9e6 p2pool v4.15 2026-05-01 10:32:03 +02:00
SChernykh 35ca86d4b9 Fixed cmake options for curl 2026-04-30 17:17:03 +02:00
SChernykh d3b1a77256 Updated curl to 8.20.0, disabled threaded resolver 2026-04-30 15:05:02 +02:00
SChernykh fb8fdfe4fb Disable empty id in pruned blocks 2026-04-29 23:00:49 +02:00
SChernykh 03aa77c327 More PoolBlock fixes 2026-04-29 21:35:46 +02:00
SChernykh 836b29faec Reverted curl to 8.19.0
macos sync test was failing
2026-04-29 16:30:20 +02:00
SChernykh a0b84113f4 Added i2p seeds, updated build scripts 2026-04-29 14:56:43 +02:00
SChernykh 0742f42ecd Updated curl cmake command 2026-04-29 11:24:31 +02:00
SChernykh 374abee844 Updated curl to 8.20.0 2026-04-29 09:23:18 +02:00
SChernykh 732b17b32f Fixed CI 2026-04-28 20:52:38 +02:00
SChernykh 620b2e12f7 Added command line parameters to disable logging 2026-04-28 18:48:10 +02:00
SChernykh 01da461069 Compiler test scripts: added clang-22 2026-04-28 15:36:50 +02:00
SChernykh cff5d60d89 Fixed cppcheck errors 2026-04-28 06:27:41 +02:00
SChernykh cb7b812469 Logger performance improvements and fixes 2026-04-27 23:20:34 +02:00
SChernykh 90f11d576a BlockTemplate fixes 2026-04-26 23:25:51 +02:00
SChernykh fc4b979c80 Fixed CI 2026-04-26 21:06:55 +02:00
SChernykh 4ebae25093 json_rpc_request fixes 2026-04-26 19:35:13 +02:00
SChernykh cd1ea288df indexed_hash fixes and small speedup 2026-04-26 10:00:31 +02:00
SChernykh bfa60422c4 Fixed tests 2026-04-26 06:52:42 +02:00
SChernykh 87cc4aa76a SideChain: tweaked block pruning 2026-04-25 22:52:05 +02:00
SChernykh fb88033504 SideChain fixes 2026-04-25 22:32:02 +02:00
SChernykh ab0d58102f Fixed CI errors 2026-04-25 19:53:17 +02:00
SChernykh 7150cf875f StratumServer: limit max client score, other small fixes 2026-04-25 17:49:58 +02:00
SChernykh 064b5b24dc Updated RandomX 2026-04-25 15:52:33 +02:00
SChernykh f906e9ecd0 Fixed CI 2026-04-25 12:12:58 +02:00
SChernykh 7ca1beeb73 P2PServer fixes (peer list loading, peer id and other smaller fixes)
C/C++ CI / build-alpine-static (map[arch:aarch64 branch:latest-stable flags:-ffunction-sections -mfix-cortex-a53-835769 -mfix-cortex-a53-843419]) (push) Failing after 31s
C/C++ CI / build-alpine-static (map[arch:riscv64 branch:latest-stable flags:-ffunction-sections]) (push) Failing after 7s
C/C++ CI / build-alpine-static (map[arch:x86_64 branch:latest-stable flags:-ffunction-sections]) (push) Failing after 9s
C/C++ CI / build-ubuntu (map[c:gcc-10 cpp:g++-10 flags: os:ubuntu-22.04]) (push) Failing after 10m28s
C/C++ CI / build-ubuntu (map[c:gcc-11 cpp:g++-11 flags: os:ubuntu-22.04]) (push) Failing after 9m1s
Sync test / sync-test-ubuntu-msan (push) Has been cancelled
Sync test / sync-test-ubuntu-ubsan (push) Has been cancelled
Sync test / sync-test-ubuntu-asan (push) Has been cancelled
Sync test / sync-test-ubuntu-tysan (push) Has been cancelled
Sync test / sync-test-macos (map[flags: os:macos-26-intel]) (push) Has been cancelled
Sync test / sync-test-macos (map[flags:-target arm64-apple-macos-11 os:macos-26]) (push) Has been cancelled
Sync test / sync-test-windows-debug-asan (push) Has been cancelled
Sync test / sync-test-windows-leaks (push) Has been cancelled
clang-tidy / clang-tidy (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
Code coverage / coverage (push) Has been cancelled
cppcheck / cppcheck-ubuntu (push) Has been cancelled
cppcheck / cppcheck-windows (push) Has been cancelled
C/C++ CI / build-ubuntu (map[c:gcc-13 cpp:g++-13 flags: os:ubuntu-24.04]) (push) Has been cancelled
C/C++ CI / build-ubuntu (map[c:gcc-14 cpp:g++-14 flags: os:ubuntu-24.04]) (push) Has been cancelled
C/C++ CI / build-ubuntu (map[c:gcc-9 cpp:g++-9 flags: os:ubuntu-22.04]) (push) Has been cancelled
C/C++ CI / build-ubuntu-static-libs (map[flags:-fuse-linker-plugin -ffunction-sections]) (push) Has been cancelled
C/C++ CI / build-ubuntu-aarch64 (map[flags:-fuse-linker-plugin -ffunction-sections -mfix-cortex-a53-835769 -mfix-cortex-a53-843419 os:ubuntu-22.04-arm]) (push) Has been cancelled
C/C++ CI / build-windows-msys2 (map[c:gcc cxx:g++ flags:-ffunction-sections -Wno-error=maybe-uninitialized -Wno-error=attributes -Wno-attributes]) (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[grpc:OFF os:2022 rx:OFF tls:OFF upnp:OFF vs:Visual Studio 17 2022 vspath:C:\Program Files\Microsoft Visual Studio\2022\Enterprise]) (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[grpc:OFF os:2022 rx:OFF tls:ON upnp:OFF vs:Visual Studio 17 2022 vspath:C:\Program Files\Microsoft Visual Studio\2022\Enterprise]) (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[grpc:OFF os:2022 rx:OFF tls:ON upnp:ON vs:Visual Studio 17 2022 vspath:C:\Program Files\Microsoft Visual Studio\2022\Enterprise]) (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[grpc:OFF os:2022 rx:ON tls:ON upnp:ON vs:Visual Studio 17 2022 vspath:C:\Program Files\Microsoft Visual Studio\2022\Enterprise]) (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[grpc:ON os:2022 rx:ON tls:ON upnp:ON vs:Visual Studio 17 2022 vspath:C:\Program Files\Microsoft Visual Studio\2022\Enterprise]) (push) Has been cancelled
C/C++ CI / build-macos (push) Has been cancelled
C/C++ CI / build-macos-aarch64 (push) Has been cancelled
C/C++ CI / build-freebsd (map[architecture:x86-64 host:ubuntu-latest name:freebsd version:13.3]) (push) Has been cancelled
C/C++ CI / build-openbsd (map[architecture:x86-64 host:ubuntu-latest name:openbsd version:7.4]) (push) Has been cancelled
C/C++ CI / build-ubuntu (map[c:gcc-12 cpp:g++-12 flags: os:ubuntu-22.04]) (push) Has been cancelled
C/C++ CI / build-windows-msys2 (map[c:clang cxx:clang++ flags:-fuse-ld=lld -Wno-unused-command-line-argument -Wno-nan-infinity-disabled -Wno-attributes]) (push) Has been cancelled
Microsoft C++ Code Analysis / Analyze (push) Has been cancelled
source-snapshot / source-snapshot (push) Has been cancelled
Sync test / sync-test-ubuntu-tsan (push) Has been cancelled
2026-04-25 10:25:48 +02:00
SChernykh 85750521bb TCPServer fixes 2026-04-24 23:30:37 +02:00
SChernykh 0255b801e5 CI: use macos-26 2026-04-24 19:37:01 +02:00
SChernykh fa53bdea55 More fixes and refactoring 2026-04-24 18:05:13 +02:00
SChernykh e1acf7b786 Fixed cppcheck error 2026-04-24 16:03:17 +02:00
SChernykh 54e0d3f3eb Refactored merge mining code 2026-04-24 11:01:59 +02:00
SChernykh eaee503d05 Updated dependencies 2026-04-20 11:21:59 +02:00
SChernykh 35f97b999c Build scripts: updated versions 2026-04-12 07:41:53 +02:00
SChernykh 44ea8e4557 CI: updated actions versions 2026-04-10 20:21:48 +02:00
SChernykh f3d97dc3d6 Fixed CI errors 2026-04-10 18:19:28 +02:00
SChernykh a32b4a6336 CI: use clang-22 2026-04-10 16:39:58 +02:00
jpk68 34f21e6236 Fixed for i2p 2026-03-13 16:12:03 +01:00
SChernykh 964e4a6163 Updated i2p seed node 2026-03-13 10:58:58 +01:00
SChernykh f1b2c3c51f Updated curl to 8.19.0 2026-03-11 10:03:02 +01:00
SChernykh b05361653e More cleanup and tests 2026-03-08 20:30:07 +01:00
SChernykh 0019d9ff0d Cleanup, compilation error fixes 2026-03-08 17:18:49 +01:00
jpk68 941e5114d8 Add I2P support 2026-03-08 16:50:02 +01:00
SChernykh bec1a56f7d Fix compile error 2026-03-07 20:43:44 +01:00
SChernykh dcfc64da42 Updated libuv to v1.52.1 2026-03-07 18:44:03 +01:00
SChernykh 9fee040ce0 p2pool v4.14 2026-03-01 10:01:44 +01:00
SChernykh ca39b36337 Stratum: reset workers counters on synchronized 2026-02-28 17:22:53 +01:00
SChernykh 7923f84233 Stratum: added sidechain/stratum shares display to workers command 2026-02-25 19:39:34 +01:00
SChernykh 7667f9d21e Refactored parameter parsing 2026-02-25 11:01:44 +01:00
SChernykh 0741ad1c07 Build scripts: updated versions 2026-02-25 07:32:34 +01:00
SChernykh f05ce6f697 Fixed SOCKS5 proxy detection
`std::stoul` can throw an exception, so don't use it.
2026-02-24 20:35:44 +01:00
KingJulien1st 23d3a24bc4 Add HAProxy PROXY Protocol v2 support (#399) 2026-02-22 22:17:32 +01:00
SChernykh 2cc5ba2fb9 CI: fixed msan build 2026-02-20 16:22:51 +01:00
SChernykh 93e3c07a18 Updated BoringSSL to v0.20260211.0 2026-02-17 12:08:35 +01:00
SChernykh 7f0be0bcf5 Updated RandomX 2026-02-15 14:06:31 +01:00
jpk68 f8310f27b8 Specify SOCKS5 proxy type in Tor docs 2026-02-12 22:13:56 +01:00
SChernykh 160ebd4289 Updated libuv to v1.52.0 2026-02-11 13:09:53 +01:00
SChernykh 6d6c12c1e8 Added SOCKS5 proxy type command line parameter
- Auto-detect by default, based on the port number
- Don't run TOR-specific code if it's not the TOR proxy
2026-02-10 21:32:01 +01:00
SChernykh cf1c88b907 Support IPv6 for ZMQ 2026-02-07 13:41:44 +01:00
SChernykh 6449a78863 Don't init gRPC if it's not used 2026-02-06 18:57:24 +01:00
SChernykh d966088470 Updated BoringSSL patch 2026-02-05 18:42:51 +01:00
SChernykh 5faec12678 Updated BoringSSL to v0.20260204.0 2026-02-05 17:18:36 +01:00
SChernykh 1bcddc8329 Build scripts: updated versions 2026-02-04 20:03:15 +01:00
SChernykh 0905b23123 Updated cppzmq and libzmq 2026-02-04 00:42:59 +01:00
SChernykh 64914566c0 Updated RandomX and miniupnp 2026-02-03 18:11:18 +01:00
SChernykh ab80f55698 Fixed whitespace 2026-01-26 22:47:17 +01:00
User0 31860f2e65 docs(root): fix note block about nano and mini in readme.md (#393) 2026-01-26 21:06:15 +01:00
jpk68 6e7311a83c Update docs (#392) 2026-01-24 13:36:20 +01:00
SChernykh e0a6daa5c7 Updated curl to 8.18.0 2026-01-07 16:37:27 +01:00
SChernykh 313fb64b41 Updated copyright 2026-01-01 22:13:05 +01:00
SChernykh 096e2e086b Updated DarkFi information 2025-12-29 19:15:41 +01:00
SChernykh d8ddaf80c8 p2pool v4.13 2025-12-18 12:26:42 +01:00
SChernykh 2dc091f3d4 Build scripts: updated versions 2025-12-17 20:42:15 +01:00
SChernykh 55cd2c9ae1 CI: disabled type sanitizer sync test 2025-12-16 22:17:29 +01:00
SChernykh 53cecac65b CI: added type sanitizer sync test 2025-12-16 19:19:54 +01:00
QuocViet Le d9de512b92 docs(nano): update documentation for nano (#386) 2025-12-11 20:17:49 +01:00
SChernykh 1bdf562967 Build scripts: updated versions 2025-12-07 20:12:17 +01:00
SChernykh d0daa6ec41 Sync test: ignore ZMQ reader errors 2025-12-05 21:20:25 +01:00
hinto-janai 1eb93fcd6b Edits to Gupax references (#387) 2025-12-02 10:22:34 +01:00
SChernykh 1cb4940960 Sync test: ignore node connection errors 2025-11-28 15:59:04 +01:00
SChernykh d5025965b4 Sync test: ignore random ZMQ disconnects 2025-11-25 18:17:33 +01:00
SChernykh 6aba1edaf8 Updated BoringSSL to v0.20251124.0 2025-11-25 11:36:15 +01:00
SChernykh 1166f31d07 RandomX: send seed when calling RPC (it's faster on monerod side) 2025-11-24 13:18:13 +01:00
SChernykh 3d2c9910f8 P2P: give peers from --addpeers a 2-second headstart before connecting to other peers 2025-11-22 13:24:03 +01:00
SChernykh 3584910baa Fixed reading the last line of config 2025-11-22 09:23:03 +01:00
SChernykh 8230040b76 Fixed CI errors 2025-11-21 21:20:20 +01:00
SChernykh de28201edc Added support for params config file 2025-11-21 20:13:13 +01:00
SChernykh d9cea1cfc3 Refactored command line parsing (part 2) 2025-11-21 18:15:57 +01:00
SChernykh 321d698be5 Refactored command line parsing 2025-11-21 13:22:39 +01:00
SChernykh 44a668cb15 Fixed onion connection counter 2025-11-20 17:19:40 +01:00
SChernykh 8151a5a537 Added --log-file command line parameter 2025-11-20 16:42:34 +01:00
SChernykh b81a582154 Build scripts: updated versions 2025-11-20 14:30:02 +01:00
SChernykh ee931ee178 Build scripts: updated clang to 21.1.6 2025-11-18 16:10:18 +01:00
SChernykh dbf0e58ee5 Build scripts: updated versions 2025-11-17 16:50:49 +01:00
SChernykh 86e9e90744 Updated BoringSSL patch 2025-11-12 13:21:08 +01:00
SChernykh dec45532f8 Updated BoringSSL to v0.20251110.0 2025-11-12 10:00:31 +01:00
SChernykh 0a15afb3eb p2pool v4.12 2025-11-05 17:00:49 +01:00
SChernykh fe85c2ff8e Updated curl to 8.17.0 2025-11-05 08:51:06 +01:00
SChernykh 5187049b7f Build scripts: updated versions 2025-11-04 19:09:35 +01:00
SChernykh ba20d3c9db Updated TOR documentation 2025-10-31 11:59:42 +01:00
SChernykh 9830987cf2 Build scripts: updated versions 2025-10-31 08:21:35 +01:00
SChernykh c23d0e5024 Updated BoringSSL to v0.20251002.0 2025-10-30 11:50:28 +01:00
SChernykh d8662ad41e Updated build scripts 2025-10-25 17:32:12 +02:00
SChernykh e7e623fbdd More wallet tests 2025-10-23 19:03:24 +02:00
SChernykh 27fbf2fc93 Added more wallet tests 2025-10-23 16:40:23 +02:00
SChernykh 25a5361777 Wallet: added checks for FCMP++ compatibility 2025-10-23 12:58:45 +02:00
SChernykh 0451aebb8a Fixed typos 2025-10-21 22:00:49 +02:00
SChernykh 5dc0cc4861 Added --no-clearnet-p2p parameter, added TOR documentation 2025-10-21 18:38:51 +02:00
SChernykh 8d9bac3b0c Build scripts: updated versions 2025-10-21 15:46:35 +02:00
SChernykh c41018bc5a Util: fixed undefined behavior 2025-10-21 10:36:51 +02:00
SChernykh 55d1ee982c Ignore case when converting onion addresses 2025-10-20 23:30:24 +02:00
SChernykh 801c131172 P2P: save/load onion peers, added onion seed nodes 2025-10-20 19:07:29 +02:00
SChernykh f6353a6939 Fixed compile errors 2025-10-20 15:06:56 +02:00
SChernykh cb9fc89b22 Added --onion-address command line option to support incoming TOR connections 2025-10-20 13:06:45 +02:00
SChernykh d88790237d Fixed cppcheck errors 2025-10-19 17:05:01 +02:00
SChernykh d8e4a00a32 Refactored keccak constants initialization 2025-10-19 14:39:55 +02:00
SChernykh baf13781e4 P2P: use a separate peer id for .onion peers 2025-10-18 20:04:16 +02:00
SChernykh 4e690feefb Support .onion domains for addpeers command and --addpeers option (requires SOCKS5 proxy) 2025-10-18 15:47:06 +02:00
SChernykh e2f0ec7c69 De-duplicate tx hashes and pub keys to save memory (off by default) (#382)
P2Pool-main: 8.2 MB saved
P2Pool-mini: 66 MB saved
P2Pool-nano: 25.2 MB saved

The feature is available only when building from source and is intended for use on low-memory systems (for example, a VPS server with < 1 GB RAM).

It only makes sense to use with `--no-cache --no-randomx` in the command line because cache and RandomX hasher take much more memory.
2025-10-18 12:21:16 +02:00
SChernykh 52bcbda381 CI: updated sync test's error check 2025-10-13 06:46:19 +02:00
SChernykh c490fe556a CI: increased code coverage 2025-10-12 17:07:46 +02:00
SChernykh 977cd73bbd CI: updated sync test's error check 2025-10-11 16:31:21 +02:00
SChernykh f14e6fd08e Build scripts: updated versions 2025-10-08 14:19:55 +02:00
SChernykh 8826a6c02c Added more div128 tests 2025-10-07 14:59:05 +02:00
SChernykh 2ce8ce65e2 Util: added secure_zero_memory with type safety checks 2025-10-07 12:53:20 +02:00
SChernykh dd9d5b03aa Merkle tree: added one more helper function 2025-10-05 19:04:31 +02:00
SChernykh 741aaf95a8 Removed old fork code 2025-10-04 12:41:35 +02:00
SChernykh 6fc51d5a31 CI: fail sync test if there are errors in log 2025-10-03 13:34:02 +02:00
SChernykh e3d680ec46 CI: updated macos versions 2025-10-02 20:50:31 +02:00
tetyys 571a5d5410 Check for DNS result type before access (#378)
* Check for DNS result type before access

* Remove try...catch
2025-10-02 19:09:33 +02:00
SChernykh 6b4c39f4c9 SideChain: added some extra checks, removed const_cast 2025-10-01 18:05:26 +02:00
SChernykh e1da9ff4d3 Fixed cppcheck errors 2025-10-01 16:39:42 +02:00
SChernykh 5d7dfa2466 Reproducible builds: improved compression a bit 2025-10-01 15:02:45 +02:00
SChernykh fbe30b8fb1 Fixed log level of some TCP messages 2025-09-30 08:09:32 +02:00
SChernykh e53f712eb5 Reproducible builds: reduced linux_x64 binary size 2025-09-29 23:45:27 +02:00
SChernykh fd6549849c Updated BoringSSL 2025-09-29 22:01:30 +02:00
WeebDataHoarder 22cabb5ac9 Speed up crypto derivations with vartime ops
Implemented ge_scalarmult_vartime (a*B) and ge_scalarmult_base_vartime (a*G). These come from libsodium code as the rest of crypto-ops.c
2025-09-29 13:19:51 +02:00
SChernykh 7cb6a0dcc3 Added missing cleanup code 2025-09-29 12:34:04 +02:00
SChernykh e9c14ef3d0 Don't send the same Monero block broadcast to peers who sent it already 2025-09-28 15:33:58 +02:00
SChernykh eb09178a1c Updated documentation about subaddresses 2025-09-27 13:32:22 +02:00
SChernykh 458c7a3389 p2pool v4.11 2025-09-27 12:29:52 +02:00
SChernykh 82f3982175 Fixed wallet payout log message for subaddresses 2025-09-27 10:13:37 +02:00
SChernykh 0184a3139c CI: revised clang-tidy list of checks 2025-09-25 18:46:22 +02:00
SChernykh 26357f44ec Merge pull request #376 from SChernykh/subaddress
Subaddress support
2025-09-25 14:51:43 +02:00
SChernykh 85931f564a Build scripts: updated versions, moved downloads to the beginning 2025-09-25 13:23:27 +02:00
SChernykh 1e8e6c1010 Added filter for late txpool notifications 2025-09-24 09:56:53 +02:00
SChernykh f6a1612ff1 Fixed build errors 2025-09-23 17:17:17 +02:00
SChernykh 1eb22109b5 Fixed m_mergeMiningExtra format description 2025-09-23 12:53:50 +02:00
SChernykh c0b99ac6fd Refactored BlockTemplate::update() - removed the use of pointers as parameters 2025-09-23 11:45:56 +02:00
SChernykh cff1210761 Store public viewkey of the subaddress 2025-09-22 19:00:43 +02:00
SChernykh bae7c65126 Reproducible builds: fixed clang version display 2025-09-22 17:59:30 +02:00
SChernykh 04d195d5cd Added support for mining to a subaddress 2025-09-22 14:24:11 +02:00
SChernykh a4e1f00993 Wallet: added subaddress detection 2025-09-21 15:50:08 +02:00
SChernykh 0d101f0ae6 Fixed MSVC build 2025-09-20 19:23:25 +02:00
SChernykh 2ae77e5b71 MSVC: disable permissive mode 2025-09-20 18:02:57 +02:00
SChernykh 2e32d14d5f CI: tweaked msan parameters 2025-09-19 21:19:43 +02:00
SChernykh 415ad70e2f CI: lighter parameters for msan 2025-09-19 10:09:40 +02:00
SChernykh 6380e204dd CI: increased time limit for msan 2025-09-19 08:05:03 +02:00
SChernykh 12993dfe19 Fixed FreeBSD build 2025-09-18 22:29:30 +02:00
SChernykh a64753ecd0 clang-21, one more time 2025-09-18 21:37:49 +02:00
SChernykh e9c7367b92 Reverted back to clang-20 for msan 2025-09-17 19:16:49 +02:00
SChernykh 9f7dc5b768 CI: use clang-21 for msan 2025-09-17 14:12:10 +02:00
SChernykh f141bef4b5 Fixed TLS init order 2025-09-17 09:14:32 +02:00
SChernykh 32e940577e Tari: track gRPC channel state and display it in logs/status/API 2025-09-15 15:53:35 +02:00
SChernykh 012d148080 Added git mailmap 2025-09-15 14:31:15 +02:00
SChernykh d64b4ea2dc Updated recommended Monero version 2025-09-15 14:21:26 +02:00
sech1 a9e0b834d9 Reproducible builds: shortened clang version display 2025-09-15 09:39:30 +02:00
sech1 3a8ec27d93 Reproducible builds: fix git commit display 2025-09-14 17:58:48 +02:00
sech1 b69de65e78 Display git commit in version 2025-09-14 16:27:26 +02:00
sech1 44f8d941a7 Refactored background job shutdown logic 2025-09-14 14:41:31 +02:00
sech1 8c1c5fd8e1 P2PServer: check PoW in background to not stall the P2P loop 2025-09-14 12:55:23 +02:00
sech1 bbfdeeaff5 Log submit_block RPC performance 2025-09-14 00:25:15 +02:00
sech1 f12e43bb79 CI: use the latest cppcheck again 2025-09-13 12:02:16 +02:00
sech1 a1544022cf Build scripts: updated tool versions 2025-09-13 10:04:43 +02:00
sech1 e2008578da Updated Tari gRPC proto files 2025-09-10 21:11:43 +02:00
sech1 9b5a43580e Updated curl to 8.16.0 2025-09-10 14:19:06 +02:00
sech1 20c3973504 p2pool v4.10.1 2025-09-10 09:14:12 +02:00
sech1 16b74edc51 ZMQ: more JSON parsing fixes 2025-09-10 01:17:34 +02:00
sech1 d611056b1c ZMQ: fixed JSON parsing check 2025-09-10 00:05:57 +02:00
sech1 ecc33cfebb Stratum: fixed stats counters when full share validation is on 2025-09-09 17:24:04 +02:00
sech1 0ae2af0bb8 Added more sanity checks 2025-09-09 16:46:57 +02:00
sech1 bdd34c5f56 Fixed on_share_found background job counter 2025-09-09 11:23:25 +02:00
sech1 bbee372a01 p2pool v4.10 2025-09-09 09:22:45 +02:00
sech1 5c907d39aa Fix: submit broadcasted Monero blocks one at a time 2025-09-07 19:39:10 +02:00
SChernykh 6d3fbc5467 Merge pull request #374 from gavinbarnard/gavinbarnard/fullvalidationoption
full share validation via cmdline option
2025-09-07 14:22:57 +02:00
gavinbarnard 068b286a88 full share validation via cmdline option 2025-09-06 18:05:11 +00:00
sech1 b7c4613d40 Fixed handling of multiple blocks from ZMQ 2025-09-06 14:25:57 +02:00
sech1 971f804a6e Fix: get missing blocks in a thread-safe way 2025-09-05 15:35:39 +02:00
sech1 830c78a032 Fixed build errors, refined Monero block broadcast logic 2025-09-03 14:35:53 +02:00
sech1 50634e5e79 Feature: broadcast all new Monero blocks through p2pool network for faster propagation 2025-09-03 10:07:39 +02:00
sech1 c5fba9992e Docker: use fresh checkpoints for faster Monero sync 2025-08-31 17:24:25 +02:00
sech1 29df28d3c8 Docker: fixed missing dependencies 2025-08-30 00:36:36 +02:00
sech1 4a2b75c7fb Build scripts: updated tool versions 2025-08-30 00:34:34 +02:00
sech1 2a9cf67c3a Docker: fixed Monero build again 2025-08-29 20:49:19 +02:00
sech1 3bcde151ee Updated docs: --enforce-dns-checkpointing is now recommended 2025-08-29 18:47:29 +02:00
sech1 b22088f330 CI: update to clang-21 2025-08-26 22:34:11 +02:00
sech1 bfb0b5383a Docker: fixed XMRig build 2025-08-24 19:43:54 +02:00
sech1 560f62a427 Docker: fixed Monero build 2025-08-24 11:28:03 +02:00
sech1 271a30998f Fixed cppcheck command line 2025-08-24 10:13:09 +02:00
156 changed files with 10535 additions and 3049 deletions
+48 -151
View File
@@ -36,7 +36,7 @@ jobs:
apk add git cmake gcc g++ make linux-headers xz
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -44,9 +44,8 @@ jobs:
shell: alpine.sh {0}
run: |
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto=auto ${{ matrix.config.flags }}" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto=auto ${{ matrix.config.flags }}" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
shell: alpine.sh {0}
@@ -54,7 +53,7 @@ jobs:
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j$(nproc)
- name: Build libzmq
@@ -105,7 +104,7 @@ jobs:
file p2pool
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-alpine-static-${{ matrix.config.arch }}
path: build/p2pool
@@ -133,7 +132,7 @@ jobs:
sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev xz-utils ${{ matrix.config.c }} ${{ matrix.config.cpp }}
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -166,7 +165,7 @@ jobs:
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-${{ matrix.config.os }}-${{ matrix.config.c }}
path: build/p2pool
@@ -190,23 +189,22 @@ jobs:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 --slave /usr/bin/g++ g++ /usr/bin/g++-12 --slave /usr/bin/gcov gcov /usr/bin/gcov-12
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto=auto ${{ matrix.config.flags }}" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto=auto ${{ matrix.config.flags }}" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j$(nproc)
- name: Build libzmq
@@ -246,7 +244,7 @@ jobs:
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-ubuntu-static-libs
path: build/p2pool
@@ -268,23 +266,22 @@ jobs:
sudo apt install -y git build-essential cmake xz-utils
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto=auto ${{ matrix.config.flags }}" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto=auto ${{ matrix.config.flags }}" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j$(nproc)
- name: Build libzmq
@@ -324,107 +321,11 @@ jobs:
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-${{ matrix.config.os }}-aarch64
path: build/p2pool
build-ubuntu-riscv64:
timeout-minutes: 60
runs-on: ${{ matrix.config.os }}
strategy:
matrix:
config:
- {os: ubuntu-22.04, flags: "-fuse-linker-plugin -ffunction-sections"}
steps:
- name: Setup Alpine Linux
uses: jirutka/setup-alpine@v1
with:
arch: riscv64
branch: latest-stable
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y git build-essential cmake gcc-riscv64-linux-gnu g++-riscv64-linux-gnu binutils-riscv64-linux-gnu xz-utils
sudo cp /usr/riscv64-linux-gnu/lib/* /home/runner/rootfs/alpine-latest-riscv64/lib
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../../cmake/riscv64_toolchain.cmake -DCMAKE_C_FLAGS="-Os -flto=auto ${{ matrix.config.flags }}" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../../cmake/riscv64_toolchain.cmake -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
make -j$(nproc)
- name: Build libzmq
run: |
cd external/src/libzmq
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../../cmake/riscv64_toolchain.cmake -DCMAKE_C_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DCMAKE_CXX_FLAGS='-Os -flto=auto ${{ matrix.config.flags }}' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc)
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../cmake/riscv64_toolchain.cmake -DCMAKE_C_FLAGS='${{ matrix.config.flags }} -Wl,-s -Wl,--gc-sections' -DCMAKE_CXX_FLAGS='${{ matrix.config.flags }} -Wl,-s -Wl,--gc-sections' -DSTATIC_LIBS=ON -DARCH_ID=riscv64 -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool
- name: Run self-test
shell: alpine.sh {0}
run: build/p2pool --test
- name: Build RandomX tests
run: |
cd build
make -j$(nproc) randomx-tests
- name: Run RandomX tests
shell: alpine.sh {0}
run: build/external/src/RandomX/randomx-tests
- name: Build tests
run: |
cd tests
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../cmake/riscv64_toolchain.cmake -DCMAKE_C_FLAGS='${{ matrix.config.flags }} -Wl,-s -Wl,--gc-sections' -DCMAKE_CXX_FLAGS='${{ matrix.config.flags }} -Wl,-s -Wl,--gc-sections' -DSTATIC_LIBS=ON -DARCH_ID=riscv64 -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool_tests
- name: Prepare test data
run: |
cd tests/build
unxz *.xz
- name: Run tests
shell: alpine.sh {0}
run: |
cd tests/build
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
with:
name: p2pool-${{ matrix.config.os }}-riscv64
path: build/p2pool
build-windows-msys2:
timeout-minutes: 60
@@ -433,8 +334,8 @@ jobs:
strategy:
matrix:
config:
- {c: "gcc", cxx: "g++", flags: "-ffunction-sections -Wno-error=maybe-uninitialized -Wno-error=attributes -Wno-unknown-attributes"}
- {c: "clang", cxx: "clang++", flags: "-fuse-ld=lld -Wno-unused-command-line-argument -Wno-nan-infinity-disabled -Wno-unknown-attributes"}
- {c: "gcc", cxx: "g++", flags: "-ffunction-sections -Wno-error=maybe-uninitialized -Wno-error=attributes -Wno-attributes"}
- {c: "clang", cxx: "clang++", flags: "-fuse-ld=lld -Wno-unused-command-line-argument -Wno-nan-infinity-disabled -Wno-attributes"}
defaults:
run:
@@ -442,7 +343,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -459,16 +360,15 @@ jobs:
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -DCMAKE_C_COMPILER=${{ matrix.config.c }} -DCMAKE_C_FLAGS="-Os ${{ matrix.config.flags }}" -DCURL_TARGET_WINDOWS_VERSION=0x0600 -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -DCMAKE_C_COMPILER=${{ matrix.config.c }} -DCMAKE_C_FLAGS="-Os ${{ matrix.config.flags }}" -DCURL_TARGET_WINDOWS_VERSION=0x0600 -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -DCMAKE_C_COMPILER=${{ matrix.config.c }} -DCMAKE_C_FLAGS='-Os ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -DCMAKE_C_COMPILER=${{ matrix.config.c }} -DCMAKE_C_FLAGS='-Os ${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j$(nproc)
- name: Build libzmq
@@ -508,7 +408,7 @@ jobs:
./p2pool_tests.exe
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-msys2-${{ matrix.config.c }}.exe
path: build/p2pool.exe
@@ -529,7 +429,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -580,35 +480,34 @@ jobs:
p2pool_tests.exe
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-vs-${{ matrix.config.os }}-randomx-${{ matrix.config.rx }}-upnp-${{ matrix.config.upnp }}-grpc-${{ matrix.config.grpc }}-tls-${{ matrix.config.tls }}.exe
path: build/Release/p2pool.exe
build-macos:
timeout-minutes: 60
runs-on: macos-13
timeout-minutes: 90
runs-on: macos-26-intel
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j4
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j4
- name: Build libzmq
@@ -616,14 +515,14 @@ jobs:
cd external/src/libzmq
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_CXX_FLAGS='-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_CXX_FLAGS='-Os -flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF
make -j4
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_CXX_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_ASM_FLAGS='-target x86_64-apple-macos10.13' -DSTATIC_LIBS=ON
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_CXX_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_ASM_FLAGS='-target x86_64-apple-macos10.13' -DSTATIC_LIBS=ON
make -j4 p2pool
- name: Run RandomX tests
@@ -638,7 +537,7 @@ jobs:
cd tests
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_CXX_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_ASM_FLAGS='-target x86_64-apple-macos10.13' -DSTATIC_LIBS=ON
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_CXX_FLAGS='-flto -target x86_64-apple-macos10.13 -Wno-overriding-t-option' -DCMAKE_ASM_FLAGS='-target x86_64-apple-macos10.13' -DSTATIC_LIBS=ON
make -j4 p2pool_tests
- name: Run tests
@@ -648,35 +547,34 @@ jobs:
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-macos-13
name: p2pool-macos
path: build/p2pool
build-macos-aarch64:
timeout-minutes: 30
runs-on: macos-14
runs-on: macos-26
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-Os -target arm64-apple-macos-11" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-Os -target arm64-apple-macos-11" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j3
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -target arm64-apple-macos-11' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -target arm64-apple-macos-11' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j3
- name: Build libzmq
@@ -684,14 +582,14 @@ jobs:
cd external/src/libzmq
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -target arm64-apple-macos-11' -DCMAKE_CXX_FLAGS='-Os -target arm64-apple-macos-11' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='-Os -target arm64-apple-macos-11' -DCMAKE_CXX_FLAGS='-Os -target arm64-apple-macos-11' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF
make -j3
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-target arm64-apple-macos-11" -DCMAKE_CXX_FLAGS="-target arm64-apple-macos-11" -DSTATIC_LIBS=ON -DWITH_LTO=OFF -DARCH_ID=aarch64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-target arm64-apple-macos-11" -DCMAKE_CXX_FLAGS="-target arm64-apple-macos-11" -DSTATIC_LIBS=ON -DWITH_LTO=OFF -DARCH_ID=aarch64
make -j3 p2pool
- name: Run RandomX tests
@@ -706,7 +604,7 @@ jobs:
cd tests
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-target arm64-apple-macos-11" -DCMAKE_CXX_FLAGS="-target arm64-apple-macos-11" -DSTATIC_LIBS=ON -DWITH_LTO=OFF -DARCH_ID=aarch64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="-target arm64-apple-macos-11" -DCMAKE_CXX_FLAGS="-target arm64-apple-macos-11" -DSTATIC_LIBS=ON -DWITH_LTO=OFF -DARCH_ID=aarch64
make -j3 p2pool_tests
- name: Run tests
@@ -716,9 +614,9 @@ jobs:
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-macos-11-aarch64
name: p2pool-macos-aarch64
path: build/p2pool
build-freebsd:
@@ -736,7 +634,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -757,13 +655,12 @@ jobs:
run: |
sudo pkg install -y cmake
cd external/src/curl
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Os -flto" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j4
cd lib && mkdir .libs && cp libcurl.a .libs
cd ../../libuv
cd ../libuv
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS='-Os -flto' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j4
cd ../../libzmq
mkdir build
@@ -787,7 +684,7 @@ jobs:
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-${{ matrix.os.name }}-${{ matrix.os.version }}
path: build/p2pool
@@ -807,7 +704,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -838,7 +735,7 @@ jobs:
./p2pool_tests
- name: Archive binary
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-${{ matrix.os.name }}-${{ matrix.os.version }}
path: build/p2pool
+6 -6
View File
@@ -19,12 +19,12 @@ jobs:
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 20
sudo apt-get install -y clang-tidy-20
clang-tidy-20 --verify-config
sudo ./llvm.sh 22
sudo apt-get install -y clang-tidy-22
clang-tidy-22 --verify-config
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -32,9 +32,9 @@ jobs:
run: |
mkdir build
cd build
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=clang-20 -DCMAKE_CXX_COMPILER=clang++-20 -DDEV_CLANG_TIDY=ON -DSTATIC_LIBS=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=clang-22 -DCMAKE_CXX_COMPILER=clang++-22 -DDEV_CLANG_TIDY=ON -DSTATIC_LIBS=ON -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
- name: Run clang-tidy
run: |
cd src
clang-tidy-20 *.cpp -p ../build -checks=-clang-diagnostic-undefined-internal,-clang-analyzer-optin.performance.Padding,-clang-diagnostic-nan-infinity-disabled -warnings-as-errors=* -header-filter=^[^\.]
clang-tidy-22 *.cpp -p ../build -checks=bugprone-*,clang-analyzer-*,llvm-*,cppcoreguidelines-pro-type-const-cast,cppcoreguidelines-pro-type-cstyle-cast,cppcoreguidelines-rvalue-reference-param-not-moved,hicpp-use-emplace,hicpp-use-override,-bugprone-easily-swappable-parameters,-bugprone-empty-catch,-llvm-include-order,-bugprone-random-generator-seed,-llvm-use-ranges,-bugprone-throwing-static-initialization -warnings-as-errors=* -header-filter=^[^\./]
+3 -3
View File
@@ -48,13 +48,13 @@ jobs:
sudo apt update && sudo apt install git build-essential cmake libuv1-dev libzmq3-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -71,4 +71,4 @@ jobs:
make -j$(nproc) p2pool
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4
+7 -7
View File
@@ -26,10 +26,10 @@ jobs:
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 20 all
sudo ./llvm.sh 22 all
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -38,7 +38,7 @@ jobs:
cd tests
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DDEV_DEBUG=ON -DWITH_COVERAGE=ON -DCMAKE_C_COMPILER=clang-20 -DCMAKE_CXX_COMPILER=clang++-20 -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DCMAKE_BUILD_TYPE=Release -DDEV_DEBUG=ON -DWITH_INDEXED_HASHES=ON -DWITH_COVERAGE=ON -DCMAKE_C_COMPILER=clang-22 -DCMAKE_CXX_COMPILER=clang++-22 -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool_tests
- name: Run tests
@@ -50,12 +50,12 @@ jobs:
- name: Merge profile data
run: |
cd tests/build
llvm-profdata-20 merge -sparse ./p2pool_tests.profraw -o ./p2pool_tests.profdata
llvm-profdata-22 merge -sparse ./p2pool_tests.profraw -o ./p2pool_tests.profdata
- name: Export profile data
run: |
cd tests/build
llvm-cov-20 export ./p2pool_tests -format=lcov -instr-profile=./p2pool_tests.profdata > coverage.info
llvm-cov-22 export ./p2pool_tests -format=lcov -instr-profile=./p2pool_tests.profdata > coverage.info
- name: Run genhtml
run: |
@@ -63,7 +63,7 @@ jobs:
genhtml --demangle-cpp -o coverage coverage.info
- name: Checkout GitHub Pages repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
repository: SChernykh/SChernykh.github.io
token: ${{ secrets.PAGES_DEPLOY_TOKEN }}
@@ -85,7 +85,7 @@ jobs:
- name: Archive coverage data
if: '!cancelled()'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool-coverage
path: tests/build/coverage
+7 -8
View File
@@ -21,7 +21,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -32,14 +32,13 @@ jobs:
- name: Build cppcheck
run: |
cd cppcheck-main
git checkout 1d9ea2ffcca587f99c68f0b6a4c37d5b3e046c28
make -j$(nproc) cppcheck
- name: cmake p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DSTATIC_LIBS=ON -DWITH_GRPC=OFF -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DSTATIC_LIBS=ON -DWITH_GRPC=OFF -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
python ../cppcheck/remove_external.py compile_commands.json
- name: Run cppcheck
@@ -49,14 +48,14 @@ jobs:
- name: Archive full error list
if: '!cancelled()'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: errors_full-linux
path: cppcheck/errors_full.txt
- name: Archive checkers report
if: '!cancelled()'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: checkers_report-linux
path: cppcheck/checkers_report.txt
@@ -68,7 +67,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -97,14 +96,14 @@ jobs:
- name: Archive full error list
if: '!cancelled()'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: errors_full-windows
path: cppcheck/errors_full.txt
- name: Archive checkers report
if: '!cancelled()'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: checkers_report-windows
path: cppcheck/checkers_report.txt
+7 -3
View File
@@ -31,10 +31,14 @@ jobs:
name: Analyze
timeout-minutes: 240
runs-on: windows-latest
permissions:
actions: read
contents: read
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -58,13 +62,13 @@ jobs:
# Upload SARIF file to GitHub Code Scanning Alerts
- name: Upload SARIF to GitHub
uses: github/codeql-action/upload-sarif@v3
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: ${{ steps.run-analysis.outputs.sarif }}
# Upload SARIF file as an Artifact to download and view
- name: Upload SARIF as an Artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: sarif-file
path: ${{ steps.run-analysis.outputs.sarif }}
+2 -2
View File
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -22,7 +22,7 @@ jobs:
XZ_OPT=-e9 tar --exclude=".git" --exclude="build" -f build/p2pool_source.tar.xz -c ../p2pool --xz
- name: Archive source code
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool_source.tar.xz
path: build/p2pool_source.tar.xz
+131 -45
View File
@@ -27,23 +27,22 @@ jobs:
sudo apt install -y git build-essential cmake gcc-12 g++-12
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_C_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_C_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_C_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_C_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j$(nproc)
- name: Build libzmq
@@ -58,7 +57,7 @@ jobs:
run: |
mkdir build
cd build
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_TSAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_C_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DCMAKE_CXX_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DWITH_LTO=OFF -DSTATIC_LIBS=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_TSAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_C_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DCMAKE_CXX_FLAGS='-fsanitize=thread -Og -fno-omit-frame-pointer -g' -DWITH_LTO=OFF -DSTATIC_LIBS=ON -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool
- name: Run p2pool
@@ -71,13 +70,19 @@ jobs:
sudo sysctl vm.mmap_rnd_bits=28
TSAN_OPTIONS="suppressions=../tests/src/tsan_sup.txt halt_on_error=1 history_size=4" ./p2pool --host node.monerodevs.org --rpc-port 18089 --zmq-port 18084 --host node.richfowler.net --rpc-port 18089 --zmq-port 18084 --rpc-ssl --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg ${{ secrets.MM_PARAMS }} --mini --out-peers 200 --data-api data --local-api --loglevel 6
- name: Check p2pool.log
- name: Check synchronization
run: |
cd build
grep 'Synchronization finished successfully' p2pool.log
- name: Check p2pool.log for errors
run: |
cd build
../scripts/workflows/test-sync-check.sh
- name: Archive p2pool.log
uses: actions/upload-artifact@v4
if: '!cancelled()'
uses: actions/upload-artifact@v7
with:
name: p2pool_ubuntu_data_tsan
path: |
@@ -86,7 +91,7 @@ jobs:
sync-test-ubuntu-msan:
timeout-minutes: 60
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- name: Install dependencies
@@ -98,14 +103,14 @@ jobs:
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 20 all
sudo ./llvm.sh 22 all
- name: Build libcxx_msan
run: |
git clone --depth=1 https://github.com/llvm/llvm-project -b release/20.x
git clone --depth=1 https://github.com/llvm/llvm-project -b release/22.x
cd llvm-project
mkdir build
cmake -G Ninja -S runtimes -B build -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DCMAKE_C_COMPILER=clang-20 -DCMAKE_CXX_COMPILER=clang++-20 -DLLVM_USE_SANITIZER=MemoryWithOrigins -DLIBCXXABI_USE_LLVM_UNWINDER=OFF
cmake -G Ninja -S runtimes -B build -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DCMAKE_C_COMPILER=clang-22 -DCMAKE_CXX_COMPILER=clang++-22 -DLLVM_USE_SANITIZER=MemoryWithOrigins -DLIBCXXABI_USE_LLVM_UNWINDER=OFF
ninja -C build cxx cxxabi
cd build
mkdir /tmp/libcxx_msan
@@ -113,23 +118,22 @@ jobs:
cp -r lib /tmp/libcxx_msan
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_C_COMPILER=clang-20 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Og -fno-omit-frame-pointer -g' -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang-22 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -O0 -fno-omit-frame-pointer -g3' -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=clang-20 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Og -fno-omit-frame-pointer -g' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang-22 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -O0 -fno-omit-frame-pointer -g3' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j$(nproc)
- name: Build libzmq
@@ -137,14 +141,14 @@ jobs:
cd external/src/libzmq
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=clang-20 -DCMAKE_CXX_COMPILER=clang++-20 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Og -fno-omit-frame-pointer -g' -DCMAKE_CXX_FLAGS='-nostdinc++ -nostdlib++ -fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Og -fno-omit-frame-pointer -g -isystem /tmp/libcxx_msan/include/c++/v1 -L/tmp/libcxx_msan/lib -lc++ -lc++abi -Wno-unused-command-line-argument' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang-22 -DCMAKE_CXX_COMPILER=clang++-22 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -O0 -fno-omit-frame-pointer -g3' -DCMAKE_CXX_FLAGS='-nostdinc++ -nostdlib++ -fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -isystem /tmp/libcxx_msan/include/c++/v1 -O0 -fno-omit-frame-pointer -g3' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc)
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=clang-20 -DCMAKE_CXX_COMPILER=clang++-20 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -fno-omit-frame-pointer -g' -DCMAKE_CXX_FLAGS='-nostdinc++ -nostdlib++ -fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -isystem /tmp/libcxx_msan/include/c++/v1 -L/tmp/libcxx_msan/lib -Wl,-rpath /tmp/libcxx_msan/lib -lc++ -lc++abi -Wno-unused-command-line-argument -fuse-ld=lld-20 -fno-omit-frame-pointer -g' -DDEV_TEST_SYNC=ON -DDEV_WITH_MSAN=ON -DWITH_LTO=OFF -DSTATIC_LIBS=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang-22 -DCMAKE_CXX_COMPILER=clang++-22 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -fno-omit-frame-pointer' -DCMAKE_CXX_FLAGS='-nostdinc++ -nostdlib++ -fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -isystem /tmp/libcxx_msan/include/c++/v1 -L/tmp/libcxx_msan/lib -Wl,-rpath /tmp/libcxx_msan/lib -lc++ -lc++abi -Wno-unused-command-line-argument -fuse-ld=lld-22 -fno-omit-frame-pointer' -DDEV_TEST_SYNC=ON -DDEV_WITH_MSAN=ON -DWITH_LTO=OFF -DSTATIC_LIBS=ON -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool
- name: Run p2pool
@@ -155,15 +159,21 @@ jobs:
python ../tests/src/stratum_dummy.py 2 &
python ../tests/src/stratum_dummy.py 3 &
sudo sysctl vm.mmap_rnd_bits=28
MSAN_OPTIONS="halt_on_error=1" ./p2pool --host node.monerodevs.org --rpc-port 18089 --zmq-port 18084 --host node.richfowler.net --rpc-port 18089 --zmq-port 18084 --rpc-ssl --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg ${{ secrets.MM_PARAMS }} --mini --out-peers 200 --data-api data --local-api --loglevel 6
MSAN_OPTIONS="halt_on_error=1" ./p2pool --host node.monerodevs.org --rpc-port 18089 --zmq-port 18084 --host node.richfowler.net --rpc-port 18089 --zmq-port 18084 --rpc-ssl --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg ${{ secrets.MM_PARAMS }} --out-peers 50 --data-api data --local-api --loglevel 6
- name: Check p2pool.log
- name: Check synchronization
run: |
cd build
grep 'Synchronization finished successfully' p2pool.log
- name: Check p2pool.log for errors
run: |
cd build
../scripts/workflows/test-sync-check.sh
- name: Archive p2pool.log
uses: actions/upload-artifact@v4
if: '!cancelled()'
uses: actions/upload-artifact@v7
with:
name: p2pool_ubuntu_data_msan
path: |
@@ -183,7 +193,7 @@ jobs:
sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev gcc-12 g++-12
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -191,7 +201,7 @@ jobs:
run: |
mkdir build
cd build
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_UBSAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DWITH_LTO=OFF -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_UBSAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DWITH_LTO=OFF -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool
- name: Run p2pool
@@ -204,13 +214,19 @@ jobs:
sudo sysctl vm.mmap_rnd_bits=28
UBSAN_OPTIONS="suppressions=../tests/src/ubsan_sup.txt halt_on_error=1" ./p2pool --host node.monerodevs.org --rpc-port 18089 --zmq-port 18084 --host node.richfowler.net --rpc-port 18089 --zmq-port 18084 --rpc-ssl --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg ${{ secrets.MM_PARAMS }} --mini --out-peers 200 --data-api data --local-api --loglevel 6
- name: Check p2pool.log
- name: Check synchronization
run: |
cd build
grep 'Synchronization finished successfully' p2pool.log
- name: Check p2pool.log for errors
run: |
cd build
../scripts/workflows/test-sync-check.sh
- name: Archive p2pool.log
uses: actions/upload-artifact@v4
if: '!cancelled()'
uses: actions/upload-artifact@v7
with:
name: p2pool_ubuntu_data_ubsan
path: |
@@ -230,7 +246,7 @@ jobs:
sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev gcc-12 g++-12
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -238,7 +254,7 @@ jobs:
run: |
mkdir build
cd build
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_ASAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_C_FLAGS="-fno-omit-frame-pointer -fsanitize=address -Og -g" -DCMAKE_CXX_FLAGS="-fno-omit-frame-pointer -fsanitize=address -Og -g" -DWITH_LTO=OFF -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -DDEV_TEST_SYNC=ON -DDEV_DEBUG=ON -DDEV_WITH_ASAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_C_FLAGS="-fno-omit-frame-pointer -fsanitize=address -Og -g" -DCMAKE_CXX_FLAGS="-fno-omit-frame-pointer -fsanitize=address -Og -g" -DWITH_LTO=OFF -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool
- name: Run p2pool
@@ -251,49 +267,112 @@ jobs:
sudo sysctl vm.mmap_rnd_bits=28
ASAN_OPTIONS="detect_stack_use_after_return=1 atexit=1" ./p2pool --host node.monerodevs.org --rpc-port 18089 --zmq-port 18084 --host node.richfowler.net --rpc-port 18089 --zmq-port 18084 --rpc-ssl --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg ${{ secrets.MM_PARAMS }} --mini --out-peers 200 --data-api data --local-api --loglevel 6
- name: Check p2pool.log
- name: Check synchronization
run: |
cd build
grep 'Synchronization finished successfully' p2pool.log
- name: Check p2pool.log for errors
run: |
cd build
../scripts/workflows/test-sync-check.sh
- name: Archive p2pool.log
uses: actions/upload-artifact@v4
if: '!cancelled()'
uses: actions/upload-artifact@v7
with:
name: p2pool_ubuntu_data_asan
path: |
build/*.log
build/data/
sync-test-ubuntu-tysan:
if: false # disabled because it generates a flood of type aliasing errors
timeout-minutes: 60
runs-on: ubuntu-22.04
steps:
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev
- name: Install clang
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 22 all
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang-22 -DCMAKE_CXX_COMPILER=clang++-22 -DDEV_TEST_SYNC=ON -DDEV_DEBUG=ON -DDEV_WITH_TYSAN=ON -DWITH_LTO=OFF -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
make -j$(nproc) p2pool
- name: Run p2pool
run: |
cd build
mkdir data
python ../tests/src/stratum_dummy.py 1 &
python ../tests/src/stratum_dummy.py 2 &
python ../tests/src/stratum_dummy.py 3 &
sudo sysctl vm.mmap_rnd_bits=28
TYSAN_OPTIONS=print_stacktrace=1 ./p2pool --host node.monerodevs.org --rpc-port 18089 --zmq-port 18084 --host node.richfowler.net --rpc-port 18089 --zmq-port 18084 --rpc-ssl --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg ${{ secrets.MM_PARAMS }} --out-peers 50 --data-api data --local-api --loglevel 6 --light-mode 2> stderr.log
- name: Check synchronization
run: |
cd build
grep 'Synchronization finished successfully' p2pool.log
- name: Check p2pool.log for errors
run: |
cd build
../scripts/workflows/test-sync-check.sh
- name: Archive p2pool.log
if: '!cancelled()'
uses: actions/upload-artifact@v7
with:
name: p2pool_ubuntu_data_tysan
path: |
build/*.log
build/data/
sync-test-macos:
timeout-minutes: 60
timeout-minutes: 120
runs-on: ${{ matrix.config.os }}
strategy:
matrix:
config:
- {os: macos-13, flags: ""}
- {os: macos-14, flags: "-target arm64-apple-macos-11"}
- {os: macos-26-intel, flags: ""}
- {os: macos-26, flags: "-target arm64-apple-macos-11"}
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="${{ matrix.config.flags }}" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DCURL_DISABLE_TESTS=ON -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS="${{ matrix.config.flags }}" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j4
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF
cmake .. -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='${{ matrix.config.flags }}' -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DENABLE_CLANG_TIDY=OFF
make -j4
- name: Build libzmq
@@ -301,14 +380,14 @@ jobs:
cd external/src/libzmq
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='${{ matrix.config.flags }}' -DCMAKE_CXX_FLAGS='${{ matrix.config.flags }}' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF
cmake .. -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='${{ matrix.config.flags }}' -DCMAKE_CXX_FLAGS='${{ matrix.config.flags }}' -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF
make -j4
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER="$(brew --prefix llvm@15)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@15)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@15)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@15)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='${{ matrix.config.flags }}' -DCMAKE_CXX_FLAGS='${{ matrix.config.flags }}' -DWITH_LTO=OFF -DSTATIC_LIBS=ON -DDEV_TEST_SYNC=ON -DDEV_DEBUG=ON
cmake .. -DCMAKE_C_COMPILER="$(brew --prefix llvm@20)/bin/clang" -DCMAKE_CXX_COMPILER="$(brew --prefix llvm@20)/bin/clang++" -DCMAKE_AR="$(brew --prefix llvm@20)/bin/llvm-ar" -DCMAKE_RANLIB="$(brew --prefix llvm@20)/bin/llvm-ranlib" -DCMAKE_C_FLAGS='${{ matrix.config.flags }}' -DCMAKE_CXX_FLAGS='${{ matrix.config.flags }}' -DWITH_LTO=OFF -DSTATIC_LIBS=ON -DDEV_TEST_SYNC=ON -DDEV_DEBUG=ON -DWITH_INDEXED_HASHES=ON
make -j4 p2pool
- name: Run p2pool
@@ -320,13 +399,19 @@ jobs:
python3 ../tests/src/stratum_dummy.py 3 &
./p2pool --host node.monerodevs.org --rpc-port 18089 --zmq-port 18084 --host node.richfowler.net --rpc-port 18089 --zmq-port 18084 --rpc-ssl --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg ${{ secrets.MM_PARAMS }} --mini --out-peers 200 --data-api data --local-api --loglevel 6
- name: Check p2pool.log
- name: Check synchronization
run: |
cd build
grep 'Synchronization finished successfully' p2pool.log
- name: Check p2pool.log for errors
run: |
cd build
../scripts/workflows/test-sync-check.sh
- name: Archive p2pool.log
uses: actions/upload-artifact@v4
if: '!cancelled()'
uses: actions/upload-artifact@v7
with:
name: p2pool_${{ matrix.config.os }}_data
path: |
@@ -340,7 +425,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -351,7 +436,7 @@ jobs:
run: |
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_VERSION="10.0" -DDEV_TEST_SYNC=ON -DDEV_WITH_ASAN=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_VERSION="10.0" -DDEV_TEST_SYNC=ON -DDEV_WITH_ASAN=ON -DDEV_DEBUG=ON -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
& "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\Msbuild\\Current\\Bin\\amd64\\msbuild" -v:m /m /p:Configuration=Debug p2pool.vcxproj
- name: Run p2pool
@@ -371,7 +456,8 @@ jobs:
findstr /C:"Synchronization finished successfully" p2pool.log
- name: Archive p2pool.log
uses: actions/upload-artifact@v4
if: '!cancelled()'
uses: actions/upload-artifact@v7
with:
name: p2pool_windows_data_debug_asan
path: |
@@ -385,7 +471,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -396,7 +482,7 @@ jobs:
run: |
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_VERSION="10.0" -DDEV_TEST_SYNC=ON -DDEV_TRACK_MEMORY=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
cmake .. -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_VERSION="10.0" -DDEV_TEST_SYNC=ON -DDEV_DEBUG=ON -DDEV_TRACK_MEMORY=ON -DWITH_INDEXED_HASHES=ON -DCMAKE_POLICY_VERSION_MINIMUM="3.5"
& "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\Msbuild\\Current\\Bin\\amd64\\msbuild" -v:m /m /p:Configuration=RelWithDebInfo p2pool.vcxproj
- name: Run p2pool
@@ -416,7 +502,7 @@ jobs:
- name: Archive p2pool.log
if: '!cancelled()'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: p2pool_windows_data_leaks
path: |
+1
View File
@@ -0,0 +1 @@
SChernykh <15806605+SChernykh@users.noreply.github.com> sech1 <sech1@sech1>
+21 -4
View File
@@ -18,6 +18,7 @@ option(WITH_LTO "Use link-time compiler optimization (if linking fails for you,
option(WITH_UPNP "Include UPnP support. If this is turned off, p2pool will not be able to configure port forwarding on UPnP-enabled routers." ON)
option(WITH_GRPC "Include gRPC support. If this is turned off, p2pool will not be able to merge mine with Tari." ON)
option(WITH_TLS "Include TLS support. If this is turned off, p2pool will not support Stratum TLS connections, and lack many other security features. It's recommended to keep it ON!" ON)
option(WITH_INDEXED_HASHES "Save memory used for storing transaction hashes and public keys (a bit slower block verification - use it only if you compile for a very low memory system)" OFF)
option(WITH_MERGE_MINING_DONATION "Merge mine donations to the author. This doesn't affect your hashrate or payouts in any way - only unused merge mining capacity will be utilised. If you merge mine yourself, your settings will take priority." ON)
@@ -26,12 +27,15 @@ option(DEV_WITH_TSAN "[Developer only] Compile with thread sanitizer" OFF)
option(DEV_WITH_MSAN "[Developer only] Compile with memory sanitizer" OFF)
option(DEV_WITH_UBSAN "[Developer only] Compile with undefined behavior sanitizer" OFF)
option(DEV_WITH_ASAN "[Developer only] Compile with address sanitizer" OFF)
option(DEV_WITH_TYSAN "[Developer only] Compile with type sanitizer" OFF)
option(DEV_CLANG_TIDY "[Developer only] Compile for clang-tidy" OFF)
option(DEV_TRACK_MEMORY "[Developer only] Track memory allocations" OFF)
option(DEV_DEBUG "[Developer only] Compile a debug build" OFF)
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT p2pool)
set(BUILD_TESTING OFF CACHE BOOL "CMake's CTest module")
if (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
include(cmake/msvc_libs.cmake)
endif()
@@ -43,7 +47,7 @@ if (WITH_GRPC)
add_subdirectory(external/src/Tari)
elseif (WITH_TLS)
add_subdirectory(cmake/ssl)
include_directories(external/src/grpc/third_party/boringssl-with-bazel/src/include)
include_directories(external/src/grpc/third_party/boringssl-with-bazel/include)
endif()
if (WITH_RANDOMX)
@@ -113,6 +117,7 @@ set(HEADERS
src/merge_mining_client.h
src/merge_mining_client_json_rpc.h
src/merkle.h
src/nodejs_pool_rpc.h
src/p2p_server.h
src/p2pool.h
src/p2pool_api.h
@@ -127,12 +132,14 @@ set(HEADERS
src/uv_util.h
src/wallet.h
src/zmq_reader.h
src/i2p.h
)
set(SOURCES
external/src/crypto/sha256.c
external/src/cryptonote/crypto-ops-data.c
external/src/cryptonote/crypto-ops.c
external/src/cryptonote/fcmp_pp_crypto.cpp
external/src/hardforks/hardforks.cpp
src/block_cache.cpp
src/block_template.cpp
@@ -147,6 +154,7 @@ set(SOURCES
src/merge_mining_client.cpp
src/merge_mining_client_json_rpc.cpp
src/merkle.cpp
src/nodejs_pool_rpc.cpp
src/p2p_server.cpp
src/p2pool.cpp
src/p2pool_api.cpp
@@ -159,6 +167,7 @@ set(SOURCES
src/util.cpp
src/wallet.cpp
src/zmq_reader.cpp
src/i2p.cpp
)
if (AMD64)
@@ -188,6 +197,11 @@ if (WITH_TLS)
set(SOURCES ${SOURCES} src/tls.cpp)
endif()
if (WITH_INDEXED_HASHES)
add_compile_definitions(WITH_INDEXED_HASHES)
set(SOURCES ${SOURCES} src/indexed_hash.cpp)
endif()
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Header Files" FILES ${HEADERS})
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Source Files" FILES ${SOURCES})
@@ -257,14 +271,14 @@ if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
find_library(UV_LIBRARY_DEBUG NAMES uv libuv.a)
find_library(UV_LIBRARY NAMES uv libuv.a)
if (WIN32)
find_library(CURL_LIBRARY_DEBUG NAMES libcurl.a PATHS "external/src/curl/lib" NO_DEFAULT_PATH)
find_library(CURL_LIBRARY_DEBUG NAMES libcurl-d.a PATHS "external/src/curl/lib" NO_DEFAULT_PATH)
find_library(CURL_LIBRARY NAMES libcurl.a PATHS "external/src/curl/lib" NO_DEFAULT_PATH)
else()
if (CURL_LIBRARIES)
set(CURL_LIBRARY_DEBUG ${CURL_LIBRARIES})
set(CURL_LIBRARY ${CURL_LIBRARIES})
else()
find_library(CURL_LIBRARY_DEBUG NAMES curl)
find_library(CURL_LIBRARY_DEBUG NAMES curl-d)
find_library(CURL_LIBRARY NAMES curl)
endif()
endif()
@@ -394,6 +408,8 @@ if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
add_definitions(-DNDEBUG)
endif()
include(cmake/git.cmake)
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES})
if (STATIC_BINARY OR STATIC_LIBS)
@@ -448,7 +464,8 @@ if (STATIC_BINARY OR STATIC_LIBS)
target_link_libraries(${CMAKE_PROJECT_NAME}
"${CMAKE_SOURCE_DIR}/external/src/libzmq/build/lib/libzmq.a"
"${CMAKE_SOURCE_DIR}/external/src/libuv/build/libuv.a"
"${CMAKE_SOURCE_DIR}/external/src/curl/lib/libcurl.a"
debug "${CMAKE_SOURCE_DIR}/external/src/curl/lib/libcurl-d.a"
optimized "${CMAKE_SOURCE_DIR}/external/src/curl/lib/libcurl.a"
${STATIC_LIBS}
)
else()
+66 -54
View File
@@ -2,7 +2,13 @@
Decentralized pool for Monero mining.
Pool status and monitoring pages can be found at https://p2pool.io/, https://p2pool.io/mini/ and https://p2pool.observer/, https://mini.p2pool.observer/
Pool status and monitoring pages can be found at:
|P2Pool||
|-|-|
|main|https://p2pool.io/ <br> https://p2pool.observer/|
|mini|https://p2pool.io/mini/ <br> https://mini.p2pool.observer/|
|nano|https://p2pool.io/nano/ <br> https://nano.p2pool.observer/|
These are 3rd-party pages. If they are down, it doesn't mean there is a problem with P2Pool itself - it keeps mining always thanks to its decentralized nature.
@@ -29,25 +35,25 @@ These are 3rd-party pages. If they are down, it doesn't mean there is a problem
- [General Considerations](#general-considerations)
- [GUI for P2Pool](#gui-for-p2pool)
- [Merge mining](#merge-mining)
- [GNU/Linux](#gnulinux)
- [Windows](#windows)
- [Mining on GNU/Linux](#gnulinux)
- [Mining on Windows](#windows)
- [Build instructions](#build-instructions)
- [Reproducible builds](#reproducible-builds)
- [Donations](#donations)
## Pool mining vs Solo mining vs P2Pool mining
Here's the comparison table of the different ways of mining. While pool mining is the easiest to setup, it centralizes Monero network and pool admin gets full power over your hashrate and your unpaid funds. Solo mining is 100% independent and the best for the network. P2Pool mining has all the advantages of solo mining, but also makes regular payouts possible.
Here's the comparison table of the different ways of mining. While pool mining is the easiest to set up, it centralizes the Monero network and the pool admin gets full power over your hashrate and your unpaid funds. Solo mining is 100% independent and the best for the network. P2Pool mining has all the advantages of solo mining, but also makes regular payouts possible.
|Pool type|Payouts|Fee|Min. payout|Centralized?|Stability|Control|Setup
|-|-|-|-|-|-|-|-|
|Centralized pool|Regular|0-3%|0.001-0.01 XMR|Yes|Less stable due to pool server outages|Pool admin controls your mined funds, what you mine and can execute network attacks|Only miner software is required
|Centralized pool|Regular|0-3%|0.001-0.01 XMR|Yes|Less stable due to pool server outages|The pool admin controls your mined funds and what you mine, and can execute attacks against the network|Only miner software is required
|Solo|Rare|0%|0.6 XMR or more|No|As stable as your Monero node|100% under your control|Monero node + optional miner
|**P2Pool**|Regular|0%|~0.00027 XMR|No|Very stable: node failover and multiple Monero nodes are supported|100% under your control|Monero node(s) + P2Pool node(s) + optional miner(s)
## Features
* Decentralized: no central server that can be shutdown/blocked. P2Pool uses a separate blockchain to merge mine with Monero. Pool admin can't go rogue or be pressured to do an attack on the network because there is no pool admin!
* Decentralized: no central server that can be shut down/blocked. P2Pool uses a separate blockchain to merge mine with Monero. Pool admin can't go rogue or be pressured to do an attack on the network because there is no pool admin!
* Permissionless: there is no one to decide who can mine on the pool and who can't.
* Trustless: there is no pool wallet, funds are never in custody. All pool blocks pay out to miners directly.
* PPLNS payout scheme
@@ -57,13 +63,14 @@ Here's the comparison table of the different ways of mining. While pool mining i
* Fast block times, down to 1 second
* Uncle blocks are supported to avoid orphans - all your shares will be accounted for!
* Configurable PPLNS window size and block time
* Advanced mempool picking algorithm, it creates blocks with better reward than what monerod solo mining does
* Advanced mempool picking algorithm: it creates blocks with better rewards than what monerod solo mining does
* Password protected private pools
* Highly reliable configurations are supported (multiple P2Pool nodes mining to the same wallet, each P2Pool node can use multiple Monero nodes and switch on the fly if an issue is detected)
* Mining through [TOR](docs/TOR.MD) and [I2P](docs/I2P.MD) is fully supported
## How payouts work in P2Pool
First you need to find a pool share. This share will stay in [PPLNS](https://en.wikipedia.org/wiki/Mining_pool#Pay-per-last-N-shares) window for up to 2160 pool blocks (6 hours, auto adjustable to balance payout sizes and frequency). The moment P2Pool finds a Monero block and you have at least 1 pool share in PPLNS window, you'll get a payout! Monero block reward is split between all miner wallets in PPLNS window. Each miner gets a part of block reward proportional to the total difficulty of his/her shares in PPLNS window.
First you need to find a pool share. This share will stay in [PPLNS](https://en.wikipedia.org/wiki/Mining_pool#Pay-per-last-N-shares) window for up to 2160 pool blocks (6 hours, auto adjustable to balance payout sizes and frequency). The moment P2Pool finds a Monero block and you have at least 1 pool share in PPLNS window, you'll get a payout! Monero block reward is split between all miner wallets in PPLNS window. Each miner gets a part of the block reward proportional to the total difficulty of his/her shares in PPLNS window.
**NOTE** If P2Pool doesn't have enough hashrate to find Monero blocks faster than every 6 hours on average (~15 MH/s), **not all your pool shares will result in a payout**. Even if pool hashrate is higher, bad luck can sometimes result in a share going through PPLNS window without a payout. But in the long run it will be compensated by other shares receiving multiple payouts - your payouts will average out to what you'd get with regular pool mining.
@@ -82,19 +89,23 @@ In order to continue mining on P2Pool, you must update both Monero and P2Pool so
|Monero protocol version|Required Monero software version|Required P2Pool version
|-|-|-|
|v15, v16 (active after August 13th, 2022)|v0.18.0.0 or newer, v0.18.4.1 is recommended|v4.0 or newer
|v15, v16 (active after August 13th, 2022)|v0.18.0.0 or newer, v0.18.4.6 or newer is recommended|v4.0 or newer
## How to mine on P2Pool
### General Considerations
- In order to mine on P2Pool, a synced Monero node using monerod v0.18.0.0 or newer is required. If you don't currently have one, you can download the [official Monero binaries](https://www.getmonero.org/downloads/), start `monerod` on your PC and wait until it's fully synced. Advanced Monero node setup instructions are [here](https://sethforprivacy.com/guides/run-a-monero-node-advanced/).
- It is highly recommended that you create a separate restricted user account (in your OS) for mining. While P2Pool has been battle-tested for a long time now, any software may have unknown bugs/vulnerabilities.
- You have to use a primary wallet address (the one starting with `4`) for mining. Subaddresses and integrated addresses are not supported, just like with monerod solo mining.
- You can add the `--mini` parameter to your P2Pool command to connect to the **p2pool-mini** sidechain. Note that it will also change the default p2p port from 37889 to 37888.
- Check that ports 18080 (Monero p2p port) and 37889/37888 (P2Pool/P2Pool mini p2p port) are open in your firewall to ensure better connectivity. If you're mining from a computer behind NAT (like a router) you could consider forwarding the ports to your local machine.
- It is highly recommended that you create a separate restricted user account (in your OS) for mining. While P2Pool has been battle-tested for a long time now, any software may have unknown bugs/vulnerabilities.
- You can mine to a primary wallet address (the one starting with `4`). If you want to mine to a subaddress, you will need to provide both the main address (starting with 4) and the subaddress (starting with 8) using `--wallet` and `--subaddress` command line parameters.
- You can add the `--mini` or `--nano` parameter to your P2Pool command to connect to the respective sidechain.
> [!NOTE]
> You cannot use both `--mini` and `--nano` together<br>
> Using `--mini` will change the p2p port to 37888.<br>
> Using `--nano` will change the p2p port to 37890.<br>
- Check that ports 18080 (Monero p2p port) and 37889/37888/37890 (P2Pool default/mini/nano p2p port) are open in your firewall to ensure better connectivity. If you're mining from a computer behind NAT (like a router) you could consider forwarding the ports to your local machine.
- You can connect multiple miners to the same P2Pool node. The more the better!
- The steps below assume that you run everything on the same machine. If it's not the case, change `127.0.0.1` to appropriate IP addresses for your setup.
- The steps below assume that you run everything on the same machine. If it's not the case, change `127.0.0.1` to appropriate IP addresses for your setup.
- It is highly recommended to create a new mainnet wallet for P2Pool mining because **wallet addresses are public on P2Pool**.
**Wallet software compatible with P2Pool payouts**
@@ -103,19 +114,18 @@ In order to continue mining on P2Pool, you must update both Monero and P2Pool so
- [Cake Wallet v4.4.5 and newer](https://cakewallet.com/)
- [Monero.com by Cake Wallet](https://monero.com/)
- [Feather Wallet v2.1.0 and newer](https://featherwallet.org/)
- [MyMonero](https://mymonero.com/)
### GUI for P2Pool
- [Gupax](https://github.com/hinto-janai/gupax) project aims to provide an easy to use cross-platform GUI to configure and run P2Pool & [XMRig](https://github.com/xmrig/xmrig).
- [Gupax](https://github.com/gupax-io/gupax) project aims to provide an easy to use cross-platform GUI to configure and run P2Pool & [XMRig](https://github.com/xmrig/xmrig).
### Merge mining
Merge mining is available in P2Pool since the fork that happened on October 12th, 2024. Version 4.0 or newer is required to use it.
Blockchains that will support [Merge mining RPC API](https://github.com/SChernykh/p2pool/blob/master/docs/MERGE_MINING.MD#proposed-rpc-api):
- [Townforge](https://townforge.net/) supports it in their [tmp-mm branch](https://git.townforge.net/townforge/townforge/src/branch/tmp-mm) (not released yet)
- [DarkFi](https://dark.fi/) is going to support it, but it's [not ready yet](https://github.com/darkrenaissance/darkfi/issues/244)
- [Townforge](https://townforge.net/) supports merge mining (but Townforge is still in testnet phase)
- [DarkFi](https://dark.fi/) supports it in their [testnet](https://dark.fi/book/testnet/merge-mining.html)
```
p2pool.exe --wallet YOUR_MONERO_WALLET_ADDRESS --merge-mine IP:port YOUR_WALLET_ADDRESS_ON_ANOTHER_BLOCKCHAIN
```
@@ -134,7 +144,7 @@ TARI_NODE_IP is 127.0.0.1 if you run both on the same machine (recommended).
Merge mining is available on Tari's mainnet:
- Download [Tari suite](https://github.com/tari-project/tari/releases/latest) for your OS
- Run Minotari node and wait until in synchronizes
- Run Minotari node and wait until it synchronizes
- Run Minotari console wallet to create a Tari wallet
- Copy the "Tari Address one-sided" from the "Receive" tab of the wallet
- Paste it into the P2Pool command line above
@@ -142,20 +152,20 @@ Merge mining is available on Tari's mainnet:
Note that Tari will be mined in solo mode (only full Tari blocks can be mined for now). This doesn't affect P2Pool payouts - they will stay the same.
### GNU/Linux
### Mining on GNU/Linux
1. Download the latest P2Pool binaries [here](https://github.com/SChernykh/p2pool/releases/latest).
- Alternatively, grab the latest source code for P2Pool and [build it](#build-instructions).
2. Download the latest XMRig (linux-static-x64) binary [here](https://github.com/xmrig/xmrig/releases/latest).
3. Prepare enough huge pages (each of monerod/P2Pool/XMRig needs them):
3. Prepare enough huge pages (each of monerod/P2Pool/XMRig needs them):
```
sudo sysctl vm.nr_hugepages=3072
```
4. Check that ports 18080 (Monero p2p port) and 37889/37888 (P2Pool/P2Pool mini p2p port) are open in your local firewall to ensure better connectivity.
5. Start `monerod` with the following command/options:
4. Check that ports 18080 (Monero p2p port) and 37889/37888/37890 (P2Pool default/mini/nano p2p port) are open in your local firewall to ensure better connectivity.
5. Start `monerod` with the following command/options:
```
./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --enforce-dns-checkpointing --enable-dns-blocklist
```
./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --disable-dns-checkpoints --enable-dns-blocklist
```
**Note:**
The `--zmq-pub` option is required for P2Pool to work properly.
@@ -163,30 +173,30 @@ The `--zmq-pub` option is required for P2Pool to work properly.
`--add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080` is needed to have guaranteed good working nodes in your connected peers.
`--disable-dns-checkpoints` is needed to avoid periodical lags when DNS is updated (it's not needed when mining)
`--enforce-dns-checkpointing` is needed to combat the selfish mining attempts by malicious actors
`--enable-dns-blocklist` is needed to ban known bad nodes
6. Start P2Pool with the following command/options:
```
./p2pool --host 127.0.0.1 --wallet YOUR_WALLET_ADDRESS
./p2pool --host 127.0.0.1 --wallet YOUR_WALLET_ADDRESS --mini
```
7. Wait until the initial P2Pool sync is finished (shouldn't take more than 5-10 minutes).
8. Start XMRig with the following command/options:
```
./xmrig -o 127.0.0.1:3333
```
- Note that you don't need to specify your wallet address for XMRig. **Wallet addresses set in XMRig config will be ignored!**
- To set a custom fixed difficulty for your miner (for example, 10000), instead start XMRig with the following options:
- Note that you don't need to specify your wallet address for XMRig. **Wallet addresses set in XMRig config will be ignored!**
- To set a custom fixed difficulty for your miner (for example, 10000), instead start XMRig with the following options:
```
./xmrig -u x+10000 -o 127.0.0.1:3333
```
9. XMRig should connect and start mining!
**Additional Information:**
- For a more in-depth beginner friendly walk-through with the option of using Docker, please see SethForPrivacy's guide at: https://sethforprivacy.com/guides/run-a-p2pool-node/
- You can check the p2pool.log for any warnings or errors using the following command:
**Additional Information:**
- For a more in-depth beginner-friendly walk-through with the option of using Docker, please see SethForPrivacy's guide at: https://sethforprivacy.com/guides/run-a-p2pool-node/
- You can check the p2pool.log for any warnings or errors using the following command:
```
grep -E 'WARNING|ERROR' p2pool.log
```
@@ -203,26 +213,26 @@ nocreate
}
```
### Windows
### Mining on Windows
**Note:** *Windows SmartScreen may block incoming connections by files that are "Downloaded from the Internet". You can allow 'p2pool.exe' and 'monerod.exe' by double-clicking them, clicking "More Info", then click "Run Anyway" and then closing them immediately so you can run them from the command line. Advanced users can use the PowerShell cmdlet `Unblock-File` to remove this flag.*
**Note:** *Windows SmartScreen may block incoming connections by files that are "Downloaded from the Internet". You can allow 'p2pool.exe' and 'monerod.exe' by double-clicking them, clicking "More Info", then clicking "Run Anyway" and then closing them immediately so you can run them from the command line. Advanced users can use the PowerShell cmdlet `Unblock-File` to remove this flag.*
1. Download the latest P2Pool binaries [here](https://github.com/SChernykh/p2pool/releases/latest).
- Alternatively, grab the latest source code for P2Pool and [build it](#build-instructions).
2. Download the latest XMRig binary [here](https://github.com/xmrig/xmrig/releases/latest).
3. Expand the P2Pool binaries into an appropriate location (`%USERPROFILE%/bin` or `C:/bin/` are good options)
4. Expand XMRig binary into an appropriate location (the same folder as P2Pool is fine).
5. Prepare huge pages to work properly (each of monerod/P2Pool/XMRig needs them):
- On Windows 10 or above, run XMRig at least once as Administrator (right-click Run As Administrator)
4. Expand XMRig binary into an appropriate location (the same folder as P2Pool is fine).
5. Prepare huge pages to work properly (each of monerod/P2Pool/XMRig needs them):
- On Windows 10 or above, run XMRig at least once as Administrator (right-click, "Run As Administrator")
- On earlier versions of Windows, you'll need to run XMRig as Administrator at least once per login.
6. Create "Monero" folder inside extracted P2Pool folder and copy Monero binaries there.
7. Open a command prompt and navigate to the folder where you extracted P2Pool.
**Note:** *When running the below commands, Windows Firewall may prompt to allow connections, click "Allow" if prompted.*
8. Start `monerod` with the following command/options:
8. Start `monerod` with the following command/options:
```
.\Monero\monerod.exe --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --disable-dns-checkpoints --enable-dns-blocklist
.\Monero\monerod.exe --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --enforce-dns-checkpointing --enable-dns-blocklist
```
**Note:**
The `--zmq-pub` option is required for P2Pool to work properly.
@@ -231,7 +241,7 @@ The `--zmq-pub` option is required for P2Pool to work properly.
`--add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080` is needed to have guaranteed good working nodes in your connected peers.
`--disable-dns-checkpoints` is needed to avoid periodical lags when DNS is updated (it's not needed when mining)
`--enforce-dns-checkpointing` is needed to combat the selfish mining attempts by malicious actors
`--enable-dns-blocklist` is needed to ban known bad nodes
@@ -244,8 +254,8 @@ The `--zmq-pub` option is required for P2Pool to work properly.
```
.\xmrig.exe -o 127.0.0.1:3333
```
- Note that you don't need to specify your wallet address for XMRig. **Wallet addresses set in XMRig config will be ignored!**
- To set a custom fixed difficulty for your miner (for example, 10000), instead start XMRig with the following options:
- Note that you don't need to specify your wallet address for XMRig. **Wallet addresses set in XMRig config will be ignored!**
- To set a custom fixed difficulty for your miner (for example, 10000), instead start XMRig with the following options:
```
xmrig.exe -u x+10000 -o 127.0.0.1:3333
```
@@ -253,7 +263,7 @@ The `--zmq-pub` option is required for P2Pool to work properly.
13. *(Optional but highly recommended)* You can create a Quickstart by creating a batch (.bat) file with the following contents and placing it in your P2Pool directory along with `xmrig.exe`.
```
@ECHO OFF
start cmd /k %~dp0\Monero\monerod.exe --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --disable-dns-checkpoints --enable-dns-blocklist
start cmd /k %~dp0\Monero\monerod.exe --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --enforce-dns-checkpointing --enable-dns-blocklist
ECHO Wait until the Monero daemon shows fully synced before continuing. This can take some time. Type 'status' in other window to check progress.
PAUSE
start cmd /k %~dp0\p2pool.exe --wallet YOUR_WALLET_ADDRESS --mini
@@ -263,11 +273,11 @@ PAUSE
```
## Build instructions
Only 64-bit builds are supported, in particular ARMv7 or older CPUs are not supported. The reason is that RandomX hashing algorithm is too slow in 32-bit mode, and P2Pool needs to check new blocks very fast to keep up with other nodes.
Only 64-bit builds are supported. In particular, ARMv7 and older CPUs are not supported. The reason is that RandomX hashing algorithm is too slow in 32-bit mode, and P2Pool needs to check new blocks very fast to keep up with other nodes.
### Prerequisites
- cmake >= 3.10
- C++ compiler with C++17 support. GCC-8, Clang-13 and MSVC-2019 have been tested and confirmed to work, older compilers may fail to build P2Pool.
- C++ compiler with C++17 support. GCC-8, Clang-13 and MSVC-2019 have been tested and confirmed to work. Older compilers may fail to build P2Pool.
### Ubuntu 20.04
@@ -289,8 +299,8 @@ pacman -S p2pool
### [Nix/NixOS](https://nixos.org)
This is a flake only project. So you have to use [nixUnstable with nix flakes](https://nixos.wiki/wiki/Flakes) to build or install P2Pool.
The commands below use the new flake specific reference-format, so be sure to also set `ca-references` in `--experimental-features`.
This is a flake only project. So you have to use [nixUnstable with nix flakes](https://nixos.wiki/wiki/Flakes) to build or install P2Pool.
The commands below use the new flake-specific reference-format, so be sure to also set `ca-references` in `--experimental-features`.
Because this project has submodules which are not fixed in _nixUnstable_ yet you have to use the `nix/master` branch:
```
@@ -320,7 +330,7 @@ cmake .. -G "Visual Studio 16 2019"
```
then open generated build\p2pool.sln in Visual Studio and build it there
Alternatively, you can select "Clone a repository" within the GUI, then select "Build" from the menu.
Alternatively, you can select "Clone a repository" within the GUI, then select "Build" from the menu.
### macOS
@@ -368,19 +378,21 @@ Anyone can run the same build script on the same source code, and get the same r
Prerequisites: Ubuntu with Docker and Git installed.
Example of building v4.9 release binaries:
Example of building v4.15 release binaries:
```
git clone --branch v4.9 --recursive https://github.com/SChernykh/p2pool
p2pool/scripts/release/build_all.sh v4.9
git clone --branch v4.15 --recursive https://github.com/SChernykh/p2pool
p2pool/scripts/release/build_all.sh v4.15
```
The binaries will be created in `p2pool/scripts/release` folder. First time you run it, it will take up to several hours to first build the Docker image with all the necessary tools in it. Wait until all builds are finished and then run
The binaries will be created in `p2pool/scripts/release` folder. The first time you run it, it will take up to several hours to first build the Docker image with all the necessary tools in it. Wait until all builds are finished and then run
```
cd p2pool/scripts/release
./gen_sums.sh
```
to generate the hash sums and compare them with the official release's hash sums.
Reproducible builds of (almost) all commits are available [here](https://p2pool.io/builds/). These builds use the release build scripts, so they can act as a "latest release" for all means and purposes, but they might be less stable than the official releases.
## Donations
If you'd like to support further development of Monero P2Pool, you're welcome to send any amount of XMR to the following address:
@@ -389,7 +401,7 @@ If you'd like to support further development of Monero P2Pool, you're welcome to
44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg
```
Starting from v4.6, P2Pool will also have an ability to merge mine donations for the author.
Starting from v4.6, P2Pool also has an ability to merge mine donations for the author.
Note that this will not affect your hashrate or payouts in any way. P2Pool will always (100% of the time) keep mining to your configured Monero wallet address, but it might also use the available merge mining capacity to donate to the author.
@@ -397,4 +409,4 @@ If you merge mine yourself, your settings will take priority.
The merge mining donation runs without a donation server - there is no "phoning home" to a server, everything is done through the P2Pool's network in a decentralized way.
To opt out of this, build P2Pool with `-DWITH_MERGE_MINING_DONATION=OFF` in cmake command line. Due to the architecture of the decentralized P2Pool network, your node will still relay donation messages to other nodes even if you opted out (but it will not process them).
To opt out of this, build P2Pool with `-DWITH_MERGE_MINING_DONATION=OFF` in the cmake command line. Due to the architecture of the decentralized P2Pool network, your node will still relay donation messages to other nodes even if you opted out (but it will not process them).
+11 -6
View File
@@ -23,10 +23,6 @@ if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(WARNING_FLAGS "${WARNING_FLAGS} -Wstrict-overflow=2")
endif()
if (NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15))
set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-cpp")
endif()
if (DISABLE_WARNINGS)
set(WARNING_FLAGS "-w")
endif()
@@ -40,6 +36,11 @@ if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
endif()
set(OPTIMIZATION_FLAGS "${OPTIMIZATION_FLAGS} -g3 -ftrapv")
else()
# Looks like this warning is a false positive on GCC 16.1 (mingw) at -O2/-O3 optimization level
if (MINGW AND (NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16)))
set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-array-bounds")
endif()
set(OPTIMIZATION_FLAGS "-O3 -ffast-math -s")
endif()
@@ -73,7 +74,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
endif()
endif()
elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
set(GENERAL_FLAGS "/MP /EHa")
set(GENERAL_FLAGS "/MP /EHa /permissive-")
set(WARNING_FLAGS "/Wall /WX /sdl")
set(SECURITY_FLAGS "/GS /guard:cf")
set(OPTIMIZATION_FLAGS "/O2 /Oi /Ob2 /Ot /Oy /DNDEBUG /GL")
@@ -113,6 +114,10 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(GENERAL_FLAGS "${GENERAL_FLAGS} -mfix-cortex-a53-835769")
endif()
if (DEV_WITH_TYSAN)
set(GENERAL_FLAGS "${GENERAL_FLAGS} -fno-omit-frame-pointer -fsanitize=type")
endif()
set(WARNING_FLAGS "-Wall -Wextra -Wno-unused-function -Wno-undefined-internal -Wno-unknown-warning-option -Wno-nan-infinity-disabled -Wunreachable-code-aggressive -Wmissing-prototypes -Wmissing-variable-declarations -Werror")
if (NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 20))
@@ -123,7 +128,7 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(WARNING_FLAGS "-w")
endif()
if (DEV_WITH_MSAN OR DEV_DEBUG OR (CMAKE_BUILD_TYPE STREQUAL "Debug") OR (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
if (DEV_WITH_MSAN OR DEV_WITH_TYSAN OR DEV_DEBUG OR (CMAKE_BUILD_TYPE STREQUAL "Debug") OR (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
add_definitions(-DDEBUG_BUILD)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(OPTIMIZATION_FLAGS "-O0")
+33
View File
@@ -0,0 +1,33 @@
if (GIT_COMMIT)
message(STATUS "GIT_COMMIT is set to ${GIT_COMMIT}")
else()
set(GIT_COMMIT "unknown")
find_program(GIT_EXECUTABLE git)
if (GIT_EXECUTABLE)
execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short=7 HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
RESULT_VARIABLE RET
OUTPUT_VARIABLE COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (RET EQUAL 0)
set(GIT_COMMIT "${COMMIT}")
execute_process(COMMAND git status --porcelain
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
RESULT_VARIABLE RET
OUTPUT_VARIABLE GIT_UNSTAGED
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(GIT_UNSTAGED OR RET)
set(GIT_COMMIT "${GIT_COMMIT} (dirty)")
endif()
endif()
endif()
message(STATUS "You are currently on commit ${GIT_COMMIT}")
endif()
add_compile_definitions(GIT_COMMIT="${GIT_COMMIT}")
+1 -1
View File
@@ -40,6 +40,6 @@ add_definitions(-DGRPC_NO_XDS)
add_subdirectory(external/src/grpc)
include_directories(external/src/grpc/third_party/abseil-cpp)
include_directories(external/src/grpc/third_party/boringssl-with-bazel/src/include)
include_directories(external/src/grpc/third_party/boringssl-with-bazel/include)
include_directories(external/src/grpc/third_party/protobuf/src)
include_directories(external/src/grpc/include)
+4 -4
View File
@@ -3,7 +3,7 @@ set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER /usr/local/bin/aarch64-apple-darwin24.5-clang)
set(CMAKE_CXX_COMPILER /usr/local/bin/aarch64-apple-darwin24.5-clang++)
set(CMAKE_ASM_COMPILER /usr/local/bin/aarch64-apple-darwin24.5-as)
set(CMAKE_STRIP /usr/local/bin/aarch64-apple-darwin24.5-strip)
set(CMAKE_C_COMPILER /usr/local/bin/aarch64-apple-darwin25.1-clang)
set(CMAKE_CXX_COMPILER /usr/local/bin/aarch64-apple-darwin25.1-clang++)
set(CMAKE_ASM_COMPILER /usr/local/bin/aarch64-apple-darwin25.1-as)
set(CMAKE_STRIP /usr/local/bin/aarch64-apple-darwin25.1-strip)
+4 -4
View File
@@ -3,7 +3,7 @@ set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_C_COMPILER /usr/local/bin/x86_64-apple-darwin24.5-clang)
set(CMAKE_CXX_COMPILER /usr/local/bin/x86_64-apple-darwin24.5-clang++)
set(CMAKE_ASM_COMPILER /usr/local/bin/x86_64-apple-darwin24.5-as)
set(CMAKE_STRIP /usr/local/bin/x86_64-apple-darwin24.5-strip)
set(CMAKE_C_COMPILER /usr/local/bin/x86_64-apple-darwin25.1-clang)
set(CMAKE_CXX_COMPILER /usr/local/bin/x86_64-apple-darwin25.1-clang++)
set(CMAKE_ASM_COMPILER /usr/local/bin/x86_64-apple-darwin25.1-as)
set(CMAKE_STRIP /usr/local/bin/x86_64-apple-darwin25.1-strip)
+6 -3
View File
@@ -15,6 +15,11 @@ set(BUILD_SHARED OFF CACHE BOOL "")
set(ENABLE_CLANG OFF CACHE BOOL "")
set(CURL_TARGET_WINDOWS_VERSION "0x0600" CACHE STRING "")
set(CURL_DROP_UNUSED ON CACHE BOOL "")
set(CURL_DISABLE_TYPECHECK ON CACHE BOOL "")
set(CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG ON CACHE BOOL "")
set(CURL_DISABLE_SHA512_256 ON CACHE BOOL "")
set(PICKY_COMPILER OFF CACHE BOOL "")
set(BUILD_CURL_EXE OFF CACHE BOOL "")
set(BUILD_SHARED_LIBS OFF CACHE BOOL "")
set(CURL_DISABLE_INSTALL ON CACHE BOOL "")
@@ -39,9 +44,7 @@ set(CURL_DISABLE_NTLM ON CACHE BOOL "")
set(CURL_DISABLE_PARSEDATE ON CACHE BOOL "")
set(CURL_DISABLE_PROGRESS_METER ON CACHE BOOL "")
set(CURL_DISABLE_SHUFFLE_DNS ON CACHE BOOL "")
set(CURL_DISABLE_SOCKETPAIR ON CACHE BOOL "")
set(CURL_DISABLE_VERBOSE_STRINGS ON CACHE BOOL "")
set(CURL_DISABLE_WEBSOCKETS ON CACHE BOOL "")
set(HTTP_ONLY ON CACHE BOOL "")
set(CURL_ENABLE_SSL OFF CACHE BOOL "")
set(USE_LIBIDN2 OFF CACHE BOOL "")
@@ -56,7 +59,7 @@ set(CURL_STATIC_CRT ON CACHE BOOL "")
if (WITH_TLS)
set(P2POOL_BORINGSSL ON CACHE BOOL "")
set(OPENSSL_INCLUDE_DIR "../grpc/third_party/boringssl-with-bazel/src/include" CACHE STRING "")
set(OPENSSL_INCLUDE_DIR "../grpc/third_party/boringssl-with-bazel/include" CACHE STRING "")
endif()
add_subdirectory(external/src/curl)
+1 -1
View File
@@ -4,7 +4,7 @@
../external/src/cryptonote/
../external/src/libuv/
../external/src/cppzmq/
../external/src/libzmq/
../external/src/libzmq/include/
../external/src/miniupnp/miniupnpc/include/
../external/src/randomx/src/
../external/src/rapidjson/include/
+1 -1
View File
@@ -1,5 +1,5 @@
@echo off
"..\cppcheck-main\bin\cppcheck.exe" ../src/*.cpp -D__cppcheck__ -DSIZE_MAX=UINT64_MAX -DRAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN -D_WIN32=1 -D_WIN64=1 -DWIN32=1 -D_WINDOWS=1 -DNDEBUG=1 -DWITH_GRPC=1 -DPROTOBUF_ENABLE_DEBUG_LOGGING_MAY_LEAK_PII=0 -DWITH_RANDOMX=1 -DWITH_UPNP=1 -DWITH_TLS=1 -DWITH_MERGE_MINING_DONATION=1 -DCURL_STATICLIB=1 -DWIN32_LEAN_AND_MEAN=1 -D_WIN32_WINNT=0x0600 -D_DISABLE_VECTOR_ANNOTATION=1 -D_DISABLE_STRING_ANNOTATION=1 -DZMQ_STATIC=1 -DHAVE_BITSCANREVERSE64=1 -DRAPIDJSON_PARSE_DEFAULT_FLAGS=kParseTrailingCommasFlag -DMINIUPNP_STATICLIB=1 -DCARES_STATICLIB=1 -DCMAKE_INTDIR="Release" -D__SSE2__=1 -D_MSC_VER=1929 --platform=win64 --std=c++17 --enable=all --inconclusive --inline-suppr --template="{file}:{line}:{id}{inconclusive: INCONCLUSIVE} {message}" --includes-file=includes.txt --suppressions-list=suppressions.txt --output-file=errors_full.txt --max-ctu-depth=3 --check-level=exhaustive --checkers-report=checkers_report.txt
"..\cppcheck-main\bin\cppcheck.exe" ../src/*.cpp -D__cppcheck__ -DSIZE_MAX=UINT64_MAX -DRAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN -D_WIN32=1 -D_WIN64=1 -DWIN32=1 -D_WINDOWS=1 -DNDEBUG=1 -DWITH_GRPC=1 -DPROTOBUF_ENABLE_DEBUG_LOGGING_MAY_LEAK_PII=0 -DWITH_RANDOMX=1 -DWITH_UPNP=1 -DWITH_TLS=1 -DWITH_MERGE_MINING_DONATION=1 -DCURL_STATICLIB=1 -DWIN32_LEAN_AND_MEAN=1 -D_WIN32_WINNT=0x0600 -D_DISABLE_VECTOR_ANNOTATION=1 -D_DISABLE_STRING_ANNOTATION=1 -DZMQ_STATIC=1 -DZMQ_VERSION=40306 -DHAVE_BITSCANREVERSE64=1 -DRAPIDJSON_PARSE_DEFAULT_FLAGS=kParseTrailingCommasFlag -DMINIUPNP_STATICLIB=1 -DCARES_STATICLIB=1 -DCMAKE_INTDIR="Release" -D__SSE2__=1 -D_MSC_VER=1929 --platform=win64 --std=c++17 --enable=all --inconclusive --inline-suppr --template="{file}:{line}:{id}{inconclusive: INCONCLUSIVE} {message}" --includes-file=includes.txt --suppressions-list=suppressions.txt --output-file=errors_full.txt --max-ctu-depth=3 --check-level=exhaustive --checkers-report=checkers_report.txt
findstr /V /C:"external\src" errors_full.txt > errors_filtered0.txt
findstr /V /C:":checkersReport" errors_filtered0.txt > errors_filtered.txt
+1
View File
@@ -2,3 +2,4 @@ unmatchedSuppression
missingIncludeSystem
unusedFunction
useStlAlgorithm
funcArgNamesDifferentUnnamed
+2 -1
View File
@@ -33,7 +33,7 @@ docker compose up
```
#### Optional
* Open ports 18080 (Monero p2p port) and 37889 (P2Pool p2p port) or 37888 (P2Pool-mini p2p port) in your firewall to ensure better connectivity. If you're mining from a computer behind NAT (like a router) you could consider forwarding the ports to your local machine
* Open ports 18080 (Monero p2p port) and 37889/37888/37890 (P2Pool default/mini/nano p2p port) in your firewall to ensure better connectivity. If you're mining from a computer behind NAT (like a router) you could consider forwarding the ports to your local machine
* An XMRig CPU miner is included by default, but you can connect additional miners to this same p2pool node using port 3333 (or alternate if configured) when you set it as "exposed" in the configuration
* Configure your kernel for maximum mining performance: [XMRig RandomX Optimization Guide](https://xmrig.com/docs/miner/randomx-optimization-guide)
* Many optional configurations and customizations are available by running './configure'
@@ -54,4 +54,5 @@ Change to p2pool/docker-compose directory <br />
Stop and remove all containers: ```docker compose down``` <br />
Remove the p2pool data: ```docker volume rm p2pool``` <br />
Remove the p2pool-mini data: ```docker volume rm p2pool-mini``` <br />
Remove the p2pool-nano data: ```docker volume rm p2pool-nano``` <br />
Remove the monero data: ```docker volume rm monero```
+4 -3
View File
@@ -37,7 +37,8 @@ class P2PoolHelpBox(HelpBoxBase):
"P2Pool Sidechain:": [
"Which P2Pool sidechain to mine on",
" use main for faster miners",
" use mini for slower miners",
" use mini for slow miners (>30kH/s)",
" use nano for slower miners (<30kH/s)",
],
"Enable Server Statistics": [
"Provide access to your P2Pool server statictics via a web interface",
@@ -364,7 +365,7 @@ class P2PoolConfigForm(ConfigFormBase):
self.sidechain = self.add(
npyscreen.TitleSelectOne,
name="P2Pool Sidechain:",
values=["main", "mini"],
values=["main", "mini", "nano"],
scroll_exit=True,
max_height=2,
value=[
@@ -611,7 +612,7 @@ class MoneroConfigForm(ConfigFormBase):
self.sync_pruned_blocks = self.add(
npyscreen.Checkbox,
name="Sync Pruned Blocks",
value=False,
value=True,
begin_entry_at=self.name_size,
relx=self.indent,
)
+1 -1
View File
@@ -21,7 +21,7 @@
"limit_data_rates": false,
"rate_limit_up": "2048",
"rate_limit_down": "8192",
"sync_pruned_blocks": false,
"sync_pruned_blocks": true,
"fast_sync": true,
"monero_options": "",
"public_monero_node": "",
+8 -4
View File
@@ -7,10 +7,12 @@ networks:
volumes:
p2pool:
{% if sidechain[0] == 0 %}
name: p2pool
{% else %}
{% if sidechain[0] == 1 %}
name: p2pool-mini
{% elif sidechain[0] == 2 %}
name: p2pool-nano
{% else %}
name: p2pool
{% endif %}
{% if configure_monero == True %}
@@ -55,6 +57,8 @@ services:
--loglevel {{ p2pool_log_level | int }}
{% if sidechain[0] == 1 %}
--mini
{% elif sidechain[0] == 2 %}
--nano
{% endif %}
{% if enable_autodiff == False %}
--no-autodiff
@@ -118,7 +122,7 @@ services:
restart: unless-stopped
command: >-
--zmq-pub tcp://0.0.0.0:18083
--disable-dns-checkpoints
--enforce-dns-checkpointing
--enable-dns-blocklist
--out-peers 16
--in-peers 32
+1 -1
View File
@@ -23,7 +23,7 @@
"limit_data_rates": false,
"rate_limit_up": "2048",
"rate_limit_down": "8192",
"sync_pruned_blocks": false,
"sync_pruned_blocks": true,
"fast_sync": true,
"monero_options": "",
"public_monero_node": "",
+3 -1
View File
@@ -94,7 +94,7 @@ services:
restart: unless-stopped
command: >-
--zmq-pub tcp://0.0.0.0:18083
--disable-dns-checkpoints
--enforce-dns-checkpointing
--enable-dns-blocklist
--out-peers 16
--in-peers 32
@@ -111,6 +111,8 @@ services:
--prune-blockchain
--sync-pruned-blocks
+26 -9
View File
@@ -4,9 +4,11 @@
FROM ubuntu:22.04 as builder
ARG MONERO_GIT_TAG="latest"
RUN set -e && \
apt-get update -q -y --no-install-recommends && \
SHELL ["/bin/bash", "-euxo", "pipefail", "-c"]
RUN apt-get update -q -y --no-install-recommends && \
DEBIAN_FRONTEND="noninteractive" apt-get install -q -y --no-install-recommends \
autoconf \
automake \
autotools-dev \
bsdmainutils \
@@ -15,32 +17,47 @@ RUN set -e && \
ccache \
cmake \
curl \
doxygen \
git \
libtool \
graphviz \
libtool libssl-dev libzmq3-dev libunbound-dev libsodium-dev libunwind8-dev liblzma-dev libreadline6-dev libexpat1-dev \
qttools5-dev-tools libhidapi-dev libusb-1.0-0-dev libprotobuf-dev protobuf-compiler libudev-dev libboost-chrono-dev libboost-date-time-dev \
libboost-filesystem-dev libboost-locale-dev libboost-program-options-dev libboost-regex-dev libboost-serialization-dev libboost-system-dev libboost-thread-dev \
pkg-config \
python3 \
gperf
WORKDIR /src
RUN git clone --recursive https://github.com/monero-project/monero && \
RUN git clone --recursive --branch release-v0.18 https://github.com/monero-project/monero && \
cd monero && \
if [ "x$MONERO_GIT_TAG" = "xlatest" ]; then MONERO_GIT_TAG=$(git describe --tags $(git rev-list --tags --max-count=1)); fi && \
git checkout $MONERO_GIT_TAG && \
git submodule sync && git submodule update --init --force --recursive && \
make -j$(nproc) depends target=$(contrib/depends/config.guess)
curl -L -O https://p2pool.io/checkpoints/checkpoints.dat && \
curl -L -O https://p2pool.io/checkpoints/checkpoints.patch && \
git apply checkpoints.patch && \
cp -f checkpoints.dat src/blocks && \
make -j$(nproc)
# ---
# runtime stage
FROM ubuntu:22.04
COPY --from=0 /src/monero/build/*/release/bin /usr/local/bin/
COPY --from=0 /src/monero/build/Linux/*/release/bin /usr/local/bin/
RUN set -e && \
apt-get update -q -y --no-install-recommends && \
SHELL ["/bin/bash", "-euxo", "pipefail", "-c"]
RUN apt-get update -q -y --no-install-recommends && \
DEBIAN_FRONTEND="noninteractive" apt-get install -q -y --no-install-recommends \
ca-certificates \
netcat \
libboost-chrono-dev libboost-filesystem-dev libboost-program-options-dev libboost-regex-dev libboost-thread-dev \
libzmq5 \
libreadline8 \
libhidapi-libusb0 \
libunbound8 \
&& \
apt-get clean && \
rm -rf /var/lib/apt
+3 -2
View File
@@ -27,8 +27,9 @@ COPY --from=0 /usr/src/xmrig/build/xmrig /
RUN set -e && \
apt-get update -q -y --no-install-recommends && \
DEBIAN_FRONTEND="noninteractive" apt-get install -q -y --no-install-recommends \
libssl1.1 \
libcrypto++6 \
libuv1 \
libssl3 \
libcrypto++8 \
libhwloc15 \
&& \
apt-get clean
+45 -3
View File
@@ -1,7 +1,8 @@
### P2Pool command line options
```
--wallet Wallet address to mine to. Subaddresses and integrated addresses are not supported!
--wallet Main wallet address (the one that starts with 4...). To mine to a subaddress of this wallet, use it together with --subaddress
--subaddress Subaddress to mine to. It must belong to the same wallet that was specified with --wallet parameter
--host IP address of your Monero node, default is 127.0.0.1
--rpc-port monerod RPC API port number, default is 18081
--zmq-port monerod ZMQ pub port number, default is 18083 (same port as in monerod's "--zmq-pub" command line parameter)
@@ -12,6 +13,10 @@
--light-mode Don't allocate RandomX dataset, saves 2GB of RAM
--loglevel Verbosity of the log, integer number between 0 and 6
--data-dir Path to store general p2pool files (log, cache, peer data, etc.), default is current directory
--log-file Path to the log file, default is "p2pool.log" in p2pool's working directory
--no-console-log Disable logging to the console
--no-log-file Disable logging to the file
--disable-log Equivalent to --no-console-log --no-log-file, disables logging entirely and saves ~8 MB of memory
--sidechain-config Name of the p2pool sidechain parameters file (only use it if you run your own sidechain)
--data-api Path to the p2pool JSON data (use it in tandem with an external web-server). Not affected by --data-dir setting!
--local-api Enable /local/ path in api path for Stratum Server and built-in miner statistics
@@ -22,11 +27,12 @@
--out-peers N Maximum number of outgoing connections for p2p server (any value between 10 and 450)
--in-peers N Maximum number of incoming connections for p2p server (any value between 10 and 450)
--start-mining N Start built-in miner using N threads (any value between 1 and 64)
--mini Connect to p2pool-mini sidechain. Note that it will also change default p2p port from 37889 to 37888
--nano Connect to p2pool-nano sidechain. Note that it will also change default p2p port from 37889 to 37890
--mini Connect to p2pool-mini sidechain. Note that it will also change default p2p port from 37889 to 37888. Cannot be used with --nano.
--nano Connect to p2pool-nano sidechain. Note that it will also change default p2p port from 37889 to 37890. Cannot be used with --mini.
--no-autodiff Disable automatic difficulty adjustment for miners connected to stratum (WARNING: incompatible with Nicehash and MRR)
--rpc-login Specify username[:password] required for Monero RPC server
--socks5 Specify IP:port of a SOCKS5 proxy to use for outgoing connections
--socks5-proxy-type The type of SOCKS5 proxy. Can be one of the following values: auto, plain, tor. Default is auto (auto-detect by the port number)
--no-dns Disable DNS queries, use only IP addresses to connect to peers (seed node DNS will be unavailable too)
--p2p-external-port Port number that your router uses for mapping to your local p2p port. Use it if you are behind a NAT and still want to accept incoming connections
--no-upnp Disable UPnP port forwarding
@@ -38,7 +44,13 @@
--tls-cert-key file Load TLS certificate private key from "file" in the PEM format
--rpc-ssl Enable SSL on RPC connections to the Monero node
--rpc-ssl-fingerprint base64-encoded fingerprint of the Monero node's certificate (optional, use it for certificate pinning)
--stratum-proxy-protocol Enable HAProxy PROXY protocol v2 for incoming Stratum connections (use with HAProxy send-proxy-v2)
--p2p-proxy-protocol Enable HAProxy PROXY protocol v2 for incoming P2P connections (use with HAProxy send-proxy-v2)
--no-stratum-http Disable HTTP on Stratum ports
--full-validation Enables full share validation / increases CPU usage
--onion-address Tell other peers to use this .onion address to connect to this node through TOR
--no-clearnet-p2p Forces P2P server to listen on 127.0.0.1 and to not connect to clearnet IPs
--params-file File name to load parameters from. It can't be used together with any other command line parameters
```
### Example command line
@@ -47,6 +59,28 @@
p2pool.exe --host 127.0.0.1 --rpc-port 18081 --zmq-port 18083 --wallet YOUR_WALLET_ADDRESS --stratum 0.0.0.0:3333 --p2p 0.0.0.0:37889
```
### Example command line (params file)
```
p2pool.exe --params-file params.conf
```
params.conf
```
# IP of your node
host = 127.0.0.1
wallet = YOUR_WALLET_ADDRESS
data-api = "/path/to/api/folder" # use quotes if you have spaces in the path
loglevel = 4
mini = 1
```
### Example command line (mining to a subaddress)
```
p2pool.exe --host 127.0.0.1 --wallet WALLET_MAIN_ADDRESS --subaddress SUBADDRESS_FROM_THE_SAME_WALLET
```
### Multiple backup hosts
You can have multiple hosts in command line. If P2Pool detects that the host it's currently using is down or stuck, it will cycle through hosts until it finds a working one. It will not switch back as long as the current host it found is working.
@@ -116,3 +150,11 @@ openssl x509 -in rpc_ssl.crt -pubkey -noout -inform pem | openssl pkey -pubin -o
```
By default, `rpc_ssl.crt` can be found in Monero data directory: `/home/username/.bitmonero/rpc_ssl.crt` on Linux and `C:\ProgramData\bitmonero\rpc_ssl.crt` on Windows.
### Full validation
`--full-validation` is a boolean flag and will set the value to true; by default it is false to reduce CPU usage
Enable this if untrusted sources can submit shares to your p2pool server and you want to verify the validity of the shares PoW. Increases CPU usage.
This option is for shared mining services, and not neccessary in local setups.
+45
View File
@@ -0,0 +1,45 @@
## Running P2Pool with I2P
P2Pool has several command-line options that should be used for I2P setup:
- `--socks5 IP:port` to specify your I2P SOCKS proxy address (usually `127.0.0.1:4447` if you are using i2pd or followed the guide below)
- `--socks5-proxy-type i2p` to specify the type of SOCKS5 proxy being used
- `--no-dns` to disable all DNS queries and prevent DNS leaks. P2Pool only ever makes DNS requests to get a list of seed nodes, to resolve your Monero node's domain (if it's not set as an IP address), and to resolve manually added peers
- `--no-upnp` to disable UPnP requests (they are sent to your router, so use this option if you are not on your home network)
- `--i2p-address` your hidden service's `.b32.i2p` address (without port number). This address will be broadcast to other peers when you mine a share in P2Pool. This is to prevent address spamming - you have to mine a real share to be able to broadcast your I2P address.
- **Attention: this also links the I2P address with the Monero wallet you use for mining. Create a new I2P address when mining through I2P, don't use your existing addresses to avoid metadata leaks.**
- `--no-clearnet-p2p` to never connect to clearnet P2Pool nodes.
## Setting up I2P tunnels for P2Pool (i2pd on Linux)
Follow [these instructions](https://docs.i2pd.website/en/latest/user-guide/install/) to install i2pd on your system.
First, ensure the SOCKS proxy tunnel is enabled (as it should be by default). See [here](https://docs.i2pd.website/en/latest/user-guide/configuration/) for more information.
You will need to modify some lines in the `tunnels.conf` file, usually located in `/var/lib/i2pd/tunnels.conf` on Linux.
Add a server tunnel to allow inbound connections from peers and use port number 37888 for p2pool-mini, 37890 for p2pool-nano:
```ini
[p2pool]
type = server
host = 127.0.0.1
port = 37889
keys = p2pool.dat
```
This will create a hidden service key in `/var/lib/i2pd/p2pool.dat`; you may want to back this up.
Please note that you **must** use the port number shown above in order for other peers to be able to find you.
Restart i2pd:
```bash
sudo systemctl restart i2pd.service
```
Get the hostname of your hidden service:
```bash
curl -s http://127.0.0.1:7070/?page=i2p_tunnels | grep -Eo "[a-zA-Z0-9./?=_%:-]*" | grep "37889"
```
The resulting `.b32.i2p` address should then be used for the `--i2p-address` command-line parameter.
## Command line example
```bash
./p2pool --host MONERO_NODE_IP --wallet YOUR_WALLET --socks5 127.0.0.1:4447 --socks5-proxy-type i2p --no-dns --no-upnp --i2p-address YOUR_I2P_ADDRESS
```
+32
View File
@@ -0,0 +1,32 @@
## Running P2Pool with TOR
P2Pool has several command-line options that should be used for TOR setup:
- `--socks5 IP:port` to specify your TOR proxy address (usually `127.0.0.1:9050` if you installed TOR on the same PC)
- `--socks5-proxy-type tor` to specify the type of SOCKS5 proxy being used
- `--no-dns` to disable all DNS queries and prevent DNS leaks. P2Pool only ever makes DNS requests to get a list of seed nodes, to resolve your Monero node's domain (if it's not set as an IP address), and to resolve manually added peers
- `--no-upnp` to disable UPnP requests (they are sent to your router, so use this option if you are not on your home network)
- `--onion-address` your hidden service's address (without port number). This address will be broadcast to other peers when you mine a share in P2Pool. This is to prevent address spamming - you have to mine a real share to be able to broadcast your TOR address.
- **Attention: this also links the onion address with the Monero wallet you use for mining. Create a new onion address when mining through TOR, don't use your existing onion addresses to avoid meta-data leaks.**
- `--no-clearnet-p2p` to never connect to clearnet P2Pool nodes. This also makes sure that your P2Pool traffic doesn't exit the TOR network (and is not seen/modified by the exit nodes)
## Setting up a hidden service for P2Pool (Linux)
- Add these lines to your TOR config in `/etc/tor/torrc`:
```
HiddenServiceDir /var/lib/tor/p2pool/
HiddenServicePort 28722 127.0.0.1:37889
```
Note that you must use port 28722 as the hidden service's port because this is what other peers will use when trying to connect to you. The internal port (37889) should be your actual P2Pool listening port (37889 for P2Pool-main, 37888 for P2Pool-mini, 37890 for P2Pool-nano)
- Restart the TOR service:
```
sudo systemctl restart tor.service
```
- If there were no errors, you should now have the `/var/lib/tor/p2pool` directory with a `hostname` file in it. This file will contain your onion address
- Use this address in P2Pool's command line: `--onion-address ADDRESS_FROM_HOSTNAME_FILE`
- It is strongly recommended to create a new onion address for mining (see `--onion-address` remarks). This guide ensures you will be using a new onion address, assuming that you don't already have a hidden service named `p2pool`.
## Command line example
```
./p2pool --host MONERO_NODE_IP --wallet YOUR_WALLET --socks5 127.0.0.1:9050 --socks5-proxy-type tor --no-dns --no-upnp --onion-address ADDRESS_FROM_HOSTNAME_FILE
```
+7 -7
View File
@@ -239,16 +239,15 @@ Wallets with confirmed P2Pool support<br>
<li><a href="https://play.google.com/store/apps/details?id=com.m2049r.xmrwallet" target="_blank">Monerujo v3.0.2 "Fluorine Fermi"</a> and newer
<li><a href="https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet" target="_blank">Cake Wallet v4.4.5</a> and newer
<li><a href="https://featherwallet.org/" target="_blank">Feather Wallet v2.1.0</a> and newer
<li><a href="https://mymonero.com/" target="_blank">MyMonero</a>
</ul>
It's highly recommended to create a new wallet for mining because wallet addresses are public on p2pool. You have to use the primary wallet address for mining. Subaddresses and integrated addresses are not supported, just like with monerod solo mining.
It's highly recommended to create a new wallet for mining because wallet addresses are public on p2pool. You can mine to a primary wallet address (the one starting with `4`) for mining. If you want to mine to a subaddress, you will need to provide both the main address (starting with 4) and the subaddress (starting with 8) using "--wallet" and "--subaddress" command line parameters.
</details>
<details><summary>Setup Monero node</summary>
<ul>
<li>Download the latest Monero <a href="https://www.getmonero.org/downloads/" target="_blank">release</a>
<li>[Optional] Open port <span>18080</span> (Monero p2p port) in your firewall to ensure better connectivity
<li>Run <span>./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --disable-dns-checkpoints --enable-dns-blocklist</span>
<li>Run <span>./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --enforce-dns-checkpointing --enable-dns-blocklist</span>
<li>If your network connection's upload bandwidth is less than 10 Mbit, use <span>--out-peers 8 --in-peers 16</span> instead.
<li>Wait until it's fully synchronized. If you didn't run Monero node before, it can take up to several days to synchronize (5-6 hours on a modern PC with fast SSD and fast Internet connection). You can add <span>--prune-blockchain</span> argument to the command line to run a pruned node (3-4 times less disk usage)
</ul></details>
@@ -256,7 +255,7 @@ It's highly recommended to create a new wallet for mining because wallet address
<details><summary>Setup P2Pool node</summary>
<ul>
<li>Download the latest P2Pool <a href="https://github.com/SChernykh/p2pool/releases/latest" target="_blank">release</a>
<li>[Optional] Open port <span>37889</span> (P2Pool port) or <span>37888</span> (P2Pool mini port) in your firewall to ensure better connectivity
<li>[Optional] Open port <span>37889</span> (P2Pool p2p port) in your firewall to ensure better connectivity
<li>Run <span>./p2pool --host 127.0.0.1 --wallet YOUR_WALLET_ADDRESS</span>
<li>It should take no more than 5-10 minutes to synchronize
</ul></details>
@@ -274,6 +273,7 @@ It's highly recommended to create a new wallet for mining because wallet address
<ul>
<li>You can enter your wallet address at <a href="https://p2pool.observer/" target="_blank">P2Pool Observer</a>
<li>P2Pool Observer for P2Pool mini can be found <a href="https://mini.p2pool.observer/" target="_blank">here</a>
<li>P2Pool Observer for P2Pool nano can be found <a href="https://nano.p2pool.observer/" target="_blank">here</a>
<li>You will find your wallet's statistics there only after you've mined at least 1 P2Pool share
</ul>
</details>
@@ -300,11 +300,11 @@ P2Pool is a decentralized community, there is no dedicated support. You can reac
<li><span style="font-size:2rem;color:#e09000;">I have been mining for several hours and still got no rewards?</span>
<ul><li>P2Pool doesn't work exactly like regular pools - there's no "pending balance" here. You need to find a pool share first and then wait for P2Pool to find a Monero block. You'll get a payout to your XMR wallet as soon as a block is found and you have shares in PPLNS window. It can take several days to a week to find a share if your hashrate is low. Type "status" command in P2Pool console or visit <a href="https://p2pool.observer/" target="_blank">P2Pool observer</a> to check your progress.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I am mining but I can't find any shares</span>
<ul><li>First check for any warnings and errors in P2Pool console and logs. If everything works fine, you can check the <a href="https://p2pool.observer/calculate-share-time" target="_blank">average share time calculator</a> to get an idea how often you should find a share with your hashrate. If this time is more than 1 day, it's recommended to switch to P2Pool mini by adding <span style="color:#808080;">--mini</span> to P2Pool command line.</ul><br>
<ul><li>First check for any warnings and errors in P2Pool console and logs. If everything works fine, you can check the <a href="https://p2pool.observer/calculate-share-time" target="_blank">average share time calculator</a> to get an idea how often you should find a share with your hashrate. If this time is more than 1 day, it's recommended to switch to either P2Pool mini or nano by adding <span style="color:#808080;">--mini</span> or <span style="color:#808080;">--nano</span> to P2Pool command line.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I get an error "monerod RPC ... is incompatible, update to RPC >= v3.8"</span>
<ul><li>Use monerod v0.18.0.0 or newer</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I get warnings "peer ... is ahead on mainchain (height ..., your height ...). Is your monerod stuck or lagging?"</span>
<ul><li>Make sure you add these arguments to monerod command line: <span style="color:#808080;">--zmq-pub tcp://127.0.0.1:18083 --disable-dns-checkpoints --enable-dns-blocklist</span></ul><br>
<ul><li>Make sure you add these arguments to monerod command line: <span style="color:#808080;">--zmq-pub tcp://127.0.0.1:18083 --enforce-dns-checkpointing --enable-dns-blocklist</span></ul><br>
</ul>
</td></tr></table>
<br><br>
@@ -314,4 +314,4 @@ Donate to support the project:<br><span style="font-size:0.9rem;color:#b0b0b0;">
&nbsp;
</div>
</body>
</html>
</html>
+7 -7
View File
@@ -239,16 +239,15 @@ Wallets with confirmed P2Pool support<br>
<li><a href="https://play.google.com/store/apps/details?id=com.m2049r.xmrwallet" target="_blank">Monerujo v3.0.2 "Fluorine Fermi"</a> and newer
<li><a href="https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet" target="_blank">Cake Wallet v4.4.5</a> and newer
<li><a href="https://featherwallet.org/" target="_blank">Feather Wallet v2.1.0</a> and newer
<li><a href="https://mymonero.com/" target="_blank">MyMonero</a>
</ul>
It's highly recommended to create a new wallet for mining because wallet addresses are public on p2pool. You have to use the primary wallet address for mining. Subaddresses and integrated addresses are not supported, just like with monerod solo mining.
It's highly recommended to create a new wallet for mining because wallet addresses are public on p2pool. You can mine to a primary wallet address (the one starting with `4`) for mining. If you want to mine to a subaddress, you will need to provide both the main address (starting with 4) and the subaddress (starting with 8) using "--wallet" and "--subaddress" command line parameters.
</details>
<details><summary>Setup Monero node</summary>
<ul>
<li>Download the latest Monero <a href="https://www.getmonero.org/downloads/" target="_blank">release</a>
<li>[Optional] Open port <span>18080</span> (Monero p2p port) in your firewall to ensure better connectivity
<li>Run <span>./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --disable-dns-checkpoints --enable-dns-blocklist</span>
<li>Run <span>./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --enforce-dns-checkpointing --enable-dns-blocklist</span>
<li>If your network connection's upload bandwidth is less than 10 Mbit, use <span>--out-peers 8 --in-peers 16</span> instead.
<li>Wait until it's fully synchronized. If you didn't run Monero node before, it can take up to several days to synchronize (5-6 hours on a modern PC with fast SSD and fast Internet connection). You can add <span>--prune-blockchain</span> argument to the command line to run a pruned node (3-4 times less disk usage)
</ul></details>
@@ -256,7 +255,7 @@ It's highly recommended to create a new wallet for mining because wallet address
<details><summary>Setup P2Pool node</summary>
<ul>
<li>Download the latest P2Pool <a href="https://github.com/SChernykh/p2pool/releases/latest" target="_blank">release</a>
<li>[Optional] Open port <span>37889</span> (P2Pool port) or <span>37888</span> (P2Pool mini port) in your firewall to ensure better connectivity
<li>[Optional] Open port <span>37888</span> (P2Pool mini p2p port) in your firewall to ensure better connectivity
<li>Run <span>./p2pool --host 127.0.0.1 --wallet YOUR_WALLET_ADDRESS --mini</span>
<li>It should take no more than 5-10 minutes to synchronize
</ul></details>
@@ -274,6 +273,7 @@ It's highly recommended to create a new wallet for mining because wallet address
<ul>
<li>You can enter your wallet address at <a href="https://p2pool.observer/" target="_blank">P2Pool Observer</a>
<li>P2Pool Observer for P2Pool mini can be found <a href="https://mini.p2pool.observer/" target="_blank">here</a>
<li>P2Pool Observer for P2Pool nano can be found <a href="https://nano.p2pool.observer/" target="_blank">here</a>
<li>You will find your wallet's statistics there only after you've mined at least 1 P2Pool share
</ul>
</details>
@@ -300,11 +300,11 @@ P2Pool is a decentralized community, there is no dedicated support. You can reac
<li><span style="font-size:2rem;color:#e09000;">I have been mining for several hours and still got no rewards?</span>
<ul><li>P2Pool doesn't work exactly like regular pools - there's no "pending balance" here. You need to find a pool share first and then wait for P2Pool to find a Monero block. You'll get a payout to your XMR wallet as soon as a block is found and you have shares in PPLNS window. It can take several days to a week to find a share if your hashrate is low. Type "status" command in P2Pool console or visit <a href="https://mini.p2pool.observer/" target="_blank">P2Pool observer</a> to check your progress.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I am mining but I can't find any shares</span>
<ul><li>First check for any warnings and errors in P2Pool console and logs. If everything works fine, you can check the <a href="https://p2pool.observer/calculate-share-time" target="_blank">average share time calculator</a> to get an idea how often you should find a share with your hashrate. If this time is more than 1 day, it's recommended to switch to P2Pool mini by adding <span style="color:#808080;">--mini</span> to P2Pool command line.</ul><br>
<ul><li>First check for any warnings and errors in P2Pool console and logs. If everything works fine, you can check the <a href="https://p2pool.observer/calculate-share-time" target="_blank">average share time calculator</a> to get an idea how often you should find a share with your hashrate. If this time is more than 1 day, it's recommended to switch to P2Pool mini or nano by adding <span style="color:#808080;">--mini</span> or <span style="color:#808080;">--nano</span> to P2Pool command line.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I get an error "monerod RPC ... is incompatible, update to RPC >= v3.8"</span>
<ul><li>Use monerod v0.18.0.0 or newer</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I get warnings "peer ... is ahead on mainchain (height ..., your height ...). Is your monerod stuck or lagging?"</span>
<ul><li>Make sure you add these arguments to monerod command line: <span style="color:#808080;">--zmq-pub tcp://127.0.0.1:18083 --disable-dns-checkpoints --enable-dns-blocklist</span></ul><br>
<ul><li>Make sure you add these arguments to monerod command line: <span style="color:#808080;">--zmq-pub tcp://127.0.0.1:18083 --enforce-dns-checkpointing --enable-dns-blocklist</span></ul><br>
</ul>
</td></tr></table>
<br><br>
@@ -314,4 +314,4 @@ Donate to support the project:<br><span style="font-size:0.9rem;color:#b0b0b0;">
&nbsp;
</div>
</body>
</html>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

+320
View File
@@ -0,0 +1,320 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>P2Pool nano - Decentralized Monero mining pool</title>
<link rel="shortcut icon" type="image/png" href="favicon-32x32.png"/>
<meta name="viewport" content="width=device-width, initial-scale=0.5">
<style>
a {
color: #e09000;
-ms-touch-action: none;
touch-action: none;
}
a:visited {
color: #808080;
-ms-touch-action: none;
touch-action: none;
}
body {
background-color: #383838;
color: #e0e0e0;
font-family: Arial, sans-serif;
font-size: 1.5rem;
}
table {
color: #c0c0c0;
border-spacing:15px 5px;
font-size: 1.5rem;
}
table.menu_page {
width: 100%;
margin-left: auto;
margin-right: auto;
}
details > summary {
padding: 0.25rem;
font-size: 2.5rem;
-ms-touch-action: none;
touch-action: none;
}
details > ul > li > span {
color: #e09000;
}
</style>
<script>
function elapsedTimeStr(ts1, ts2, short_form) {
let s = ts2 - ts1;
if (s < 0) s = 0;
let m = Math.floor(s / 60) % 60;
let h = Math.floor(s / 3600) % 24;
let d = Math.floor(s / 86400);
if (short_form) {
if (s >= 86400) return d + 'd';
if (s >= 3600) return h + 'h';
return m + 'm';
}
else {
let result = m + 'm';
if (s >= 3600) result = h + 'h ' + result;
if (s >= 86400) result = d + 'd ' + h + 'h';
return result;
}
}
function set_effort(el, value) {
el.innerHTML = value.toFixed(2) + '%';
el.style = (value < 100.0) ? "color:#00C000;" : (value < 200.0) ? "color:#E0E000;" : "color:#FF0000;";
}
async function load_data() {
init_menu();
window.onresize = init_menu;
let pool_stats_req = await fetch('api/pool/stats');
let pool_blocks_req = await fetch('api/pool/blocks');
let network_stats_req = await fetch('api/network/stats');
let latest_release_req = await fetch('api/latest_release');
let pool_stats = JSON.parse(await pool_stats_req.text());
let pool_blocks = JSON.parse(await pool_blocks_req.text());
let network_stats = JSON.parse(await network_stats_req.text());
let latest_release = JSON.parse(await latest_release_req.text());
let pool_hashrate = pool_stats.pool_statistics.hashRate / 1e6;
let pplns_duration = pool_stats.pool_statistics.pplnsWeight / pool_stats.pool_statistics.hashRate;
let min_payout = 0.6 * pool_stats.pool_statistics.sidechainDifficulty / pool_stats.pool_statistics.pplnsWeight;
document.getElementById("pool_hashrate").innerHTML = pool_hashrate.toFixed(3) + ' MH/s';
document.getElementById("pplns_duration").innerHTML = elapsedTimeStr(0, pplns_duration, 0) + ' ' + Math.floor(pplns_duration % 60) + 's';
document.getElementById("pool_miners").innerHTML = pool_stats.pool_statistics.miners;
document.getElementById("min_payout").innerHTML = min_payout.toFixed(5) + ' XMR';
document.getElementById("latest_release").innerHTML = '<a href="' + latest_release.html_url + '" target="_blank">' + latest_release.name + '</a>';
let ts = Math.floor(Date.now() / 1000);
let n = pool_stats.pool_statistics.lastBlockFound;
document.getElementById("pool_last_block").innerHTML = n ? ('<a href="/explorer/block/' + n + '" target="_blank">' + n + '</a> (' + elapsedTimeStr(pool_stats.pool_statistics.lastBlockFoundTime, ts, 0) + ' ago)') : 'N/A';
document.getElementById("pool_total_blocks").innerHTML = pool_stats.pool_statistics.totalBlocksFound;
let t = document.getElementById('menu_blocks');
let cur_effort = (pool_stats.pool_statistics.totalHashes - ((pool_blocks.length > 0) ? pool_blocks[0].totalHashes : 0)) * 100.0 / network_stats.difficulty;
set_effort(document.getElementById("current_effort"), (cur_effort >= 0) ? cur_effort : 0);
let total_effort = 0.0;
let num_blocks_with_effort = 0;
for (let i = 0, m = Math.min(pool_blocks.length, 50); i < m; ++i) {
if (t.rows.length <= i + 1) t.insertRow(-1);
let row = t.rows[i + 1];
while (row.cells.length < 3) row.insertCell(-1);
let height = row.cells[0];
let effort = row.cells[1];
let age = row.cells[2];
n = pool_blocks[i].height;
height.innerHTML = '<a href="/explorer/block/' + pool_blocks[i].hash + '" target="_blank">' + n + '</a>';
let value = 0.0;
if ((i + 1 < pool_blocks.length) && (pool_blocks[i + 1].totalHashes > 0)) {
value = (pool_blocks[i].totalHashes - pool_blocks[i + 1].totalHashes) * 100.0 / pool_blocks[i].difficulty;
}
else {
value = pool_blocks[i].totalHashes * 100.0 / pool_blocks[i].difficulty;
}
total_effort += value;
++num_blocks_with_effort;
set_effort(effort, value);
age.innerHTML = elapsedTimeStr(pool_blocks[i].ts, ts, 1);
}
if (num_blocks_with_effort > 0) {
let average_effort = total_effort / num_blocks_with_effort;
set_effort(document.getElementById("average_effort"), average_effort);
}
let network_hashrate = network_stats.difficulty / 120e6;
document.getElementById("monero_hashrate").innerHTML = network_hashrate.toFixed(3) + ' MH/s';
document.getElementById("monero_last_block").innerHTML = network_stats.height + ' (' + elapsedTimeStr(network_stats.timestamp, ts, 0) + ' ago)';
}
const menu = ['pool', 'blocks', 'help', 'faq'];
function init_menu()
{
let is_mobile = false;
if (navigator.userAgentData) {
is_mobile = navigator.userAgentData.mobile;
}
else {
const mobile_preg = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i;
is_mobile = mobile_preg.test(navigator.userAgent) || mobile_preg.test(navigator.platform);
}
let e = document.getElementById('main_menu');
if (!is_mobile) {
e.style.cursor = "pointer";
document.querySelectorAll("details > summary").forEach(el => { el.style.cursor = "pointer"; });
}
e.style.width = (window.innerWidth > 1600) ? "1600px" : "100%";
menu.forEach(element => {
let e2 = document.getElementById('menu_' + element);
e2.style.width = e.style.width;
});
}
function toggle_menu(name) {
if (!name) {
name = 'pool';
}
menu.forEach(element => {
let e = document.getElementById('menu_' + element);
let b = document.getElementById('button_' + element);
if (element == name) {
e.style.display = 'block';
b.style.backgroundColor = '#646464';
window.location.hash = '#' + name;
}
else {
e.style.display = 'none';
b.style.backgroundColor = '#404040';
}
});
}
</script>
</head>
<body onload="load_data();setInterval(load_data, 2000);toggle_menu(window.location.hash.substr(1));">
<div style="font-size:3rem;text-align:center;">P2Pool nano</div><div style="font-size:1.1rem;text-align:center;">Decentralized Monero mining pool</div>
<div style="font-size:1rem;text-align:center;">Latest release: <span id="latest_release"><a href="https://github.com/SChernykh/p2pool/releases/latest" target="_blank">P2Pool</a></span></div>
<br>
<table id="main_menu" style="width:100%;margin-left:auto;margin-right:auto;table-layout:fixed;text-align:center;-ms-touch-action:none;touch-action:none;"><tr>
<td onclick="toggle_menu('pool')" id="button_pool">Pool</td>
<td onclick="toggle_menu('blocks')" id="button_blocks">Blocks</td>
<td onclick="toggle_menu('help')" id="button_help">Get started</td>
<td onclick="toggle_menu('faq')" id="button_faq">FAQ</td>
</tr></table>
<br>
<table id="menu_pool" class="menu_page">
<tr><td></td><td style="width:17rem;">Pool</td><td>Network</td></tr>
<tr><td style="padding-bottom: 1rem;"></td><td></td><td></td></tr>
<tr><td>Hashrate</td><td><span id="pool_hashrate">N/A</span></td><td><span id="monero_hashrate">N/A</span></td></tr>
<tr><td>Miners</td><td><span id="pool_miners">N/A</span></td><td></td></tr>
<tr><td>PPLNS window</td><td><span id="pplns_duration">N/A</span></td><td></td></tr>
<tr><td>Last block</td><td><span id="pool_last_block">N/A</span></td><td><span id="monero_last_block">N/A</span></td></tr>
<tr><td>Total blocks</td><td><span id="pool_total_blocks">N/A</span></td><td></td></tr>
<tr><td>Current effort</td><td><span id="current_effort">N/A</span></td><td></td></tr>
<tr><td>Average effort<br><div style="text-align:center;font-size:0.9rem">last 50 blocks</div></td><td><span id="average_effort">N/A</span></td><td></td></tr>
<tr><td>&nbsp;</td><td></td><td></td></tr>
<tr><td>Fee</td><td>0%</td><td></td></tr>
<tr><td>Min payout</td><td><span id="min_payout">0.00027 XMR</span></td><td></td></tr>
<tr><td>Payout scheme</td><td><a href="https://en.wikipedia.org/wiki/Mining_pool#Pay-per-last-N-shares" target="_blank">PPLNS</a></td><td></td></tr>
<tr><td>&nbsp;</td><td></td><td></td></tr>
<tr><td>Statistics</td><td><a href="https://nano.p2pool.observer/" target="_blank">P2Pool observer</a></td><td></td></tr>
</table>
<table id="menu_blocks" class="menu_page">
<tr><td style="padding-right:5rem;">Height</td><td style="padding-right:5rem;">Effort</td><td>Age</td></tr>
</table>
<table id="menu_help" class="menu_page"><tr><td>
<details><summary>P2Pool video guide</summary>
<ul>
<li>A detailed <a href="https://www.youtube.com/watch?v=NbxbRu-2GWI" target="_blank">video guide</a> to install P2Pool and start mining
</ul>
</details>
<details><summary>Setup Monero wallet</summary>
Wallets with confirmed P2Pool support<br>
<span style="font-size:0.9rem;color:#e09000;">You might not see P2Pool payouts in other wallets if they're not updated!</span>
<ul>
<li>Official <a href="https://www.getmonero.org/downloads/" target="_blank">Monero CLI and GUI v0.18.1.0</a> and newer
<li><a href="https://play.google.com/store/apps/details?id=com.m2049r.xmrwallet" target="_blank">Monerujo v3.0.2 "Fluorine Fermi"</a> and newer
<li><a href="https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet" target="_blank">Cake Wallet v4.4.5</a> and newer
<li><a href="https://featherwallet.org/" target="_blank">Feather Wallet v2.1.0</a> and newer
</ul>
It's highly recommended to create a new wallet for mining because wallet addresses are public on p2pool. You can mine to a primary wallet address (the one starting with `4`) for mining. If you want to mine to a subaddress, you will need to provide both the main address (starting with 4) and the subaddress (starting with 8) using "--wallet" and "--subaddress" command line parameters.
</details>
<details><summary>Setup Monero node</summary>
<ul>
<li>Download the latest Monero <a href="https://www.getmonero.org/downloads/" target="_blank">release</a>
<li>[Optional] Open port <span>18080</span> (Monero p2p port) in your firewall to ensure better connectivity
<li>Run <span>./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 32 --in-peers 64 --add-priority-node=p2pmd.xmrvsbeast.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --enforce-dns-checkpointing --enable-dns-blocklist</span>
<li>If your network connection's upload bandwidth is less than 10 Mbit, use <span>--out-peers 8 --in-peers 16</span> instead.
<li>Wait until it's fully synchronized. If you didn't run Monero node before, it can take up to several days to synchronize (5-6 hours on a modern PC with fast SSD and fast Internet connection). You can add <span>--prune-blockchain</span> argument to the command line to run a pruned node (3-4 times less disk usage)
</ul></details>
<details><summary>Setup P2Pool node</summary>
<ul>
<li>Download the latest P2Pool <a href="https://github.com/SChernykh/p2pool/releases/latest" target="_blank">release</a>
<li>[Optional] Open port <span>37890</span> (P2Pool nano p2p port) in your firewall to ensure better connectivity
<li>Run <span>./p2pool --host 127.0.0.1 --wallet YOUR_WALLET_ADDRESS --nano</span>
<li>It should take no more than 5-10 minutes to synchronize
</ul></details>
<details><summary>Miner software</summary>
<ul>
<li><a href="https://xmrig.com/" target="_blank">XMRig</a> is recommended. <a href="https://xmrig.com/proxy" target="_blank">XMRig Proxy</a> is fully supported.
<li>Once P2Pool sync is complete, XMRig should be able to connect to the stratum server on port <span>3333</span>
<li>Run <span>./xmrig -o 127.0.0.1:3333</span>. Note that you don't need to specify wallet address for xmrig. Wallet address set in xmrig config will be ignored!
<li>To set custom fixed difficulty for your miner (for example, <span>10000</span>), run <span>./xmrig -u x+10000 -o 127.0.0.1:3333</span>
<li>To connect another mining rig to your P2Pool node, run <span>./xmrig -o YOUR_P2POOL_NODE_IP:3333</span> on that mining rig
</ul></details>
<details><summary>Checking your progress</summary>
<ul>
<li>You can enter your wallet address at <a href="https://p2pool.observer/" target="_blank">P2Pool Observer</a>
<li>P2Pool Observer for P2Pool mini can be found <a href="https://mini.p2pool.observer/" target="_blank">here</a>
<li>P2Pool Observer for P2Pool nano can be found <a href="https://nano.p2pool.observer/" target="_blank">here</a>
<li>You will find your wallet's statistics there only after you've mined at least 1 P2Pool share
</ul>
</details>
<details><summary>Help and support</summary>
P2Pool is a decentralized community, there is no dedicated support. You can reach and get help from other miners on:
<ul>
<li>IRC channels: <span>#p2pool-log</span> (<span>#p2pool-mini</span> for P2Pool mini) on <a href="https://libera.chat/" target="_blank">Libera.Chat</a>
<li>Reddit: <a href="https://reddit.com/r/MoneroMining/" target="_blank">r/MoneroMining</a>
</ul></details>
</td></tr></table>
<table id="menu_faq" class="menu_page"><tr><td>
<ul>
<li><span style="font-size:2rem;color:#e09000;">What are system requirements to run P2Pool?</span>
<ul><li>P2Pool needs 0.5 GB disc space and 2.6 GB RAM to run (0.6 GB RAM in light mode). Add this to monerod requirements if you run both on the same machine. Add <span style="color:#808080;">--light-mode</span> to p2pool command line to reduce the memory usage to 0.6 GB, or <span style="color:#808080;">--no-randomx --no-cache</span> to reduce the memory usage to less than 100 MB.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">Does P2Pool work with XMRig Proxy?</span>
<ul><li>Yes, P2Pool fully supports <a href="https://xmrig.com/proxy" target="_blank">XMRig Proxy</a>.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">Does monerod have to be run on the same machine as P2Pool?</span>
<ul><li>No, you can run them on different machines and even connect multiple p2pool instances to a single server running monerod</ul><br>
<li><span style="font-size:2rem;color:#e09000;">Does P2Pool work with pruned Monero node?</span>
<ul><li>Yes, you can use pruned Monero node to mine on P2Pool</ul><br>
<li><span style="font-size:2rem;color:#e09000;">Does P2Pool require incoming connections to work properly?</span>
<ul><li>P2Pool (and Monero) can work with only outgoing connections, but it's recommended to open ports 18080 (Monero) and 37889/37888/37890 (P2Pool/P2Pool mini/P2Pool nano) for better connectivity with the rest of the network.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I have been mining for several hours and still got no rewards?</span>
<ul><li>P2Pool doesn't work exactly like regular pools - there's no "pending balance" here. You need to find a pool share first and then wait for P2Pool to find a Monero block. You'll get a payout to your XMR wallet as soon as a block is found and you have shares in PPLNS window. It can take several days to a week to find a share if your hashrate is low. Type "status" command in P2Pool console or visit <a href="https://nano.p2pool.observer/" target="_blank">P2Pool observer</a> to check your progress.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I am mining but I can't find any shares</span>
<ul><li>First check for any warnings and errors in P2Pool console and logs. If everything works fine, you can check the <a href="https://p2pool.observer/calculate-share-time" target="_blank">average share time calculator</a> to get an idea how often you should find a share with your hashrate. If this time is more than 1 day, it's recommended to switch to P2Pool mini or P2Pool nano by adding <span style="color:#808080;">--mini</span> or <span style="color:#808080;">--nano</span> to P2Pool command line.</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I get an error "monerod RPC ... is incompatible, update to RPC >= v3.8"</span>
<ul><li>Use monerod v0.18.0.0 or newer</ul><br>
<li><span style="font-size:2rem;color:#e09000;">I get warnings "peer ... is ahead on mainchain (height ..., your height ...). Is your monerod stuck or lagging?"</span>
<ul><li>Make sure you add these arguments to monerod command line: <span style="color:#808080;">--zmq-pub tcp://127.0.0.1:18083 --enforce-dns-checkpointing --enable-dns-blocklist</span></ul><br>
</ul>
</td></tr></table>
<br><br>
<div style="position:fixed;width:100%;bottom:0;background-color:#383838;font-size:1rem;text-align:center;color:#b0b0b0;">
<a href="api/" target="_blank">Pool API</a>&nbsp;|&nbsp;<a href="https://github.com/SChernykh/p2pool" target="_blank">Source</a>&nbsp;|&nbsp;<a href="http://yucmgsbw7nknw7oi3bkuwudvc657g2xcqahhbjyewazusyytapqo4xid.onion/nano/" target="_blank">Onion URL</a><br>
Donate to support the project:<br><span style="font-size:0.9rem;color:#b0b0b0;">44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg</span><br>
&nbsp;
</div>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+6 -2
View File
@@ -262,8 +262,9 @@ message NetworkDifficultyResponse {
uint64 sha3x_estimated_hash_rate = 6;
uint64 monero_randomx_estimated_hash_rate = 7;
uint64 tari_randomx_estimated_hash_rate = 10;
UDecimalValue cuckaroo_estimated_hash_rate = 11;
uint64 num_coinbases = 8;
repeated bytes coinbase_extras = 9;
repeated bytes coinbase_extras = 9;
}
// A generic single value response for a specific height
@@ -626,9 +627,12 @@ message GetNetworkStateResponse {
uint64 reward = 5;
// estimate sha3x hash rate
uint64 sha3x_estimated_hash_rate = 6;
// estimate randomx hash rate
// estimate monero randomx hash rate
uint64 monero_randomx_estimated_hash_rate = 7;
// estimate tari randomx hash rate
uint64 tari_randomx_estimated_hash_rate = 10;
// estimate cuckaroo hash rate
UDecimalValue cuckaroo_estimated_hash_rate = 12;
// number of connections
uint64 num_connections = 8;
//liveness results
+18 -17
View File
@@ -384,22 +384,23 @@ const char descriptor_table_protodef_block_2eproto[] ABSL_ATTRIBUTE_SECTION_VARI
"tal_script_offset\030\017 \001(\014\022\031\n\021validator_nod"
"e_mr\030\020 \001(\014\022\033\n\023validator_node_size\030\021 \001(\004\""
"1\n\013ProofOfWork\022\020\n\010pow_algo\030\001 \001(\004\022\020\n\010pow_"
"data\030\004 \001(\014\"\210\001\n\007PowAlgo\022,\n\010pow_algo\030\001 \001(\016"
"2\032.tari.rpc.PowAlgo.PowAlgos\"O\n\010PowAlgos"
"data\030\004 \001(\014\"\240\001\n\007PowAlgo\022,\n\010pow_algo\030\001 \001(\016"
"2\032.tari.rpc.PowAlgo.PowAlgos\"g\n\010PowAlgos"
"\022\026\n\022POW_ALGOS_RANDOMXM\020\000\022\023\n\017POW_ALGOS_SH"
"A3X\020\001\022\026\n\022POW_ALGOS_RANDOMXT\020\002\"U\n\005Block\022%"
"\n\006header\030\001 \001(\0132\025.tari.rpc.BlockHeader\022%\n"
"\004body\030\002 \001(\0132\027.tari.rpc.AggregateBody\"H\n\017"
"HistoricalBlock\022\025\n\rconfirmations\030\001 \001(\004\022\036"
"\n\005block\030\002 \001(\0132\017.tari.rpc.Block\"\252\001\n\026NewBl"
"ockHeaderTemplate\022\017\n\007version\030\001 \001(\r\022\016\n\006he"
"ight\030\002 \001(\004\022\021\n\tprev_hash\030\003 \001(\014\022\033\n\023total_k"
"ernel_offset\030\004 \001(\014\022\"\n\003pow\030\005 \001(\0132\025.tari.r"
"pc.ProofOfWork\022\033\n\023total_script_offset\030\007 "
"\001(\014\"\207\001\n\020NewBlockTemplate\0220\n\006header\030\001 \001(\013"
"2 .tari.rpc.NewBlockHeaderTemplate\022%\n\004bo"
"dy\030\002 \001(\0132\027.tari.rpc.AggregateBody\022\032\n\022is_"
"mempool_in_sync\030\003 \001(\010b\006proto3"
"A3X\020\001\022\026\n\022POW_ALGOS_RANDOMXT\020\002\022\026\n\022POW_ALG"
"OS_CUCKAROO\020\003\"U\n\005Block\022%\n\006header\030\001 \001(\0132\025"
".tari.rpc.BlockHeader\022%\n\004body\030\002 \001(\0132\027.ta"
"ri.rpc.AggregateBody\"H\n\017HistoricalBlock\022"
"\025\n\rconfirmations\030\001 \001(\004\022\036\n\005block\030\002 \001(\0132\017."
"tari.rpc.Block\"\252\001\n\026NewBlockHeaderTemplat"
"e\022\017\n\007version\030\001 \001(\r\022\016\n\006height\030\002 \001(\004\022\021\n\tpr"
"ev_hash\030\003 \001(\014\022\033\n\023total_kernel_offset\030\004 \001"
"(\014\022\"\n\003pow\030\005 \001(\0132\025.tari.rpc.ProofOfWork\022\033"
"\n\023total_script_offset\030\007 \001(\014\"\207\001\n\020NewBlock"
"Template\0220\n\006header\030\001 \001(\0132 .tari.rpc.NewB"
"lockHeaderTemplate\022%\n\004body\030\002 \001(\0132\027.tari."
"rpc.AggregateBody\022\032\n\022is_mempool_in_sync\030"
"\003 \001(\010b\006proto3"
};
static const ::_pbi::DescriptorTable* PROTOBUF_NONNULL const
descriptor_table_block_2eproto_deps[1] = {
@@ -409,7 +410,7 @@ static ::absl::once_flag descriptor_table_block_2eproto_once;
PROTOBUF_CONSTINIT const ::_pbi::DescriptorTable descriptor_table_block_2eproto = {
false,
false,
1109,
1133,
descriptor_table_protodef_block_2eproto,
"block.proto",
&descriptor_table_block_2eproto_once,
@@ -429,7 +430,7 @@ const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL PowAlgo_PowAlgos_desc
return file_level_enum_descriptors_block_2eproto[0];
}
PROTOBUF_CONSTINIT const uint32_t PowAlgo_PowAlgos_internal_data_[] = {
196608u, 0u, };
262144u, 0u, };
// ===================================================================
class BlockHeader::_Internal {
+6 -4
View File
@@ -102,6 +102,7 @@ enum PowAlgo_PowAlgos : int {
PowAlgo_PowAlgos_POW_ALGOS_RANDOMXM = 0,
PowAlgo_PowAlgos_POW_ALGOS_SHA3X = 1,
PowAlgo_PowAlgos_POW_ALGOS_RANDOMXT = 2,
PowAlgo_PowAlgos_POW_ALGOS_CUCKAROO = 3,
PowAlgo_PowAlgos_PowAlgo_PowAlgos_INT_MIN_SENTINEL_DO_NOT_USE_ =
::std::numeric_limits<::int32_t>::min(),
PowAlgo_PowAlgos_PowAlgo_PowAlgos_INT_MAX_SENTINEL_DO_NOT_USE_ =
@@ -112,11 +113,11 @@ extern const uint32_t PowAlgo_PowAlgos_internal_data_[];
inline constexpr PowAlgo_PowAlgos PowAlgo_PowAlgos_PowAlgos_MIN =
static_cast<PowAlgo_PowAlgos>(0);
inline constexpr PowAlgo_PowAlgos PowAlgo_PowAlgos_PowAlgos_MAX =
static_cast<PowAlgo_PowAlgos>(2);
static_cast<PowAlgo_PowAlgos>(3);
inline bool PowAlgo_PowAlgos_IsValid(int value) {
return 0 <= value && value <= 2;
return 0 <= value && value <= 3;
}
inline constexpr int PowAlgo_PowAlgos_PowAlgos_ARRAYSIZE = 2 + 1;
inline constexpr int PowAlgo_PowAlgos_PowAlgos_ARRAYSIZE = 3 + 1;
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL PowAlgo_PowAlgos_descriptor();
template <typename T>
const ::std::string& PowAlgo_PowAlgos_Name(T value) {
@@ -127,7 +128,7 @@ const ::std::string& PowAlgo_PowAlgos_Name(T value) {
}
template <>
inline const ::std::string& PowAlgo_PowAlgos_Name(PowAlgo_PowAlgos value) {
return ::google::protobuf::internal::NameOfDenseEnum<PowAlgo_PowAlgos_descriptor, 0, 2>(
return ::google::protobuf::internal::NameOfDenseEnum<PowAlgo_PowAlgos_descriptor, 0, 3>(
static_cast<int>(value));
}
inline bool PowAlgo_PowAlgos_Parse(
@@ -493,6 +494,7 @@ class PowAlgo final : public ::google::protobuf::Message
static constexpr PowAlgos POW_ALGOS_RANDOMXM = PowAlgo_PowAlgos_POW_ALGOS_RANDOMXM;
static constexpr PowAlgos POW_ALGOS_SHA3X = PowAlgo_PowAlgos_POW_ALGOS_SHA3X;
static constexpr PowAlgos POW_ALGOS_RANDOMXT = PowAlgo_PowAlgos_POW_ALGOS_RANDOMXT;
static constexpr PowAlgos POW_ALGOS_CUCKAROO = PowAlgo_PowAlgos_POW_ALGOS_CUCKAROO;
static inline bool PowAlgos_IsValid(int value) {
return PowAlgo_PowAlgos_IsValid(value);
}
+6 -3
View File
@@ -68,8 +68,10 @@ message BlockHeader {
// The proof of work data structure that is included in the block header.
message ProofOfWork {
// The algorithm used to mine this block
// 0 = Monero
// 0 = Monero RandomX
// 1 = Sha3X
// 2 = Tari RandomX
// 3 = Cuckaroo
uint64 pow_algo = 1;
// Supplemental proof of work data. For example for Sha3x, this would be empty (only the block header is
// required), but for Monero merge mining we need the Monero block header and RandomX seed hash.
@@ -80,9 +82,10 @@ message ProofOfWork {
message PowAlgo {
// The permitted pow algorithms
enum PowAlgos {
POW_ALGOS_RANDOMXM = 0; // Accessible as `grpc::pow_algo::PowAlgos::RandomxM`
POW_ALGOS_RANDOMXM = 0; // Accessible as `grpc::pow_algo::PowAlgos::RandomxM`
POW_ALGOS_SHA3X = 1; // Accessible as `grpc::pow_algo::PowAlgos::Sha3x`
POW_ALGOS_RANDOMXT = 2; // Accessible as `grpc::pow_algo::PowAlgos::RandomxT`
POW_ALGOS_RANDOMXT = 2; // Accessible as `grpc::pow_algo::PowAlgos::RandomxT`
POW_ALGOS_CUCKAROO = 3; // Accessible as `grpc::pow_algo::PowAlgos::Cuckaroo`
}
// The pow algo to use
PowAlgos pow_algo = 1;
+1 -1
View File
@@ -66,7 +66,7 @@ message NetworkStatusResponse {
uint32 num_node_connections = 3;
}
message Address{
message Address {
bytes address =1;
string last_seen = 2;
uint32 connection_attempts = 3;
+323 -8
View File
@@ -55,6 +55,32 @@ struct WeightParamsDefaultTypeInternal {
PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 WeightParamsDefaultTypeInternal _WeightParams_default_instance_;
inline constexpr UDecimalValue::Impl_::Impl_(
::_pbi::ConstantInitialized) noexcept
: _cached_size_{0},
units_{::uint64_t{0u}},
nanos_{0u} {}
template <typename>
PROTOBUF_CONSTEXPR UDecimalValue::UDecimalValue(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
: ::google::protobuf::Message(UDecimalValue_class_data_.base()),
#else // PROTOBUF_CUSTOM_VTABLE
: ::google::protobuf::Message(),
#endif // PROTOBUF_CUSTOM_VTABLE
_impl_(::_pbi::ConstantInitialized()) {
}
struct UDecimalValueDefaultTypeInternal {
PROTOBUF_CONSTEXPR UDecimalValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~UDecimalValueDefaultTypeInternal() {}
union {
UDecimalValue _instance;
};
};
PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UDecimalValueDefaultTypeInternal _UDecimalValue_default_instance_;
inline constexpr Signature::Impl_::Impl_(
::_pbi::ConstantInitialized) noexcept
: _cached_size_{0},
@@ -581,6 +607,13 @@ const ::uint32_t
29,
21,
30,
0x081, // bitmap
PROTOBUF_FIELD_OFFSET(::tari::rpc::UDecimalValue, _impl_._has_bits_),
5, // hasbit index offset
PROTOBUF_FIELD_OFFSET(::tari::rpc::UDecimalValue, _impl_.units_),
PROTOBUF_FIELD_OFFSET(::tari::rpc::UDecimalValue, _impl_.nanos_),
0,
1,
};
static const ::_pbi::MigrationSchema
@@ -598,6 +631,7 @@ static const ::_pbi::MigrationSchema
{76, sizeof(::tari::rpc::RangeProof)},
{81, sizeof(::tari::rpc::ConsensusConstants_ProofOfWorkEntry_DoNotUse)},
{88, sizeof(::tari::rpc::ConsensusConstants)},
{161, sizeof(::tari::rpc::UDecimalValue)},
};
static const ::_pb::Message* PROTOBUF_NONNULL const file_default_instances[] = {
&::tari::rpc::_Range_default_instance_._instance,
@@ -613,6 +647,7 @@ static const ::_pb::Message* PROTOBUF_NONNULL const file_default_instances[] = {
&::tari::rpc::_RangeProof_default_instance_._instance,
&::tari::rpc::_ConsensusConstants_ProofOfWorkEntry_DoNotUse_default_instance_._instance,
&::tari::rpc::_ConsensusConstants_default_instance_._instance,
&::tari::rpc::_UDecimalValue_default_instance_._instance,
};
const char descriptor_table_protodef_types_2eproto[] ABSL_ATTRIBUTE_SECTION_VARIABLE(
protodesc_cold) = {
@@ -672,24 +707,25 @@ const char descriptor_table_protodef_types_2eproto[] ABSL_ATTRIBUTE_SECTION_VARI
"ial_epoch\030& \001(\r\022)\n!vn_registration_max_v"
"ns_per_epoch\030\' \001(\r\032S\n\020ProofOfWorkEntry\022\013"
"\n\003key\030\001 \001(\r\022.\n\005value\030\002 \001(\0132\037.tari.rpc.Po"
"wAlgorithmConstants:\0028\001*s\n\nOutputType\022\014\n"
"\010STANDARD\020\000\022\014\n\010COINBASE\020\001\022\010\n\004BURN\020\002\022\037\n\033V"
"ALIDATOR_NODE_REGISTRATION\020\003\022\036\n\032CODE_TEM"
"PLATE_REGISTRATION\020\004*:\n\016RangeProofType\022\024"
"\n\020BULLETPROOF_PLUS\020\000\022\022\n\016REVEALED_VALUE\020\001"
"b\006proto3"
"wAlgorithmConstants:\0028\001\"-\n\rUDecimalValue"
"\022\r\n\005units\030\001 \001(\004\022\r\n\005nanos\030\002 \001(\007*s\n\nOutput"
"Type\022\014\n\010STANDARD\020\000\022\014\n\010COINBASE\020\001\022\010\n\004BURN"
"\020\002\022\037\n\033VALIDATOR_NODE_REGISTRATION\020\003\022\036\n\032C"
"ODE_TEMPLATE_REGISTRATION\020\004*:\n\016RangeProo"
"fType\022\024\n\020BULLETPROOF_PLUS\020\000\022\022\n\016REVEALED_"
"VALUE\020\001b\006proto3"
};
static ::absl::once_flag descriptor_table_types_2eproto_once;
PROTOBUF_CONSTINIT const ::_pbi::DescriptorTable descriptor_table_types_2eproto = {
false,
false,
2448,
2495,
descriptor_table_protodef_types_2eproto,
"types.proto",
&descriptor_table_types_2eproto_once,
nullptr,
0,
13,
14,
schemas,
file_default_instances,
TableStruct_types_2eproto::offsets,
@@ -5280,6 +5316,285 @@ void ConsensusConstants::InternalSwap(ConsensusConstants* PROTOBUF_RESTRICT PROT
::google::protobuf::Metadata ConsensusConstants::GetMetadata() const {
return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================
class UDecimalValue::_Internal {
public:
using HasBits =
decltype(::std::declval<UDecimalValue>()._impl_._has_bits_);
static constexpr ::int32_t kHasBitsOffset =
8 * PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_._has_bits_);
};
UDecimalValue::UDecimalValue(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
: ::google::protobuf::Message(arena, UDecimalValue_class_data_.base()) {
#else // PROTOBUF_CUSTOM_VTABLE
: ::google::protobuf::Message(arena) {
#endif // PROTOBUF_CUSTOM_VTABLE
SharedCtor(arena);
// @@protoc_insertion_point(arena_constructor:tari.rpc.UDecimalValue)
}
UDecimalValue::UDecimalValue(
::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const UDecimalValue& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
: ::google::protobuf::Message(arena, UDecimalValue_class_data_.base()),
#else // PROTOBUF_CUSTOM_VTABLE
: ::google::protobuf::Message(arena),
#endif // PROTOBUF_CUSTOM_VTABLE
_impl_(from._impl_) {
_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
from._internal_metadata_);
}
PROTOBUF_NDEBUG_INLINE UDecimalValue::Impl_::Impl_(
::google::protobuf::internal::InternalVisibility visibility,
::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
: _cached_size_{0} {}
inline void UDecimalValue::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
new (&_impl_) Impl_(internal_visibility(), arena);
::memset(reinterpret_cast<char *>(&_impl_) +
offsetof(Impl_, units_),
0,
offsetof(Impl_, nanos_) -
offsetof(Impl_, units_) +
sizeof(Impl_::nanos_));
}
UDecimalValue::~UDecimalValue() {
// @@protoc_insertion_point(destructor:tari.rpc.UDecimalValue)
SharedDtor(*this);
}
inline void UDecimalValue::SharedDtor(MessageLite& self) {
UDecimalValue& this_ = static_cast<UDecimalValue&>(self);
this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
ABSL_DCHECK(this_.GetArena() == nullptr);
this_._impl_.~Impl_();
}
inline void* PROTOBUF_NONNULL UDecimalValue::PlacementNew_(
const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
return ::new (mem) UDecimalValue(arena);
}
constexpr auto UDecimalValue::InternalNewImpl_() {
return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(UDecimalValue),
alignof(UDecimalValue));
}
constexpr auto UDecimalValue::InternalGenerateClassData_() {
return ::google::protobuf::internal::ClassDataFull{
::google::protobuf::internal::ClassData{
&_UDecimalValue_default_instance_._instance,
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&UDecimalValue::MergeImpl,
::google::protobuf::Message::GetNewImpl<UDecimalValue>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
&UDecimalValue::SharedDtor,
::google::protobuf::Message::GetClearImpl<UDecimalValue>(), &UDecimalValue::ByteSizeLong,
&UDecimalValue::_InternalSerialize,
#endif // PROTOBUF_CUSTOM_VTABLE
PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_._cached_size_),
false,
},
&UDecimalValue::kDescriptorMethods,
&descriptor_table_types_2eproto,
nullptr, // tracker
};
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
::google::protobuf::internal::ClassDataFull UDecimalValue_class_data_ =
UDecimalValue::InternalGenerateClassData_();
PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
UDecimalValue::GetClassData() const {
::google::protobuf::internal::PrefetchToLocalCache(&UDecimalValue_class_data_);
::google::protobuf::internal::PrefetchToLocalCache(UDecimalValue_class_data_.tc_table);
return UDecimalValue_class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<1, 2, 0, 0, 2>
UDecimalValue::_table_ = {
{
PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_._has_bits_),
0, // no _extensions_
2, 8, // max_field_number, fast_idx_mask
offsetof(decltype(_table_), field_lookup_table),
4294967292, // skipmap
offsetof(decltype(_table_), field_entries),
2, // num_field_entries
0, // num_aux_entries
offsetof(decltype(_table_), field_names), // no aux_entries
UDecimalValue_class_data_.base(),
nullptr, // post_loop_handler
::_pbi::TcParser::GenericFallback, // fallback
#ifdef PROTOBUF_PREFETCH_PARSE_TABLE
::_pbi::TcParser::GetTable<::tari::rpc::UDecimalValue>(), // to_prefetch
#endif // PROTOBUF_PREFETCH_PARSE_TABLE
}, {{
// fixed32 nanos = 2;
{::_pbi::TcParser::FastF32S1,
{21, 1, 0, PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_.nanos_)}},
// uint64 units = 1;
{::_pbi::TcParser::SingularVarintNoZag1<::uint64_t, offsetof(UDecimalValue, _impl_.units_), 0>(),
{8, 0, 0, PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_.units_)}},
}}, {{
65535, 65535
}}, {{
// uint64 units = 1;
{PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_.units_), _Internal::kHasBitsOffset + 0, 0,
(0 | ::_fl::kFcOptional | ::_fl::kUInt64)},
// fixed32 nanos = 2;
{PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_.nanos_), _Internal::kHasBitsOffset + 1, 0,
(0 | ::_fl::kFcOptional | ::_fl::kFixed32)},
}},
// no aux_entries
{{
}},
};
PROTOBUF_NOINLINE void UDecimalValue::Clear() {
// @@protoc_insertion_point(message_clear_start:tari.rpc.UDecimalValue)
::google::protobuf::internal::TSanWrite(&_impl_);
::uint32_t cached_has_bits = 0;
// Prevent compiler warnings about cached_has_bits being unused
(void) cached_has_bits;
cached_has_bits = _impl_._has_bits_[0];
if ((cached_has_bits & 0x00000003u) != 0) {
::memset(&_impl_.units_, 0, static_cast<::size_t>(
reinterpret_cast<char*>(&_impl_.nanos_) -
reinterpret_cast<char*>(&_impl_.units_)) + sizeof(_impl_.nanos_));
}
_impl_._has_bits_.Clear();
_internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}
#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL UDecimalValue::_InternalSerialize(
const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
const UDecimalValue& this_ = static_cast<const UDecimalValue&>(base);
#else // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL UDecimalValue::_InternalSerialize(
::uint8_t* PROTOBUF_NONNULL target,
::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
const UDecimalValue& this_ = *this;
#endif // PROTOBUF_CUSTOM_VTABLE
// @@protoc_insertion_point(serialize_to_array_start:tari.rpc.UDecimalValue)
::uint32_t cached_has_bits = 0;
(void)cached_has_bits;
// uint64 units = 1;
if ((this_._impl_._has_bits_[0] & 0x00000001u) != 0) {
if (this_._internal_units() != 0) {
target = stream->EnsureSpace(target);
target = ::_pbi::WireFormatLite::WriteUInt64ToArray(
1, this_._internal_units(), target);
}
}
// fixed32 nanos = 2;
if ((this_._impl_._has_bits_[0] & 0x00000002u) != 0) {
if (this_._internal_nanos() != 0) {
target = stream->EnsureSpace(target);
target = ::_pbi::WireFormatLite::WriteFixed32ToArray(
2, this_._internal_nanos(), target);
}
}
if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
target =
::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
}
// @@protoc_insertion_point(serialize_to_array_end:tari.rpc.UDecimalValue)
return target;
}
#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t UDecimalValue::ByteSizeLong(const MessageLite& base) {
const UDecimalValue& this_ = static_cast<const UDecimalValue&>(base);
#else // PROTOBUF_CUSTOM_VTABLE
::size_t UDecimalValue::ByteSizeLong() const {
const UDecimalValue& this_ = *this;
#endif // PROTOBUF_CUSTOM_VTABLE
// @@protoc_insertion_point(message_byte_size_start:tari.rpc.UDecimalValue)
::size_t total_size = 0;
::uint32_t cached_has_bits = 0;
// Prevent compiler warnings about cached_has_bits being unused
(void)cached_has_bits;
::_pbi::Prefetch5LinesFrom7Lines(&this_);
cached_has_bits = this_._impl_._has_bits_[0];
if ((cached_has_bits & 0x00000003u) != 0) {
// uint64 units = 1;
if ((cached_has_bits & 0x00000001u) != 0) {
if (this_._internal_units() != 0) {
total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne(
this_._internal_units());
}
}
// fixed32 nanos = 2;
if ((cached_has_bits & 0x00000002u) != 0) {
if (this_._internal_nanos() != 0) {
total_size += 5;
}
}
}
return this_.MaybeComputeUnknownFieldsSize(total_size,
&this_._impl_._cached_size_);
}
void UDecimalValue::MergeImpl(::google::protobuf::MessageLite& to_msg, const ::google::protobuf::MessageLite& from_msg) {
auto* const _this = static_cast<UDecimalValue*>(&to_msg);
auto& from = static_cast<const UDecimalValue&>(from_msg);
// @@protoc_insertion_point(class_specific_merge_from_start:tari.rpc.UDecimalValue)
ABSL_DCHECK_NE(&from, _this);
::uint32_t cached_has_bits = 0;
(void) cached_has_bits;
cached_has_bits = from._impl_._has_bits_[0];
if ((cached_has_bits & 0x00000003u) != 0) {
if ((cached_has_bits & 0x00000001u) != 0) {
if (from._internal_units() != 0) {
_this->_impl_.units_ = from._impl_.units_;
}
}
if ((cached_has_bits & 0x00000002u) != 0) {
if (from._internal_nanos() != 0) {
_this->_impl_.nanos_ = from._impl_.nanos_;
}
}
}
_this->_impl_._has_bits_[0] |= cached_has_bits;
_this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
}
void UDecimalValue::CopyFrom(const UDecimalValue& from) {
// @@protoc_insertion_point(class_specific_copy_from_start:tari.rpc.UDecimalValue)
if (&from == this) return;
Clear();
MergeFrom(from);
}
void UDecimalValue::InternalSwap(UDecimalValue* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
using ::std::swap;
_internal_metadata_.InternalSwap(&other->_internal_metadata_);
swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
::google::protobuf::internal::memswap<
PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_.nanos_)
+ sizeof(UDecimalValue::_impl_.nanos_)
- PROTOBUF_FIELD_OFFSET(UDecimalValue, _impl_.units_)>(
reinterpret_cast<char*>(&_impl_.units_),
reinterpret_cast<char*>(&other->_impl_.units_));
}
::google::protobuf::Metadata UDecimalValue::GetMetadata() const {
return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// @@protoc_insertion_point(namespace_scope)
} // namespace rpc
} // namespace tari
+259
View File
@@ -112,6 +112,10 @@ class Signature;
struct SignatureDefaultTypeInternal;
extern SignatureDefaultTypeInternal _Signature_default_instance_;
extern const ::google::protobuf::internal::ClassDataFull Signature_class_data_;
class UDecimalValue;
struct UDecimalValueDefaultTypeInternal;
extern UDecimalValueDefaultTypeInternal _UDecimalValue_default_instance_;
extern const ::google::protobuf::internal::ClassDataFull UDecimalValue_class_data_;
class WeightParams;
struct WeightParamsDefaultTypeInternal;
extern WeightParamsDefaultTypeInternal _WeightParams_default_instance_;
@@ -439,6 +443,209 @@ class WeightParams final : public ::google::protobuf::Message
extern const ::google::protobuf::internal::ClassDataFull WeightParams_class_data_;
// -------------------------------------------------------------------
class UDecimalValue final : public ::google::protobuf::Message
/* @@protoc_insertion_point(class_definition:tari.rpc.UDecimalValue) */ {
public:
inline UDecimalValue() : UDecimalValue(nullptr) {}
~UDecimalValue() PROTOBUF_FINAL;
#if defined(PROTOBUF_CUSTOM_VTABLE)
void operator delete(UDecimalValue* PROTOBUF_NONNULL msg, std::destroying_delete_t) {
SharedDtor(*msg);
::google::protobuf::internal::SizedDelete(msg, sizeof(UDecimalValue));
}
#endif
template <typename = void>
explicit PROTOBUF_CONSTEXPR UDecimalValue(::google::protobuf::internal::ConstantInitialized);
inline UDecimalValue(const UDecimalValue& from) : UDecimalValue(nullptr, from) {}
inline UDecimalValue(UDecimalValue&& from) noexcept
: UDecimalValue(nullptr, ::std::move(from)) {}
inline UDecimalValue& operator=(const UDecimalValue& from) {
CopyFrom(from);
return *this;
}
inline UDecimalValue& operator=(UDecimalValue&& from) noexcept {
if (this == &from) return *this;
if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) {
InternalSwap(&from);
} else {
CopyFrom(from);
}
return *this;
}
inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const
ABSL_ATTRIBUTE_LIFETIME_BOUND {
return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance);
}
inline ::google::protobuf::UnknownFieldSet* PROTOBUF_NONNULL mutable_unknown_fields()
ABSL_ATTRIBUTE_LIFETIME_BOUND {
return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>();
}
static const ::google::protobuf::Descriptor* PROTOBUF_NONNULL descriptor() {
return GetDescriptor();
}
static const ::google::protobuf::Descriptor* PROTOBUF_NONNULL GetDescriptor() {
return default_instance().GetMetadata().descriptor;
}
static const ::google::protobuf::Reflection* PROTOBUF_NONNULL GetReflection() {
return default_instance().GetMetadata().reflection;
}
static const UDecimalValue& default_instance() {
return *reinterpret_cast<const UDecimalValue*>(
&_UDecimalValue_default_instance_);
}
static constexpr int kIndexInFileMessages = 13;
friend void swap(UDecimalValue& a, UDecimalValue& b) { a.Swap(&b); }
inline void Swap(UDecimalValue* PROTOBUF_NONNULL other) {
if (other == this) return;
if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) {
InternalSwap(other);
} else {
::google::protobuf::internal::GenericSwap(this, other);
}
}
void UnsafeArenaSwap(UDecimalValue* PROTOBUF_NONNULL other) {
if (other == this) return;
ABSL_DCHECK(GetArena() == other->GetArena());
InternalSwap(other);
}
// implements Message ----------------------------------------------
UDecimalValue* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const {
return ::google::protobuf::Message::DefaultConstruct<UDecimalValue>(arena);
}
using ::google::protobuf::Message::CopyFrom;
void CopyFrom(const UDecimalValue& from);
using ::google::protobuf::Message::MergeFrom;
void MergeFrom(const UDecimalValue& from) { UDecimalValue::MergeImpl(*this, from); }
private:
static void MergeImpl(::google::protobuf::MessageLite& to_msg,
const ::google::protobuf::MessageLite& from_msg);
public:
bool IsInitialized() const {
return true;
}
ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL;
#if defined(PROTOBUF_CUSTOM_VTABLE)
private:
static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg);
static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize(
const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target,
::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream);
public:
::size_t ByteSizeLong() const { return ByteSizeLong(*this); }
::uint8_t* PROTOBUF_NONNULL _InternalSerialize(
::uint8_t* PROTOBUF_NONNULL target,
::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
return _InternalSerialize(*this, target, stream);
}
#else // PROTOBUF_CUSTOM_VTABLE
::size_t ByteSizeLong() const final;
::uint8_t* PROTOBUF_NONNULL _InternalSerialize(
::uint8_t* PROTOBUF_NONNULL target,
::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final;
#endif // PROTOBUF_CUSTOM_VTABLE
int GetCachedSize() const { return _impl_._cached_size_.Get(); }
private:
void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena);
static void SharedDtor(MessageLite& self);
void InternalSwap(UDecimalValue* PROTOBUF_NONNULL other);
private:
template <typename T>
friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)();
static ::absl::string_view FullMessageName() { return "tari.rpc.UDecimalValue"; }
protected:
explicit UDecimalValue(::google::protobuf::Arena* PROTOBUF_NULLABLE arena);
UDecimalValue(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const UDecimalValue& from);
UDecimalValue(
::google::protobuf::Arena* PROTOBUF_NULLABLE arena, UDecimalValue&& from) noexcept
: UDecimalValue(arena) {
*this = ::std::move(from);
}
const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL;
static void* PROTOBUF_NONNULL PlacementNew_(
const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
::google::protobuf::Arena* PROTOBUF_NULLABLE arena);
static constexpr auto InternalNewImpl_();
public:
static constexpr auto InternalGenerateClassData_();
::google::protobuf::Metadata GetMetadata() const;
// nested types ----------------------------------------------------
// accessors -------------------------------------------------------
enum : int {
kUnitsFieldNumber = 1,
kNanosFieldNumber = 2,
};
// uint64 units = 1;
void clear_units() ;
::uint64_t units() const;
void set_units(::uint64_t value);
private:
::uint64_t _internal_units() const;
void _internal_set_units(::uint64_t value);
public:
// fixed32 nanos = 2;
void clear_nanos() ;
::uint32_t nanos() const;
void set_nanos(::uint32_t value);
private:
::uint32_t _internal_nanos() const;
void _internal_set_nanos(::uint32_t value);
public:
// @@protoc_insertion_point(class_scope:tari.rpc.UDecimalValue)
private:
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<1, 2,
0, 0,
2>
_table_;
friend class ::google::protobuf::MessageLite;
friend class ::google::protobuf::Arena;
template <typename T>
friend class ::google::protobuf::Arena::InternalHelper;
using InternalArenaConstructable_ = void;
using DestructorSkippable_ = void;
struct Impl_ {
inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept;
inline explicit Impl_(
::google::protobuf::internal::InternalVisibility visibility,
::google::protobuf::Arena* PROTOBUF_NULLABLE arena);
inline explicit Impl_(
::google::protobuf::internal::InternalVisibility visibility,
::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
const UDecimalValue& from_msg);
::google::protobuf::internal::HasBits<1> _has_bits_;
::google::protobuf::internal::CachedSize _cached_size_;
::uint64_t units_;
::uint32_t nanos_;
PROTOBUF_TSAN_DECLARE_MEMBER
};
union { Impl_ _impl_; };
friend struct ::TableStruct_types_2eproto;
};
extern const ::google::protobuf::internal::ClassDataFull UDecimalValue_class_data_;
// -------------------------------------------------------------------
class Signature final : public ::google::protobuf::Message
/* @@protoc_insertion_point(class_definition:tari.rpc.Signature) */ {
public:
@@ -5787,6 +5994,58 @@ inline void ConsensusConstants::_internal_set_vn_registration_max_vns_per_epoch(
_impl_.vn_registration_max_vns_per_epoch_ = value;
}
// -------------------------------------------------------------------
// UDecimalValue
// uint64 units = 1;
inline void UDecimalValue::clear_units() {
::google::protobuf::internal::TSanWrite(&_impl_);
_impl_.units_ = ::uint64_t{0u};
_impl_._has_bits_[0] &= ~0x00000001u;
}
inline ::uint64_t UDecimalValue::units() const {
// @@protoc_insertion_point(field_get:tari.rpc.UDecimalValue.units)
return _internal_units();
}
inline void UDecimalValue::set_units(::uint64_t value) {
_internal_set_units(value);
_impl_._has_bits_[0] |= 0x00000001u;
// @@protoc_insertion_point(field_set:tari.rpc.UDecimalValue.units)
}
inline ::uint64_t UDecimalValue::_internal_units() const {
::google::protobuf::internal::TSanRead(&_impl_);
return _impl_.units_;
}
inline void UDecimalValue::_internal_set_units(::uint64_t value) {
::google::protobuf::internal::TSanWrite(&_impl_);
_impl_.units_ = value;
}
// fixed32 nanos = 2;
inline void UDecimalValue::clear_nanos() {
::google::protobuf::internal::TSanWrite(&_impl_);
_impl_.nanos_ = 0u;
_impl_._has_bits_[0] &= ~0x00000002u;
}
inline ::uint32_t UDecimalValue::nanos() const {
// @@protoc_insertion_point(field_get:tari.rpc.UDecimalValue.nanos)
return _internal_nanos();
}
inline void UDecimalValue::set_nanos(::uint32_t value) {
_internal_set_nanos(value);
_impl_._has_bits_[0] |= 0x00000002u;
// @@protoc_insertion_point(field_set:tari.rpc.UDecimalValue.nanos)
}
inline ::uint32_t UDecimalValue::_internal_nanos() const {
::google::protobuf::internal::TSanRead(&_impl_);
return _impl_.nanos_;
}
inline void UDecimalValue::_internal_set_nanos(::uint32_t value) {
::google::protobuf::internal::TSanWrite(&_impl_);
_impl_.nanos_ = value;
}
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif // __GNUC__
+10
View File
@@ -146,3 +146,13 @@ message ConsensusConstants {
uint32 vn_registration_max_vns_initial_epoch = 38;
uint32 vn_registration_max_vns_per_epoch = 39;
}
// Unsigned decimal value, examples:
// 12345.6789 -> { units = 12345, nanos = 678900000 }
// 12345.0006789 -> { units = 12345, nanos = 678900 }
message UDecimalValue {
// Whole units part of the amount
uint64 units = 1;
// Nano units of the amount (10^-9)
fixed32 nanos = 2;
}
+13 -1
View File
@@ -1,4 +1,4 @@
// Copyright (c) 2014-2020, The Monero Project
// Copyright (c) 2014-2024, The Monero Project
//
// All rights reserved.
//
@@ -42,6 +42,13 @@ const fe fe_d = {-10913610, 13857413, -15372611, 6949391, 114729, -8787816, -627
const fe fe_sqrtm1 = {-32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482}; /* sqrt(-1) */
const fe fe_d2 = {-21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199}; /* 2 * d */
/* a = -1 */
// TODO: double check these consts
const fe fe_a_sub_d = {10913609, -13857413, 15372611, -6949391, -114729, 8787816, 6275908, 3247719, 18696448, 12055116}; /* a - d */
const fe fe_a0 = {-21827241, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199}; /* A0 = 2 * (a + d) */
const fe fe_ap = {-23454401, 11679213, -5618422, 5756869, -458917, 1596832, 25103633, 12990876, 7676928, 14666033}; /* Ap = -2 * A0 */
const fe fe_msqrt2b = {-1359796, -3165658, 8463188, -8916281, -9242332, 8801166, -2887120, 14417306, 28934311, 6371549};
/* base[i][j] = (j+1)*256^i*B */
const ge_precomp ge_base[32][8] = {
{
@@ -874,6 +881,11 @@ const fe fe_fffb1 = {-31702527, -2466483, -26106795, -12203692, -12169197, -3210
const fe fe_fffb2 = {8166131, -6741800, -17040804, 3154616, 21461005, 1466302, -30876704, -6368709, 10503587, -13363080}; /* sqrt(2 * A * (A + 2)) */
const fe fe_fffb3 = {-13620103, 14639558, 4532995, 7679154, 16815101, -15883539, -22863840, -14813421, 13716513, -6477756}; /* sqrt(-sqrt(-1) * A * (A + 2)) */
const fe fe_fffb4 = {-21786234, -12173074, 21573800, 4524538, -4645904, 16204591, 8012863, -8444712, 3212926, 6885324}; /* sqrt(sqrt(-1) * A * (A + 2)) */
const fe fe_a_inv_3 = {-22207407, 11184811, 22369621, -11184811, -22369621, 11184811, 22369621, -11184811, -22369621, 11184811}; /* A / 3*/
const fe fe_c = {-12222970, -8312128, -11511410, 9067497, -15300785, -241793, 25456130, 14121551, -12187136, 3972024}; /* sqrt(-(A + 2))*/
const fe fe_one = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
const fe fe_m1 = {-1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
const fe fe_inv2 = {10, 0, 0, 0, 0, 0, 0, 0, 0, -16777216}; /* 1 / 2 */
const ge_p3 ge_p3_identity = { {0}, {1, 0}, {1, 0}, {0} };
const ge_p3 ge_p3_H = {
{7329926, -15101362, 31411471, 7614783, 27996851, -3197071, -11157635, -6878293, 466949, -7986503},
+360 -54
View File
@@ -1,4 +1,4 @@
// Copyright (c) 2014-2020, The Monero Project
// Copyright (c) 2014-2024, The Monero Project
//
// All rights reserved.
//
@@ -34,13 +34,13 @@
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "crypto-ops.h"
/* Predeclarations */
static void fe_mul(fe, const fe, const fe);
static void fe_sq(fe, const fe);
static void ge_madd(ge_p1p1 *, const ge_p3 *, const ge_precomp *);
static void ge_msub(ge_p1p1 *, const ge_p3 *, const ge_precomp *);
static void ge_p2_0(ge_p2 *);
@@ -73,7 +73,7 @@ uint64_t load_4(const unsigned char *in)
h = 0
*/
static void fe_0(fe h) {
void fe_0(fe h) {
h[0] = 0;
h[1] = 0;
h[2] = 0;
@@ -92,7 +92,7 @@ static void fe_0(fe h) {
h = 1
*/
static void fe_1(fe h) {
void fe_1(fe h) {
h[0] = 1;
h[1] = 0;
h[2] = 0;
@@ -232,7 +232,7 @@ static void fe_cmov(fe f, const fe g, unsigned int b) {
h = f
*/
static void fe_copy(fe h, const fe f) {
void fe_copy(fe h, const fe f) {
int32_t f0 = f[0];
int32_t f1 = f[1];
int32_t f2 = f[2];
@@ -315,6 +315,39 @@ void fe_invert(fe out, const fe z) {
return;
}
// Montgomery's trick
// https://iacr.org/archive/pkc2004/29470042/29470042.pdf 2.2
int fe_batch_invert(fe *out, const fe *in, const int n) {
if (n == 0) {
return 0;
}
// Step 1: collect initial muls
fe *init_muls = (fe *) malloc(n * sizeof(fe));
if (!init_muls) {
return 1;
}
memcpy(&init_muls[0], &in[0], sizeof(fe));
for (int i = 1; i < n; ++i) {
fe_mul(init_muls[i], init_muls[i-1], in[i]);
}
// Step 2: get the inverse of all elems multiplied together
fe a;
fe_invert(a, init_muls[n-1]);
// Step 3: get each inverse
for (int i = n; i > 1; --i) {
fe_mul(out[i-1], a, init_muls[i-2]);
fe_mul(a, a, in[i-1]);
}
memcpy(&out[0], &a, sizeof(fe));
free(init_muls);
return 0;
}
/* From fe_isnegative.c */
/*
@@ -325,7 +358,7 @@ Preconditions:
|f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
*/
static int fe_isnegative(const fe f) {
int fe_isnegative(const fe f) {
unsigned char s[32];
fe_tobytes(s, f);
return s[0] & 1;
@@ -376,7 +409,7 @@ Can get away with 11 carries, but then data flow is much deeper.
With tighter constraints on inputs can squeeze carries into int32.
*/
static void fe_mul(fe h, const fe f, const fe g) {
void fe_mul(fe h, const fe f, const fe g) {
int32_t f0 = f[0];
int32_t f1 = f[1];
int32_t f2 = f[2];
@@ -606,7 +639,7 @@ Postconditions:
|h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
*/
static void fe_neg(fe h, const fe f) {
void fe_neg(fe h, const fe f) {
int32_t f0 = f[0];
int32_t f1 = f[1];
int32_t f2 = f[2];
@@ -656,7 +689,7 @@ Postconditions:
See fe_mul.c for discussion of implementation strategy.
*/
static void fe_sq(fe h, const fe f) {
void fe_sq(fe h, const fe f) {
int32_t f0 = f[0];
int32_t f1 = f[1];
int32_t f2 = f[2];
@@ -960,7 +993,7 @@ Postconditions:
|h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
*/
static void fe_sub(fe h, const fe f, const fe g) {
void fe_sub(fe h, const fe f, const fe g) {
int32_t f0 = f[0];
int32_t f1 = f[1];
int32_t f2 = f[2];
@@ -1330,16 +1363,9 @@ void ge_double_scalarmult_base_vartime_p3(ge_p3 *r3, const unsigned char *a, con
}
}
/* From ge_frombytes.c, modified */
int ge_frombytes_vartime(ge_p3 *h, const unsigned char *s) {
fe u;
fe v;
fe vxx;
fe check;
/* From fe_frombytes.c */
/* From fe_frombytes.c */
int fe_frombytes_vartime(fe y, const unsigned char *s) {
int64_t h0 = load_4(s);
int64_t h1 = load_3(s + 4) << 6;
int64_t h2 = load_3(s + 7) << 5;
@@ -1380,18 +1406,31 @@ int ge_frombytes_vartime(ge_p3 *h, const unsigned char *s) {
carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;
carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;
h->Y[0] = h0;
h->Y[1] = h1;
h->Y[2] = h2;
h->Y[3] = h3;
h->Y[4] = h4;
h->Y[5] = h5;
h->Y[6] = h6;
h->Y[7] = h7;
h->Y[8] = h8;
h->Y[9] = h9;
y[0] = h0;
y[1] = h1;
y[2] = h2;
y[3] = h3;
y[4] = h4;
y[5] = h5;
y[6] = h6;
y[7] = h7;
y[8] = h8;
y[9] = h9;
/* End fe_frombytes.c */
return 0;
}
/* From ge_frombytes.c, modified */
int ge_frombytes_vartime(ge_p3 *h, const unsigned char *s) {
fe u;
fe v;
fe vxx;
fe check;
if (fe_frombytes_vartime(h->Y, s) != 0) {
return -1;
}
fe_1(h->Z);
fe_sq(u, h->Y);
@@ -1608,7 +1647,7 @@ static void ge_precomp_cmov(ge_precomp *t, const ge_precomp *u, unsigned char b)
fe_cmov(t->xy2d, u->xy2d, b);
}
static void select(ge_precomp *t, int pos, signed char b) {
static void _select(ge_precomp *t, int pos, signed char b) {
ge_precomp minust;
unsigned char bnegative = negative(b);
unsigned char babs = b - (((-bnegative) & b) << 1);
@@ -1628,6 +1667,32 @@ static void select(ge_precomp *t, int pos, signed char b) {
ge_precomp_cmov(t, &minust, bnegative);
}
// With these select_vartime/ge_scalarmult_base_vartime I got ~25% speed up comparing to the select/ge_scalarmult_base -- sowle
static void select_vartime(ge_precomp *t, int pos, signed char b) {
unsigned char bnegative = negative(b);
unsigned char babs = b - (((-bnegative) & b) << 1);
const ge_precomp* base;
if (babs == 0)
{
ge_precomp_0(t);
}
else if (bnegative == 0)
{
base = &ge_base[pos][babs - 1];
fe_copy(t->yplusx, base->yplusx);
fe_copy(t->yminusx, base->yminusx);
fe_copy(t->xy2d, base->xy2d);
}
else
{
base = &ge_base[pos][babs - 1];
fe_copy(t->yplusx, base->yminusx);
fe_copy(t->yminusx, base->yplusx);
fe_neg(t->xy2d, base->xy2d);
}
}
/*
h = a * B
where a = a[0]+256*a[1]+...+256^31 a[31]
@@ -1664,7 +1729,7 @@ void ge_scalarmult_base(ge_p3 *h, const unsigned char *a) {
ge_p3_0(h);
for (i = 1; i < 64; i += 2) {
select(&t, i / 2, e[i]);
_select(&t, i / 2, e[i]);
ge_madd(&r, h, &t); ge_p1p1_to_p3(h, &r);
}
@@ -1674,7 +1739,49 @@ void ge_scalarmult_base(ge_p3 *h, const unsigned char *a) {
ge_p2_dbl(&r, &s); ge_p1p1_to_p3(h, &r);
for (i = 0; i < 64; i += 2) {
select(&t, i / 2, e[i]);
_select(&t, i / 2, e[i]);
ge_madd(&r, h, &t); ge_p1p1_to_p3(h, &r);
}
}
void ge_scalarmult_base_vartime(ge_p3 *h, const unsigned char *a) {
signed char e[64];
signed char carry;
ge_p1p1 r;
ge_p2 s;
ge_precomp t;
int i;
for (i = 0; i < 32; ++i) {
e[2 * i + 0] = (a[i] >> 0) & 15;
e[2 * i + 1] = (a[i] >> 4) & 15;
}
/* each e[i] is between 0 and 15 */
/* e[63] is between 0 and 7 */
carry = 0;
for (i = 0; i < 63; ++i) {
e[i] += carry;
carry = e[i] + 8;
carry >>= 4;
e[i] -= carry << 4;
}
e[63] += carry;
/* each e[i] is between -8 and 8 */
ge_p3_0(h);
for (i = 1; i < 64; i += 2) {
select_vartime(&t, i / 2, e[i]);
ge_madd(&r, h, &t); ge_p1p1_to_p3(h, &r);
}
ge_p3_dbl(&r, h); ge_p1p1_to_p2(&s, &r);
ge_p2_dbl(&r, &s); ge_p1p1_to_p2(&s, &r);
ge_p2_dbl(&r, &s); ge_p1p1_to_p2(&s, &r);
ge_p2_dbl(&r, &s); ge_p1p1_to_p3(h, &r);
for (i = 0; i < 64; i += 2) {
select_vartime(&t, i / 2, e[i]);
ge_madd(&r, h, &t); ge_p1p1_to_p3(h, &r);
}
}
@@ -1955,26 +2062,18 @@ void sc_reduce(unsigned char *s) {
s[31] = s11 >> 17;
}
/* New code */
/* From fe_pow22523.c */
static void fe_divpowm1(fe r, const fe u, const fe v) {
fe v3, uv7, t0, t1, t2;
void fe_pow22523(fe out, const fe z) {
fe t0;
fe t1;
fe t2;
int i;
fe_sq(v3, v);
fe_mul(v3, v3, v); /* v3 = v^3 */
fe_sq(uv7, v3);
fe_mul(uv7, uv7, v);
fe_mul(uv7, uv7, u); /* uv7 = uv^7 */
/*fe_pow22523(uv7, uv7);*/
/* From fe_pow22523.c */
fe_sq(t0, uv7);
fe_sq(t0, z);
fe_sq(t1, t0);
fe_sq(t1, t1);
fe_mul(t1, uv7, t1);
fe_mul(t1, z, t1);
fe_mul(t0, t0, t1);
fe_sq(t0, t0);
fe_mul(t0, t1, t0);
@@ -2013,12 +2112,24 @@ static void fe_divpowm1(fe r, const fe u, const fe v) {
fe_mul(t0, t1, t0);
fe_sq(t0, t0);
fe_sq(t0, t0);
fe_mul(t0, t0, uv7);
fe_mul(out, t0, z);
}
/* End fe_pow22523.c */
/* t0 = (uv^7)^((q-5)/8) */
fe_mul(t0, t0, v3);
fe_mul(r, t0, u); /* u^(m+1)v^(-(m+1)) */
/* New code */
static void fe_divpowm1(fe r, const fe u, const fe v) {
fe v3, uv7;
fe_sq(v3, v);
fe_mul(v3, v3, v); /* v3 = v^3 */
fe_sq(uv7, v3);
fe_mul(uv7, uv7, v);
fe_mul(uv7, uv7, u); /* uv7 = uv^7 */
fe_pow22523(r, uv7); /* (uv^7)^((q-5)/8) */
fe_mul(r, r, v3);
fe_mul(r, r, u); /* u^(m+1)v^(-(m+1)) */
}
static void ge_cached_0(ge_cached *r) {
@@ -2096,6 +2207,43 @@ void ge_scalarmult(ge_p2 *r, const unsigned char *a, const ge_p3 *A) {
}
}
void ge_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A) {
signed char aslide[256];
ge_dsmp Ai; /* A, 3A, 5A, 7A, 9A, 11A, 13A, 15A */
ge_p1p1 t;
ge_p3 u;
ge_p2 r_p2;
int i;
slide(aslide, a);
ge_dsm_precomp(Ai, A);
ge_p2_0(&r_p2);
ge_p2_0(r);
for (i = 255; i >= 0; --i) {
if (aslide[i]) break;
}
for (; i >= 0; --i) {
ge_p2_dbl(&t, &r_p2);
if (aslide[i] > 0) {
ge_p1p1_to_p3(&u, &t);
ge_add(&t, &u, &Ai[aslide[i] / 2]);
}
else if (aslide[i] < 0) {
ge_p1p1_to_p3(&u, &t);
ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
}
if (i != 0)
ge_p1p1_to_p2(&r_p2, &t);
else
ge_p1p1_to_p2(r, &t); // last step
}
}
void ge_scalarmult_p3(ge_p3 *r3, const unsigned char *a, const ge_p3 *A) {
signed char e[64];
int carry, carry2, i;
@@ -2431,6 +2579,14 @@ void sc_0(unsigned char *s) {
}
}
void sc_1(unsigned char *s) {
int i;
s[0] = 1;
for (i = 1; i < 32; i++) {
s[i] = 0;
}
}
void sc_reduce32(unsigned char *s) {
int64_t s0 = 2097151 & load_3(s);
int64_t s1 = 2097151 & (load_4(s + 2) >> 5);
@@ -3831,6 +3987,92 @@ int sc_isnonzero(const unsigned char *s) {
s[27] | s[28] | s[29] | s[30] | s[31]) - 1) >> 8) + 1;
}
static void edwardsYZ_to_x25519(unsigned char *xbytes, const fe Y, const fe Z) {
// y = Y/Z
// x_mont = (1 + y) / (1 - y)
// = (1 + Y/Z) / (1 - Y/Z)
// = (Z + Y) / (Z - Y)
fe tmp0;
fe tmp1;
fe_add(tmp0, Z, Y); // Z + Y
fe_sub(tmp1, Z, Y); // Z - Y
fe_invert(tmp1, tmp1); // 1/(Z - Y)
fe_mul(tmp0, tmp0, tmp1); // (Z + Y) / (Z - Y)
fe_tobytes(xbytes, tmp0); // tobytes((Z + Y) / (Z - Y))
}
void ge_p3_to_x25519(unsigned char *xbytes, const ge_p3 *h)
{
edwardsYZ_to_x25519(xbytes, h->Y, h->Z);
}
int edwards_bytes_to_x25519_vartime(unsigned char *xbytes, const unsigned char *s)
{
/* From fe_frombytes.c */
int64_t h0 = load_4(s);
int64_t h1 = load_3(s + 4) << 6;
int64_t h2 = load_3(s + 7) << 5;
int64_t h3 = load_3(s + 10) << 3;
int64_t h4 = load_3(s + 13) << 2;
int64_t h5 = load_4(s + 16);
int64_t h6 = load_3(s + 20) << 7;
int64_t h7 = load_3(s + 23) << 5;
int64_t h8 = load_3(s + 26) << 4;
int64_t h9 = (load_3(s + 29) & 8388607) << 2;
int64_t carry0;
int64_t carry1;
int64_t carry2;
int64_t carry3;
int64_t carry4;
int64_t carry5;
int64_t carry6;
int64_t carry7;
int64_t carry8;
int64_t carry9;
/* Validate the number to be canonical */
if (h9 == 33554428 && h8 == 268435440 && h7 == 536870880 && h6 == 2147483520 &&
h5 == 4294967295 && h4 == 67108860 && h3 == 134217720 && h2 == 536870880 &&
h1 == 1073741760 && h0 >= 4294967277) {
return -1;
}
carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;
carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;
carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;
carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;
carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;
carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;
carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;
carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;
fe Y;
Y[0] = h0;
Y[1] = h1;
Y[2] = h2;
Y[3] = h3;
Y[4] = h4;
Y[5] = h5;
Y[6] = h6;
Y[7] = h7;
Y[8] = h8;
Y[9] = h9;
/* End fe_frombytes.c */
fe Z;
fe_1(Z);
edwardsYZ_to_x25519(xbytes, Y, Z);
return 0;
}
int ge_p3_is_point_at_infinity_vartime(const ge_p3 *p) {
// https://eprint.iacr.org/2008/522
// X == T == 0 and Y/Z == 1
@@ -3879,3 +4121,67 @@ int ge_p3_is_point_at_infinity_vartime(const ge_p3 *p) {
// Y/Z = 0/0
return 0;
}
// https://www.ietf.org/archive/id/draft-ietf-lwig-curve-representations-02.pdf E.2
static void fe_ed_derivatives_to_wei_x(unsigned char *wei_x, const fe inv_one_minus_y, const fe one_plus_y)
{
// (1/(1-y))*(1+y)
fe inv_one_minus_y_mul_one_plus_y;
fe_mul(inv_one_minus_y_mul_one_plus_y, inv_one_minus_y, one_plus_y);
// wei x = (1/(1-y))*(1+y) + (A/3)
fe wei_x_fe;
fe_add(wei_x_fe, inv_one_minus_y_mul_one_plus_y, fe_a_inv_3);
fe_tobytes(wei_x, wei_x_fe);
}
// https://www.ietf.org/archive/id/draft-ietf-lwig-curve-representations-02.pdf E.2
void fe_ed_derivatives_to_wei_x_y(unsigned char *wei_x, unsigned char *wei_y, const fe inv_one_minus_y, const fe one_plus_y, const fe inv_one_minus_y_mul_x)
{
fe_ed_derivatives_to_wei_x(wei_x, inv_one_minus_y, one_plus_y);
// c*(1+y)
fe fe_c_mul_one_plus_y;
fe_mul(fe_c_mul_one_plus_y, fe_c, one_plus_y);
// wei y = c * (1+y) * (1/((1-y)*x))
fe wei_y_fe;
fe_mul(wei_y_fe, fe_c_mul_one_plus_y, inv_one_minus_y_mul_x);
fe_tobytes(wei_y, wei_y_fe);
}
/*
Since fe_add and fe_sub enforce the following conditions:
Preconditions:
|f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
|g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
Postconditions:
|h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
We sometimes need to "reduce" field elems when they are in the poscondition's
larger domain to match the precondition domain. This way we can take the output
of fe_add or fe_sub and use it as input to another call to fe_add or fe_sub.
We reduce by converting the field elem to its byte repr, then re-deriving the
field elem from the byte repr.
*/
void fe_reduce(fe reduced_f, const fe f)
{
unsigned char f_bytes[32];
fe_tobytes(f_bytes, f);
fe_frombytes_vartime(reduced_f, f_bytes);
}
void fe_dbl(fe h, const fe f)
{
// Reduce the input for safety to ensure we meet the preconditions for fe_add
fe f_reduced;
fe_reduce(f_reduced, f);
fe h_res;
fe_add(h_res, f_reduced, f_reduced);
// Reduce the output for safety to ensure the result can be used as input to
// fe_add or fe_sub without an extra call to fe_reduce
fe_reduce(h, h_res);
}
+41 -1
View File
@@ -1,4 +1,4 @@
// Copyright (c) 2014-2020, The Monero Project
// Copyright (c) 2014-2024, The Monero Project
//
// All rights reserved.
//
@@ -30,6 +30,8 @@
#pragma once
#include <stdint.h>
/* From fe.h */
typedef int32_t fe[10];
@@ -86,6 +88,7 @@ void ge_double_scalarmult_base_vartime_p3(ge_p3 *, const unsigned char *, const
extern const fe fe_sqrtm1;
extern const fe fe_d;
int fe_frombytes_vartime(fe, const unsigned char *);
int ge_frombytes_vartime(ge_p3 *, const unsigned char *);
/* From ge_p1p1_to_p2.c */
@@ -118,6 +121,8 @@ void ge_p3_tobytes(unsigned char *, const ge_p3 *);
extern const ge_precomp ge_base[32][8];
void ge_scalarmult_base(ge_p3 *, const unsigned char *);
void ge_scalarmult_base_vartime(ge_p3 *h, const unsigned char *a);
/* From ge_tobytes.c */
void ge_tobytes(unsigned char *, const ge_p2 *);
@@ -126,25 +131,40 @@ void ge_tobytes(unsigned char *, const ge_p2 *);
void sc_reduce(unsigned char *);
/* From fe_pow22523.c */
void fe_pow22523(fe, const fe);
/* New code */
void ge_scalarmult(ge_p2 *, const unsigned char *, const ge_p3 *);
void ge_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A);
void ge_scalarmult_p3(ge_p3 *, const unsigned char *, const ge_p3 *);
void ge_double_scalarmult_precomp_vartime(ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *, const ge_dsmp);
void ge_triple_scalarmult_precomp_vartime(ge_p2 *, const unsigned char *, const ge_dsmp, const unsigned char *, const ge_dsmp, const unsigned char *, const ge_dsmp);
void ge_double_scalarmult_precomp_vartime2(ge_p2 *, const unsigned char *, const ge_dsmp, const unsigned char *, const ge_dsmp);
void ge_double_scalarmult_precomp_vartime2_p3(ge_p3 *, const unsigned char *, const ge_dsmp, const unsigned char *, const ge_dsmp);
void ge_mul8(ge_p1p1 *, const ge_p2 *);
extern const fe fe_a_sub_d;
extern const fe fe_a0;
extern const fe fe_ap;
extern const fe fe_msqrt2b;
extern const fe fe_ma2;
extern const fe fe_ma;
extern const fe fe_fffb1;
extern const fe fe_fffb2;
extern const fe fe_fffb3;
extern const fe fe_fffb4;
extern const fe fe_a_inv_3;
extern const fe fe_c;
extern const fe fe_one;
extern const fe fe_m1;
extern const fe fe_inv2;
extern const ge_p3 ge_p3_identity;
extern const ge_p3 ge_p3_H;
void ge_fromfe_frombytes_vartime(ge_p2 *, const unsigned char *);
void sc_0(unsigned char *);
void sc_1(unsigned char *);
void sc_reduce32(unsigned char *);
void sc_add(unsigned char *, const unsigned char *, const unsigned char *);
void sc_sub(unsigned char *, const unsigned char *, const unsigned char *);
@@ -154,12 +174,32 @@ void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b,
int sc_check(const unsigned char *);
int sc_isnonzero(const unsigned char *); /* Doesn't normalize */
/**
* brief: Convert Ed25519 y-coord to X25519 x-coord, AKA "ConvertPointE()" in the Carrot spec
*/
void ge_p3_to_x25519(unsigned char *xbytes, const ge_p3 *h);
int edwards_bytes_to_x25519_vartime(unsigned char *xbytes, const unsigned char *s);
// internal
uint64_t load_3(const unsigned char *in);
uint64_t load_4(const unsigned char *in);
void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q);
void fe_add(fe h, const fe f, const fe g);
void fe_neg(fe h, const fe f);
void fe_tobytes(unsigned char *, const fe);
void fe_copy(fe h, const fe f);
int fe_isnegative(const fe f);
void fe_invert(fe out, const fe z);
int fe_batch_invert(fe *out, const fe *in, const int n);
void fe_mul(fe out, const fe, const fe);
void fe_sq(fe h, const fe f);
void fe_sub(fe h, const fe f, const fe g);
void fe_0(fe h);
void fe_1(fe h);
int ge_p3_is_point_at_infinity_vartime(const ge_p3 *p);
void fe_ed_derivatives_to_wei_x_y(unsigned char *wei_x, unsigned char *wei_y, const fe inv_one_minus_y, const fe one_plus_y, const fe inv_one_minus_y_mul_x);
void fe_reduce(fe reduced_f, const fe f);
void fe_dbl(fe h, const fe f);
+251
View File
@@ -0,0 +1,251 @@
// Copyright (c) 2024, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifdef _MSC_VER
#pragma warning(disable: 4800)
#endif
extern "C" {
#include "crypto-ops.h"
}
#include "fcmp_pp_crypto.h"
#include <cstring>
static bool fe_compare(const fe a, const fe b)
{
unsigned char a_bytes[32];
unsigned char b_bytes[32];
fe_tobytes(a_bytes, a);
fe_tobytes(b_bytes, b);
return memcmp(a_bytes, b_bytes, sizeof(a_bytes)) == 0;
}
static bool sqrt_ext(fe y, const fe x)
{
fe y_res;
fe x2;
fe_dbl(x2, x);
fe b;
fe_pow22523(b, x2);
fe b_sq;
fe_sq(b_sq, b);
fe c;
fe_mul(c, x2, b_sq);
if (fe_compare(c, fe_one) || fe_compare(c, fe_m1))
{
fe_0(c);
c[0] = 3;
}
fe c_sub_1;
fe_sub(c_sub_1, c, fe_one);
fe_mul(y_res, x, b);
fe_mul(y_res, y_res, c_sub_1);
if (fe_isnegative(y_res)) {
fe_neg(y_res, y_res);
}
fe y_sq;
fe_sq(y_sq, y_res);
bool r = fe_compare(x, y_sq);
fe_copy(y, y_res);
return r;
};
namespace fcmp_pp
{
// TODO: impl faster sqrt
bool sqrt(fe y, const fe x)
{
return sqrt_ext(y, x);
};
} // namespace fcmp_pp
static void inv_iso(fe u_out, fe w_out, const fe u, const fe w)
{
// 4u
fe_dbl(u_out, u);
fe_dbl(u_out, u_out);
// 2w
fe_dbl(w_out, w);
};
static void inv_psi1(fe e_out, fe u_out, fe w_out, const fe e, const fe u, const fe w)
{
fe e_res, u_res, w_res;
fe tt;
bool cc = sqrt_ext(tt, u);
fe_copy(w_res, tt);
fe w_;
fe_copy(w_, w);
fe_copy(e_res, e);
if (!cc)
{
fe tt_sq;
fe_sq(tt_sq, tt);
fe neg_u_dbl;
fe_dbl(neg_u_dbl, u);
fe_neg(neg_u_dbl, neg_u_dbl);
if (fe_compare(tt_sq, neg_u_dbl)) {
fe_mul(tt, tt, fe_sqrtm1);
}
fe_mul(w_, w, tt);
fe e_sq;
fe_sq(e_sq, e);
fe_mul(w_res, fe_msqrt2b, e_sq);
fe_mul(e_res, e_res, tt);
}
fe w_res_sq;
fe_sq(w_res_sq, w_res);
fe e_res_sq;
fe_sq(e_res_sq, e_res);
fe A_e_sq;
fe_mul(A_e_sq, fe_a0, e_res_sq);
fe w_res_w;
fe_mul(w_res_w, w_res, w_);
fe_sub(u_res, w_res_sq, A_e_sq);
fe_reduce(u_res, u_res);
fe_sub(u_res, u_res, w_res_w);
fe_mul(u_res, u_res, fe_inv2);
fe_copy(e_out, e_res);
fe_copy(u_out, u_res);
fe_copy(w_out, w_res);
};
static bool inv_psi2(fe u_out, fe w_out, const fe e, const fe u, const fe w)
{
fe u_res, w_res;
if (!fcmp_pp::sqrt(w_res, u))
return false;
fe e_sq;
fe_sq(e_sq, e);
fe Ap_e_sq;
fe_mul(Ap_e_sq, fe_ap, e_sq);
fe w_res_w;
fe_mul(w_res_w, w_res, w);
fe_sub(u_res, u, Ap_e_sq);
fe_reduce(u_res, u_res);
fe_sub(u_res, u_res, w_res_w);
fe_mul(u_res, u_res, fe_inv2);
fe_copy(u_out, u_res);
fe_copy(w_out, w_res);
return true;
};
namespace fcmp_pp
{
//----------------------------------------------------------------------------------------------------------------------
bool mul8_is_identity(const ge_p3 &point) {
ge_p2 point_ge_p2;
ge_p3_to_p2(&point_ge_p2, &point);
ge_p1p1 point_mul8;
ge_mul8(&point_mul8, &point_ge_p2);
ge_p3 point_mul8_p3;
ge_p1p1_to_p3(&point_mul8_p3, &point_mul8);
return ge_p3_is_point_at_infinity_vartime(&point_mul8_p3);
}
//----------------------------------------------------------------------------------------------------------------------
// https://github.com/kayabaNerve/fcmp-plus-plus/blob/94744c5324e869a9483bbbd93a864e108304bf76/crypto/divisors/src/tests/torsion_check.rs
// Returns true if point is torsion free
// Pre-condition: point is a valid point and point*8 not equal to identity
// WARNING1: this approach needs to be carefully vetted academically and audited
// before it can be used in production.
// WARNING2: since fe_add and fe_sub expect the input fe's to be within a
// smaller domain than the output fe, we sometimes need to "reduce" a field elem
// to chain calls to fe_add and fe_sub. Notice all calls to fe_reduce.
bool torsion_check_vartime(const ge_p3 &point) {
//assert(!mul8_is_identity(point));
// ed to wei
fe e, u, w;
{
fe z_plus_ed_y, z_minus_ed_y;
fe_add(z_plus_ed_y, fe_one, point.Y);
fe_sub(z_minus_ed_y, fe_one, point.Y);
// e
fe_mul(e, z_minus_ed_y, point.X);
// u
fe_mul(u, fe_a_sub_d, z_plus_ed_y);
fe_mul(u, u, point.X);
fe_mul(u, u, e);
// w
fe_dbl(w, z_minus_ed_y);
}
//assert(check_e_u_w(e, u, w));
// Torsion check
for (int i = 0; i < 2; ++i) {
inv_iso(u, w, u, w);
if (!inv_psi2(u, w, e, u, w)) {
return false;
}
inv_psi1(e, u, w, e, u, w);
//assert(check_e_u_w(e, u, w));
}
fe _;
inv_iso(u, _, u, w);
if (!sqrt(u, u)) {
return false;
}
return true;
}
//----------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------
}//namespace fcmp_pp
+36
View File
@@ -0,0 +1,36 @@
// Copyright (c) 2024, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#pragma once
namespace fcmp_pp
{
bool sqrt(fe y, const fe x);
bool mul8_is_identity(const ge_p3 &point);
bool torsion_check_vartime(const ge_p3 &point);
} //namespace fcmp_pp
+17 -19
View File
@@ -1,19 +1,19 @@
diff --git a/src/crypto/rand/windows.cc b/src/crypto/rand/windows.cc
index 59df467e7..aa5ac076c 100644
--- a/src/crypto/rand/windows.cc
+++ b/src/crypto/rand/windows.cc
diff --git a/crypto/rand/windows.cc b/crypto/rand/windows.cc
index ebd0d4afd..65e877f0e 100644
--- a/crypto/rand/windows.cc
+++ b/crypto/rand/windows.cc
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include <windows.h>
+#include <wincrypt.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && \
!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
@@ -57,16 +58,40 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) {
using namespace bssl;
@@ -59,16 +60,39 @@ void bssl::CRYPTO_sysrand(uint8_t *out, size_t requested) {
// See: https://learn.microsoft.com/en-us/windows/win32/seccng/processprng
typedef BOOL (WINAPI *ProcessPrngFunction)(PBYTE pbData, SIZE_T cbData);
static ProcessPrngFunction g_processprng_fn = NULL;
typedef BOOL(WINAPI *ProcessPrngFunction)(PBYTE pbData, SIZE_T cbData);
static ProcessPrngFunction g_processprng_fn = nullptr;
+static HCRYPTPROV g_hCryptProv = 0;
+
+static BOOL WINAPI wrapper_CryptGenRandom(PBYTE pbData, SIZE_T cbData)
@@ -21,21 +21,19 @@ index 59df467e7..aa5ac076c 100644
+ return CryptGenRandom(g_hCryptProv, cbData, pbData);
+}
static void init_processprng(void) {
static void init_processprng() {
HMODULE hmod = LoadLibraryW(L"bcryptprimitives");
- if (hmod == NULL) {
- if (hmod == nullptr) {
- abort();
- }
- g_processprng_fn = (ProcessPrngFunction)GetProcAddress(hmod, "ProcessPrng");
- if (g_processprng_fn == NULL) {
- abort();
+
+ if (hmod) {
+ g_processprng_fn = (ProcessPrngFunction)GetProcAddress(hmod, "ProcessPrng");
+ if (g_processprng_fn) {
+ return;
+ }
+ }
}
- g_processprng_fn = (ProcessPrngFunction)GetProcAddress(hmod, "ProcessPrng");
- if (g_processprng_fn == nullptr) {
- abort();
+
+ if (CryptAcquireContext(&g_hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
+ g_processprng_fn = &wrapper_CryptGenRandom;
@@ -51,9 +49,9 @@ index 59df467e7..aa5ac076c 100644
+ else {
+ err = GetLastError();
+ }
+ }
+ }
+
+ abort();
}
void CRYPTO_init_sysrand(void) {
void bssl::CRYPTO_init_sysrand() {
+2 -2
View File
@@ -11,12 +11,12 @@ if [ $? -ne 0 ]; then
images/ubuntu/build.sh
fi
for i in 8 15;
for i in 8 16;
do
gcc/build.sh $1 $i
done
for i in 17 21;
for i in 17 22;
do
clang/build.sh $1 $i
done
-2
View File
@@ -1,6 +1,4 @@
#!/bin/sh
set -e
cd /p2pool
mkdir build && cd build
-2
View File
@@ -1,6 +1,4 @@
#!/bin/sh
set -e
cd /p2pool
mkdir build && cd build
@@ -106,11 +106,11 @@ mkdir build && cd build
make -j$(nproc)
make install
echo "Installing GCC 15.1.0"
echo "Installing GCC 15.2.0"
cd /root
git clone --depth 1 --branch releases/gcc-15.1.0 --jobs $(nproc) git://gcc.gnu.org/git/gcc.git gcc-15
git clone --depth 1 --branch releases/gcc-15.2.0 --jobs $(nproc) git://gcc.gnu.org/git/gcc.git gcc-15
cd gcc-15
contrib/download_prerequisites
@@ -120,6 +120,20 @@ mkdir build && cd build
make -j$(nproc)
make install
echo "Installing GCC 16.1.0"
cd /root
git clone --depth 1 --branch releases/gcc-16.1.0 --jobs $(nproc) git://gcc.gnu.org/git/gcc.git gcc-16
cd gcc-16
contrib/download_prerequisites
mkdir build && cd build
../configure --enable-languages=c,c++ --disable-multilib --disable-bootstrap --prefix=/usr/local/gcc-16
make -j$(nproc)
make install
echo "Installing clang"
cd /root
@@ -127,7 +141,7 @@ cd /root
curl -L -O https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
for i in 17 18 19 20 21;
for i in 17 18 19 20 21 22;
do
./llvm.sh $i
done
@@ -20,9 +20,8 @@ flags_libs="--target=aarch64-unknown-freebsd12.0 --sysroot=/usr/local/cross-free
flags_p2pool="--target=aarch64-unknown-freebsd12.0 --sysroot=/usr/local/cross-freebsd-aarch64 -fuse-ld=lld -Wno-unused-command-line-argument $flags_size $flags_datetime"
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/freebsd_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/freebsd_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -38,7 +37,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/freebsd_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=aarch64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/freebsd_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=aarch64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -53,4 +52,4 @@ chmod 0775 $1/p2pool
tar cvf $1.tar --format=pax --pax-option='exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime' --sort=name --owner=0 --group=0 --mtime="$CURRENT_DATE $CURRENT_TIME" $1
touch -t $TOUCH_DATE $1.tar
7z a -tgzip -mx9 -mfb256 -stl $1.tar.gz $1.tar
7z a -tgzip -mx9 -mfb256 -mpass15 -stl $1.tar.gz $1.tar
@@ -20,9 +20,8 @@ flags_libs="--target=x86_64-unknown-freebsd12.0 --sysroot=/usr/local/cross-freeb
flags_p2pool="--target=x86_64-unknown-freebsd12.0 --sysroot=/usr/local/cross-freebsd-x86_64 -fuse-ld=lld -Wno-unused-command-line-argument $flags_size $flags_datetime"
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/freebsd_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/freebsd_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -38,7 +37,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/freebsd_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=x86_64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/freebsd_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=x86_64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -53,4 +52,4 @@ chmod 0775 $1/p2pool
tar cvf $1.tar --format=pax --pax-option='exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime' --sort=name --owner=0 --group=0 --mtime="$CURRENT_DATE $CURRENT_TIME" $1
touch -t $TOUCH_DATE $1.tar
7z a -tgzip -mx9 -mfb256 -stl $1.tar.gz $1.tar
7z a -tgzip -mx9 -mfb256 -mpass15 -stl $1.tar.gz $1.tar
+1 -1
View File
@@ -1,3 +1,3 @@
FROM ubuntu:24.04
ADD prepare.sh /
ADD prepare.sh clang_version.patch /
RUN /prepare.sh
@@ -0,0 +1,15 @@
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index cce839295..b87fe998e 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -873,9 +873,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL));
#undef TOSTR
#undef TOSTR2
- Builder.defineMacro("__clang_version__",
- "\"" CLANG_VERSION_STRING " "
- + getClangFullRepositoryVersion() + "\"");
+ Builder.defineMacro("__clang_version__", "\"" CLANG_VERSION_STRING "\"");
if (LangOpts.GNUCVersion != 0) {
// Major, minor, patch, are given two decimal places each, so 4.2.1 becomes
+155 -145
View File
@@ -3,27 +3,28 @@ set -e
# Software versions to install
_7ZIP_VERSION=2409
BINUTILS_VERSION=2_44
CLANG_VERSION=20.1.8
CMAKE_VERSION=4.0.3
_7ZIP_VERSION=2601
BINUTILS_VERSION=2_46
CLANG_VERSION=21.1.8
CMAKE_VERSION=4.3.2
FREEBSD_VERSION=12.4
GCC_VERSION=15.1.0
GLIBC_VERSION=2.41
LINUX_HEADERS_VERSION=6.15.4
MACOSX_SDK_VERSION=15.5
GCC_VERSION=16.1.0
GLIBC_VERSION=2.43
LINUX_HEADERS_VERSION=6.19.14
MACOSX_SDK_VERSION=26.1
OSXCROSS_VERSION=2bc739ebe45db5d72e176d2a4e1c7dd95464e8e2
MAKE_VERSION=4.4.1
MINGW_VERSION=13.0.0
XZ_VERSION=5.8.1
MINGW_VERSION=14.0.0
XZ_VERSION=5.8.3
TAR_VERSION=1.35
_7ZIP_SHA256="914c7e20ad5ef8e4d3cf08620ff8894b28fe11b7eb99809d6930870fbe48a281"
CMAKE_SHA256="585ae9e013107bc8e7c7c9ce872cbdcbdff569e675b07ef57aacfb88c886faac"
_7ZIP_SHA256="8ea0fc8a135e7b848e80a4116fe22dff56c8c4518dde1f43cce67f4e340b437a"
CMAKE_SHA256="791ae3604841ca03cb3889a3ad89165346e4b180ae3448efd4b0caa9ef46d245"
FREEBSD_AARCH64_SHA256="6c401819bfb93e810c9f9aa670a1e4685f924df5e7e0c9c6397dd6c16c954fa2"
FREEBSD_X86_64_SHA256="581c7edacfd2fca2bdf5791f667402d22fccd8a5e184635e0cac075564d57aa8"
GLIBC_SHA256="a5a26b22f545d6b7d7b3dd828e11e428f24f4fac43c934fb071b6a7d0828e901"
HEADERS_SHA256="0eafd627b602f58d73917d00e4fc3196ba18cba67df6995a42aa74744d8efa16"
MACOSX_SDK_SHA256="c15cf0f3f17d714d1aa5a642da8e118db53d79429eb015771ba816aa7c6c1cbd"
GLIBC_SHA256="d9c86c6b5dbddb43a3e08270c5844fc5177d19442cf5b8df4be7c07cd5fa3831"
HEADERS_SHA256="cde8bf6739be4a0777fedbbba5330b8188c55680c45a922a4dfa289cbec6f185"
MACOSX_SDK_SHA256="beee7212d265a6d2867d0236cc069314b38d5fb3486a6515734e76fa210c784c"
MAKE_SHA256="dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3"
TAR_SHA256="4d62ff37342ec7aed748535323930c7cf94acf71c3591882b26a7ea50f3edc16"
@@ -32,15 +33,59 @@ echo "Install prerequisites"
export DEBIAN_FRONTEND=noninteractive
apt-get update && apt-get upgrade -yq --no-install-recommends
apt-get install -yq --no-install-recommends ca-certificates curl bzip2 flex texinfo bison ninja-build python3 file rsync xz-utils gawk gettext patch git gcc g++ make
apt-get install -yq --no-install-recommends ca-certificates curl bzip2 flex texinfo bison ninja-build python3 python3-yaml file rsync xz-utils gawk gettext patch git gcc g++
echo "Install 7-zip"
echo "Cloning the P2Pool repository in background"
cd /
git clone --recursive --jobs $(nproc) https://github.com/SChernykh/p2pool &
echo "Download archives"
cd /root
MAKE_NAME=make-$MAKE_VERSION
MAKE_FILE=$MAKE_NAME.tar.gz
_7ZIP_FILE=7z$_7ZIP_VERSION-linux-x64.tar.xz
curl -L -O https://7-zip.org/a/$_7ZIP_FILE
CMAKE_NAME=cmake-$CMAKE_VERSION-linux-x86_64
CMAKE_FILE=$CMAKE_NAME.tar.gz
HEADERS_FILE=linux-$LINUX_HEADERS_VERSION.tar.xz
GLIBC_FILE=glibc-$GLIBC_VERSION.tar.xz
MACOSX_SDK_FILE=MacOSX$MACOSX_SDK_VERSION.sdk.tar.xz
FREEBSD_FILE=base.txz
TAR_FILE=tar-$TAR_VERSION.tar.xz
mkdir /usr/local/cross-freebsd-x86_64
mkdir /usr/local/cross-freebsd-aarch64
curl -L -Z \
-O https://ftpmirror.gnu.org/make/$MAKE_FILE \
-O https://7-zip.org/a/$_7ZIP_FILE \
-O https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/$CMAKE_FILE \
-O https://www.kernel.org/pub/linux/kernel/v6.x/$HEADERS_FILE \
-O https://ftpmirror.gnu.org/glibc/$GLIBC_FILE \
-O https://github.com/joseluisq/macosx-sdks/releases/download/$MACOSX_SDK_VERSION/$MACOSX_SDK_FILE \
-o /usr/local/cross-freebsd-x86_64/$FREEBSD_FILE https://archive.freebsd.org/old-releases/amd64/$FREEBSD_VERSION-RELEASE/$FREEBSD_FILE \
-o /usr/local/cross-freebsd-aarch64/$FREEBSD_FILE https://archive.freebsd.org/old-releases/arm64/$FREEBSD_VERSION-RELEASE/$FREEBSD_FILE \
-O https://ftpmirror.gnu.org/tar/$TAR_FILE
echo "Verifying checksums"
cd /root
MAKE_FILE_SHA256="$(sha256sum $MAKE_FILE | awk '{ print $1 }')"
if [ $MAKE_FILE_SHA256 != $MAKE_SHA256 ]; then
echo "Error: SHA256 sum does not match for $MAKE_FILE - expected $MAKE_SHA256, got $MAKE_FILE_SHA256"
exit 1
fi
_7ZIP_FILE_SHA256="$(sha256sum $_7ZIP_FILE | awk '{ print $1 }')"
@@ -49,6 +94,88 @@ if [ $_7ZIP_FILE_SHA256 != $_7ZIP_SHA256 ]; then
exit 1
fi
CMAKE_FILE_SHA256="$(sha256sum $CMAKE_FILE | awk '{ print $1 }')"
if [ $CMAKE_FILE_SHA256 != $CMAKE_SHA256 ]; then
echo "Error: SHA256 sum does not match for $CMAKE_FILE - expected $CMAKE_SHA256, got $CMAKE_FILE_SHA256"
exit 1
fi
HEADERS_FILE_SHA256="$(sha256sum $HEADERS_FILE | awk '{ print $1 }')"
if [ $HEADERS_FILE_SHA256 != $HEADERS_SHA256 ]; then
echo "Error: SHA256 sum does not match for $HEADERS_FILE - expected $HEADERS_SHA256, got $HEADERS_FILE_SHA256"
exit 1
fi
GLIBC_FILE_SHA256="$(sha256sum $GLIBC_FILE | awk '{ print $1 }')"
if [ $GLIBC_FILE_SHA256 != $GLIBC_SHA256 ]; then
echo "Error: SHA256 sum does not match for $GLIBC_FILE - expected $GLIBC_SHA256, got $GLIBC_FILE_SHA256"
exit 1
fi
MACOSX_SDK_FILE_SHA256="$(sha256sum $MACOSX_SDK_FILE | awk '{ print $1 }')"
if [ $MACOSX_SDK_FILE_SHA256 != $MACOSX_SDK_SHA256 ]; then
echo "Error: SHA256 sum does not match for $MACOSX_SDK_FILE - expected $MACOSX_SDK_SHA256, got $MACOSX_SDK_FILE_SHA256"
exit 1
fi
cd /usr/local/cross-freebsd-x86_64
FREEBSD_X86_64_FILE_SHA256="$(sha256sum $FREEBSD_FILE | awk '{ print $1 }')"
if [ $FREEBSD_X86_64_FILE_SHA256 != $FREEBSD_X86_64_SHA256 ]; then
echo "Error: SHA256 sum does not match for $FREEBSD_FILE - expected $FREEBSD_X86_64_SHA256, got $FREEBSD_X86_64_FILE_SHA256"
exit 1
fi
cd /usr/local/cross-freebsd-aarch64
FREEBSD_AARCH64_FILE_SHA256="$(sha256sum $FREEBSD_FILE | awk '{ print $1 }')"
if [ $FREEBSD_AARCH64_FILE_SHA256 != $FREEBSD_AARCH64_SHA256 ]; then
echo "Error: SHA256 sum does not match for $FREEBSD_FILE - expected $FREEBSD_AARCH64_SHA256, got $FREEBSD_AARCH64_FILE_SHA256"
exit 1
fi
cd /root
TAR_FILE_SHA256="$(sha256sum $TAR_FILE | awk '{ print $1 }')"
if [ $TAR_FILE_SHA256 != $TAR_SHA256 ]; then
echo "Error: SHA256 sum does not match for $TAR_FILE - expected $TAR_SHA256, got $TAR_FILE_SHA256"
exit 1
fi
echo "Cloning repositories"
cd /root
git clone --depth 1 --branch releases/gcc-$GCC_VERSION git://gcc.gnu.org/git/gcc.git
git clone --depth 1 --branch binutils-$BINUTILS_VERSION git://sourceware.org/git/binutils-gdb.git
git clone --depth 1 --branch llvmorg-$CLANG_VERSION https://github.com/llvm/llvm-project.git
git clone --depth=1 --branch v$MINGW_VERSION https://git.code.sf.net/p/mingw-w64/mingw-w64 mingw-w64-v$MINGW_VERSION
git clone --branch 2.0-llvm-based https://github.com/tpoechtrager/osxcross
git clone --depth=1 --branch v$XZ_VERSION https://github.com/tukaani-project/xz
mv /root/$MACOSX_SDK_FILE osxcross/tarballs
echo "Install make"
cd /root
tar xvf $MAKE_FILE
cd $MAKE_NAME
CFLAGS='-O2' ./configure --disable-dependency-tracking
./build.sh
./make install
echo "Install 7-zip"
cd /root
tar xf $_7ZIP_FILE
cp -f 7zz /usr/local/bin/7z
@@ -56,7 +183,6 @@ echo "Install GCC"
cd /root
git clone --depth 1 --branch releases/gcc-$GCC_VERSION git://gcc.gnu.org/git/gcc.git
rm -rf gcc/.git
cd gcc
@@ -83,7 +209,6 @@ echo "Install binutils"
cd /root
git clone --depth 1 --branch binutils-$BINUTILS_VERSION git://sourceware.org/git/binutils-gdb.git
rm -rf binutils-gdb/.git
cp -r binutils-gdb binutils-gdb-aarch64
@@ -100,53 +225,20 @@ echo "Install cmake"
cd /root
CMAKE_NAME=cmake-$CMAKE_VERSION-linux-x86_64
CMAKE_FILE=$CMAKE_NAME.tar.gz
curl -L -O https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/$CMAKE_FILE
CMAKE_FILE_SHA256="$(sha256sum $CMAKE_FILE | awk '{ print $1 }')"
if [ $CMAKE_FILE_SHA256 != $CMAKE_SHA256 ]; then
echo "Error: SHA256 sum does not match for $CMAKE_FILE - expected $CMAKE_SHA256, got $CMAKE_FILE_SHA256"
exit 1
fi
tar xvf $CMAKE_FILE
cp $CMAKE_NAME/bin/* /usr/local/bin
cp -r $CMAKE_NAME/share/cmake-4.0 /usr/local/share
echo "Install make"
cd /root
MAKE_NAME=make-$MAKE_VERSION
MAKE_FILE=$MAKE_NAME.tar.gz
curl -L -O https://ftpmirror.gnu.org/make/$MAKE_FILE
MAKE_FILE_SHA256="$(sha256sum $MAKE_FILE | awk '{ print $1 }')"
if [ $MAKE_FILE_SHA256 != $MAKE_SHA256 ]; then
echo "Error: SHA256 sum does not match for $MAKE_FILE - expected $MAKE_SHA256, got $MAKE_FILE_SHA256"
exit 1
fi
tar xvf $MAKE_FILE
cd $MAKE_NAME
CFLAGS='-O2' ./configure
make
cp -f make /usr/bin
cp -r $CMAKE_NAME/share/cmake-4.3 /usr/local/share
echo "Install clang"
cd /root
git clone --depth 1 --branch llvmorg-$CLANG_VERSION https://github.com/llvm/llvm-project.git
cd llvm-project
mv /clang_version.patch .
git apply --verbose --ignore-whitespace clang_version.patch
mkdir build && cd build
cmake -G Ninja -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLLVM_ENABLE_PROJECTS="clang;lld;libc" -DCMAKE_BUILD_TYPE=Release -DLLVM_VERSION_SUFFIX="_p2pool" ../llvm
cmake -G Ninja -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLLVM_ENABLE_PROJECTS="clang;lld;libc" -DCMAKE_BUILD_TYPE=Release -DLLVM_VERSION_SUFFIX="_p2pool" -DLIBC_WNO_ERROR=ON -DLLVM_APPEND_VC_REV=OFF ../llvm
ninja
ninja install
@@ -168,17 +260,6 @@ echo "Install Linux headers for aarch64-linux-gnu"
cd /root
HEADERS_FILE=linux-$LINUX_HEADERS_VERSION.tar.xz
curl -L -O https://www.kernel.org/pub/linux/kernel/v6.x/$HEADERS_FILE
HEADERS_FILE_SHA256="$(sha256sum $HEADERS_FILE | awk '{ print $1 }')"
if [ $HEADERS_FILE_SHA256 != $HEADERS_SHA256 ]; then
echo "Error: SHA256 sum does not match for $HEADERS_FILE - expected $HEADERS_SHA256, got $HEADERS_FILE_SHA256"
exit 1
fi
tar xf linux-$LINUX_HEADERS_VERSION.tar.xz
cd linux-$LINUX_HEADERS_VERSION
make ARCH=arm64 INSTALL_HDR_PATH=/usr/local/aarch64-linux-gnu headers_install
@@ -188,7 +269,7 @@ echo "Install GCC for aarch64-linux-gnu"
cd /root
mkdir gcc_build_aarch64 && cd gcc_build_aarch64
../gcc/configure --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
../gcc/configure --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib --disable-libatomic
make -j$(nproc) all-gcc
make install-gcc
@@ -196,17 +277,6 @@ echo "Install glibc for aarch64-linux-gnu"
cd /root
GLIBC_FILE=glibc-$GLIBC_VERSION.tar.xz
curl -L -O https://ftpmirror.gnu.org/glibc/$GLIBC_FILE
GLIBC_FILE_SHA256="$(sha256sum $GLIBC_FILE | awk '{ print $1 }')"
if [ $GLIBC_FILE_SHA256 != $GLIBC_SHA256 ]; then
echo "Error: SHA256 sum does not match for $GLIBC_FILE - expected $GLIBC_SHA256, got $GLIBC_FILE_SHA256"
exit 1
fi
tar xf $GLIBC_FILE
mkdir glibc_build_aarch64 && cd glibc_build_aarch64
@@ -251,7 +321,7 @@ echo "Install GCC for riscv64-linux-gnu"
cd /root
mkdir gcc_build_riscv64 && cd gcc_build_riscv64
../gcc/configure --target=riscv64-linux-gnu --enable-languages=c,c++ --disable-multilib
../gcc/configure --target=riscv64-linux-gnu --enable-languages=c,c++ --disable-multilib --disable-libatomic
make -j$(nproc) all-gcc
make install-gcc
@@ -299,7 +369,6 @@ echo "Install mingw-w64 headers"
cd /root
git clone --depth=1 --branch v$MINGW_VERSION https://git.code.sf.net/p/mingw-w64/mingw-w64 mingw-w64-v$MINGW_VERSION
rm -rf mingw-w64-v$MINGW_VERSION/.git
cd mingw-w64-v$MINGW_VERSION/mingw-w64-headers
@@ -311,7 +380,7 @@ echo "Install GCC for x86_64-w64-mingw32"
cd /root
mkdir gcc_build_w64 && cd gcc_build_w64
../gcc/configure --target=x86_64-w64-mingw32 --enable-languages=c,c++ --disable-multilib
../gcc/configure --target=x86_64-w64-mingw32 --enable-languages=c,c++ --disable-multilib --disable-libatomic
make -j$(nproc) all-gcc
make install-gcc
@@ -350,66 +419,24 @@ gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /usr/local/x86_64-pc-linux
make -j$(nproc)
make install
echo "Get osxcross"
cd /root
git clone --branch 2.0-llvm-based https://github.com/tpoechtrager/osxcross
cd osxcross
git checkout cb444e230e815c06202bef1c30eca5d353235a05
echo "Get MacOSX $MACOSX_SDK_VERSION SDK"
cd /root/osxcross/tarballs
MACOSX_SDK_FILE=MacOSX$MACOSX_SDK_VERSION.sdk.tar.xz
curl -L -O https://github.com/joseluisq/macosx-sdks/releases/download/$MACOSX_SDK_VERSION/$MACOSX_SDK_FILE
MACOSX_SDK_FILE_SHA256="$(sha256sum $MACOSX_SDK_FILE | awk '{ print $1 }')"
if [ $MACOSX_SDK_FILE_SHA256 != $MACOSX_SDK_SHA256 ]; then
echo "Error: SHA256 sum does not match for $MACOSX_SDK_FILE - expected $MACOSX_SDK_SHA256, got $MACOSX_SDK_FILE_SHA256"
exit 1
fi
echo "Build MacOSX cross compilers"
cd /root/osxcross
git checkout ${OSXCROSS_VERSION}
TARGET_DIR=/usr/local OSX_VERSION_MIN=10.15 UNATTENDED=1 ./build.sh
./build_compiler_rt.sh
echo "Install FreeBSD $FREEBSD_VERSION SDK"
cd /usr/local
FREEBSD_FILE=base.txz
mkdir cross-freebsd-x86_64 && mkdir cross-freebsd-aarch64
curl -L -Z -o cross-freebsd-x86_64/$FREEBSD_FILE -o cross-freebsd-aarch64/$FREEBSD_FILE https://archive.freebsd.org/old-releases/amd64/$FREEBSD_VERSION-RELEASE/$FREEBSD_FILE https://archive.freebsd.org/old-releases/arm64/$FREEBSD_VERSION-RELEASE/$FREEBSD_FILE
cd /usr/local/cross-freebsd-x86_64
FREEBSD_X86_64_FILE_SHA256="$(sha256sum $FREEBSD_FILE | awk '{ print $1 }')"
if [ $FREEBSD_X86_64_FILE_SHA256 != $FREEBSD_X86_64_SHA256 ]; then
echo "Error: SHA256 sum does not match for $FREEBSD_FILE - expected $FREEBSD_X86_64_SHA256, got $FREEBSD_X86_64_FILE_SHA256"
exit 1
fi
tar -xf $FREEBSD_FILE ./lib/ ./usr/lib/ ./usr/include/
rm $FREEBSD_FILE
#find /usr/local/cross-freebsd-x86_64/usr/lib -xtype l|xargs ls -l|grep ' /lib/'|awk '{print "ln -sf /usr/local/cross-freebsd-x86_64"$11 " " $9}'|/bin/sh
cd /usr/local/cross-freebsd-aarch64
FREEBSD_AARCH64_FILE_SHA256="$(sha256sum $FREEBSD_FILE | awk '{ print $1 }')"
if [ $FREEBSD_AARCH64_FILE_SHA256 != $FREEBSD_AARCH64_SHA256 ]; then
echo "Error: SHA256 sum does not match for $FREEBSD_FILE - expected $FREEBSD_AARCH64_SHA256, got $FREEBSD_AARCH64_FILE_SHA256"
exit 1
fi
tar -xf $FREEBSD_FILE ./lib/ ./usr/lib/ ./usr/include/
rm $FREEBSD_FILE
#find /usr/local/cross-freebsd-aarch64/usr/lib -xtype l|xargs ls -l|grep ' /lib/'|awk '{print "ln -sf /usr/local/cross-freebsd-aarch64"$11 " " $9}'|/bin/sh
@@ -420,7 +447,6 @@ apt-get remove -yq xz-utils
cd /root
git clone --depth=1 --branch v$XZ_VERSION https://github.com/tukaani-project/xz
cd xz
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang
@@ -433,17 +459,6 @@ echo "Install tar"
cd /root
TAR_FILE=tar-$TAR_VERSION.tar.xz
curl -L -O https://ftpmirror.gnu.org/tar/$TAR_FILE
TAR_FILE_SHA256="$(sha256sum $TAR_FILE | awk '{ print $1 }')"
if [ $TAR_FILE_SHA256 != $TAR_SHA256 ]; then
echo "Error: SHA256 sum does not match for $TAR_FILE - expected $TAR_SHA256, got $TAR_FILE_SHA256"
exit 1
fi
tar xvf $TAR_FILE
cd tar-$TAR_VERSION
FORCE_UNSAFE_CONFIGURE=1 ./configure
@@ -462,9 +477,4 @@ echo "Deleting temporary files"
cd /root
rm -rf *
echo "Cloning the repository"
cd /
git clone --recursive --jobs $(nproc) https://github.com/SChernykh/p2pool
echo "All done"
@@ -20,9 +20,8 @@ flags_libs="--target=aarch64-linux-gnu -Os -flto -fuse-ld=lld -w $flags_size $fl
flags_p2pool="--target=aarch64-linux-gnu -fuse-ld=lld -Wno-unused-command-line-argument $flags_size $flags_datetime"
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -38,7 +37,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=aarch64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=aarch64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -53,4 +52,4 @@ chmod 0775 $1/p2pool
tar cvf $1.tar --format=pax --pax-option='exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime' --sort=name --owner=0 --group=0 --mtime="$CURRENT_DATE $CURRENT_TIME" $1
touch -t $TOUCH_DATE $1.tar
7z a -tgzip -mx9 -mfb256 -stl $1.tar.gz $1.tar
7z a -tgzip -mx9 -mfb256 -mpass15 -stl $1.tar.gz $1.tar
@@ -20,9 +20,8 @@ flags_libs="--target=riscv64-linux-gnu -Os -flto -fuse-ld=lld -w $flags_size $fl
flags_p2pool="--target=riscv64-linux-gnu -fuse-ld=lld -Wno-unused-command-line-argument $flags_size $flags_datetime"
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/riscv64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/riscv64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -38,7 +37,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/riscv64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=riscv64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/riscv64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=riscv64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -53,4 +52,4 @@ chmod 0775 $1/p2pool
tar cvf $1.tar --format=pax --pax-option='exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime' --sort=name --owner=0 --group=0 --mtime="$CURRENT_DATE $CURRENT_TIME" $1
touch -t $TOUCH_DATE $1.tar
7z a -tgzip -mx9 -mfb256 -stl $1.tar.gz $1.tar
7z a -tgzip -mx9 -mfb256 -mpass15 -stl $1.tar.gz $1.tar
@@ -20,9 +20,8 @@ flags_libs="-Os -flto -fuse-ld=lld -w $flags_size $flags_datetime"
flags_p2pool="-fuse-ld=lld -Wno-unused-command-line-argument $flags_size $flags_datetime"
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -38,7 +37,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DSTATIC_BINARY=ON -DARCH_ID=x86_64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=x86_64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -53,4 +52,4 @@ chmod 0775 $1/p2pool
tar cvf $1.tar --format=pax --pax-option='exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime' --sort=name --owner=0 --group=0 --mtime="$CURRENT_DATE $CURRENT_TIME" $1
touch -t $TOUCH_DATE $1.tar
7z a -tgzip -mx9 -mfb256 -stl $1.tar.gz $1.tar
7z a -tgzip -mx9 -mfb256 -mpass15 -stl $1.tar.gz $1.tar
@@ -20,9 +20,8 @@ flags_libs="-Os -flto -w $flags_size $flags_datetime"
flags_p2pool="$flags_size $flags_datetime"
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/macos_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/macos_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -38,7 +37,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/macos_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_LIBS=ON -DARCH_ID=aarch64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/macos_aarch64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_LIBS=ON -DARCH_ID=aarch64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -53,4 +52,4 @@ chmod 0775 $1/p2pool
tar cvf $1.tar --format=pax --pax-option='exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime' --sort=name --owner=0 --group=0 --mtime="$CURRENT_DATE $CURRENT_TIME" $1
touch -t $TOUCH_DATE $1.tar
7z a -tgzip -mx9 -mfb256 -stl $1.tar.gz $1.tar
7z a -tgzip -mx9 -mfb256 -mpass15 -stl $1.tar.gz $1.tar
@@ -20,9 +20,8 @@ flags_libs="-Os -flto -w $flags_size $flags_datetime"
flags_p2pool="$flags_size $flags_datetime"
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/macos_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/macos_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -38,7 +37,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/macos_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_LIBS=ON -DARCH_ID=x86_64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/macos_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool" -DOPENSSL_NO_ASM=ON -DSTATIC_LIBS=ON -DARCH_ID=x86_64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -53,4 +52,4 @@ chmod 0775 $1/p2pool
tar cvf $1.tar --format=pax --pax-option='exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime' --sort=name --owner=0 --group=0 --mtime="$CURRENT_DATE $CURRENT_TIME" $1
touch -t $TOUCH_DATE $1.tar
7z a -tgzip -mx9 -mfb256 -stl $1.tar.gz $1.tar
7z a -tgzip -mx9 -mfb256 -mpass15 -stl $1.tar.gz $1.tar
@@ -19,15 +19,14 @@ flags_datetime="-D__DATE__=\"\\\"$CURRENT_DATE\\\"\" -D__TIME__=\"\\\"$CURRENT_T
flags_libs="--target=x86_64-pc-windows-gnu -Os -flto -Wl,/timestamp:$BUILD_TIMESTAMP -fuse-ld=lld -w $flags_size $flags_datetime"
flags_p2pool="--target=x86_64-pc-windows-gnu -Wl,/timestamp:$BUILD_TIMESTAMP -fuse-ld=lld -femulated-tls -Wno-unused-command-line-argument -Wno-unknown-attributes $flags_size $flags_datetime"
flags_cxx_headers="-isystem /usr/local/x86_64-w64-mingw32/include/c++ -isystem /usr/local/x86_64-w64-mingw32/include/c++/15.1.0 -isystem /usr/local/x86_64-w64-mingw32/include"
flags_cxx_headers="-isystem /usr/local/x86_64-w64-mingw32/include/c++ -isystem /usr/local/x86_64-w64-mingw32/include/c++/16.1.0 -isystem /usr/local/x86_64-w64-mingw32/include"
cd /p2pool
git apply --verbose --ignore-whitespace --directory=external/src/grpc/third_party/boringssl-with-bazel patches/boringssl/win7.patch
cd /p2pool/external/src/curl
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/windows_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DCURL_DISABLE_WEBSOCKETS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/src/include
cmake . -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../../../cmake/windows_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_libs" -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON -DCURL_DISABLE_NEGOTIATE_AUTH=ON -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include
make -j$(nproc)
cd lib && cp -f libcurl.a .libs
cd /p2pool/external/src/libuv
rm -rf build
@@ -43,7 +42,7 @@ make -j$(nproc)
cd /p2pool
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/windows_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool $flags_cxx_headers" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=x86_64
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM="3.5" -DCMAKE_TOOLCHAIN_FILE=../cmake/windows_x86_64_toolchain_clang.cmake -DCMAKE_C_FLAGS="$flags_p2pool" -DCMAKE_CXX_FLAGS="$flags_p2pool $flags_cxx_headers" -DOPENSSL_NO_ASM=ON -DSTATIC_BINARY=ON -DARCH_ID=x86_64 -DGIT_COMMIT="$(git rev-parse --short=7 HEAD)"
make -j$(nproc) p2pool
mkdir $1
@@ -58,4 +57,4 @@ chmod 0775 $1/p2pool.exe
touch -t $TOUCH_DATE $1
touch -t $TOUCH_DATE $1/*
7z a -tzip -mx9 -mfb256 -stl $1.zip $1
7z a -tzip -mx9 -mfb256 -mpass15 -stl $1.zip $1
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
grep 'ERROR ' p2pool.log | grep -E -v 'submit_block|failed to bind|ZMQ is not running|block header for seed|ZMQReader|ZMQ reader|uv_poll_start returned error EBADF' > errors.log
if [ -s errors.log ]; then
cat errors.log
exit 1
fi
+3
View File
@@ -4,6 +4,9 @@
//
// Fixed difficulty for miners that connect to your node must be set in their config.json
//
// Note: nano sidechain uses
// "block_time": 30
// "uncle_penalty": 10
{
"name": "default",
"password": "",
+12 -11
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -20,6 +20,7 @@
#include "pool_block.h"
#include "p2p_server.h"
#include "side_chain.h"
#include "params.h"
LOG_CATEGORY(BlockCache)
@@ -34,9 +35,9 @@ struct BlockCache::Impl : public nocopy_nomove
{
#if defined(__linux__) || defined(__unix__) || defined(_POSIX_VERSION) || defined(__MACH__)
Impl()
explicit Impl(const Params& params)
{
const std::string cache_path = DATA_DIR + cache_name;
const std::string cache_path = params.m_dataDir + cache_name;
m_fd = open(cache_path.c_str(), O_RDWR | O_CREAT, static_cast<mode_t>(0600));
if (m_fd == -1) {
@@ -44,16 +45,16 @@ struct BlockCache::Impl : public nocopy_nomove
return;
}
int result = lseek(m_fd, static_cast<off_t>(CACHE_SIZE) - 1, SEEK_SET);
if (result == -1) {
auto result1 = lseek(m_fd, static_cast<off_t>(CACHE_SIZE) - 1, SEEK_SET);
if (result1 == -1) {
LOGERR(1, "lseek failed");
close(m_fd);
m_fd = -1;
return;
}
result = write(m_fd, "", 1);
if (result != 1) {
auto result2 = write(m_fd, "", 1);
if (result2 != 1) {
LOGERR(1, "write failed");
close(m_fd);
m_fd = -1;
@@ -88,8 +89,8 @@ struct BlockCache::Impl : public nocopy_nomove
#elif defined(_WIN32)
Impl()
: m_cachePath(DATA_DIR + cache_name)
explicit Impl(const Params& params)
: m_cachePath(params.m_dataDir + cache_name)
, m_file(CreateFile(m_cachePath.c_str(), GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL))
, m_map(0)
{
@@ -157,8 +158,8 @@ struct BlockCache::Impl : public nocopy_nomove
uint8_t* m_data = nullptr;
};
BlockCache::BlockCache()
: m_impl(new Impl())
BlockCache::BlockCache(const Params& params)
: m_impl(new Impl(params))
, m_flushRunning(0)
, m_storeIndex(0)
, m_loadingStarted(0)
+3 -2
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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,11 +22,12 @@ namespace p2pool {
struct PoolBlock;
class SideChain;
class P2PServer;
struct Params;
class BlockCache : public nocopy_nomove
{
public:
BlockCache();
explicit BlockCache(const Params& params);
~BlockCache();
void store(const PoolBlock& block);
+96 -36
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
* Portions Copyright (c) 2012-2013 The Cryptonote developers
* Portions Copyright (c) 2014-2021 The Monero Project
* Portions Copyright (c) 2021 XMRig <https://github.com/xmrig>
@@ -27,7 +27,6 @@
#include "p2pool.h"
#include "side_chain.h"
#include "pool_block.h"
#include "params.h"
#include "merkle.h"
#include <zmq.hpp>
#include <ctime>
@@ -150,6 +149,7 @@ BlockTemplate& BlockTemplate::operator=(const BlockTemplate& b)
m_blockHeader.clear();
m_minerTxExtra.clear();
m_transactionHashes.clear();
m_transactionHashesSet.clear();
m_rewards.clear();
m_mempoolTxs.clear();
m_mempoolTxsOrder.clear();
@@ -205,7 +205,7 @@ void BlockTemplate::shuffle_tx_order()
}
}
void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const Wallet* miner_wallet)
void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const Params& params)
{
if (data.major_version > HARDFORK_SUPPORTED_VERSION) {
LOGERR(1, "got hardfork version " << data.major_version << ", expected <= " << HARDFORK_SUPPORTED_VERSION);
@@ -214,7 +214,7 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
// Block template construction is relatively slow, but it's better to keep the lock the whole time
// instead of using temporary variables and making a quick swap in the end
//
//
// All readers will line up for the new template instead of using the outdated template
WriteLock lock(m_lock);
@@ -270,9 +270,12 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
m_blockHeaderSize = m_blockHeader.size();
m_poolBlockTemplate->m_minerWallet = *miner_wallet;
m_poolBlockTemplate->m_minerWallet = params.m_miningWallet;
m_sidechain->fill_sidechain_data(*m_poolBlockTemplate, m_shares);
if (!m_sidechain->fill_sidechain_data(*m_poolBlockTemplate, m_shares)) {
use_old_template();
return;
}
// Pre-calculate outputs to speed up miner tx generation
if (!m_shares.empty()) {
@@ -393,7 +396,8 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
LOGERR(1, "Added transaction " << tx.id << " twice. Fix the code!");
continue;
}
m_transactionHashes.insert(m_transactionHashes.end(), tx.id.h, tx.id.h + HASH_SIZE);
const hash h = tx.id;
m_transactionHashes.insert(m_transactionHashes.end(), h.h, h.h + HASH_SIZE);
final_fees += tx.fee;
final_weight += tx.weight;
}
@@ -474,7 +478,8 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
LOGERR(1, "Added transaction " << tx.id << " twice. Fix the code!");
continue;
}
m_transactionHashes.insert(m_transactionHashes.end(), tx.id.h, tx.id.h + HASH_SIZE);
const hash h = tx.id;
m_transactionHashes.insert(m_transactionHashes.end(), h.h, h.h + HASH_SIZE);
final_fees += tx.fee;
final_weight += tx.weight;
}
@@ -517,8 +522,6 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
return;
}
m_finalReward = final_reward;
const int create_miner_tx_result = create_miner_tx(data, m_shares, max_reward_amounts_weight, false);
if (create_miner_tx_result < 0) {
if (create_miner_tx_result == -3) {
@@ -574,6 +577,8 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
return;
}
m_finalReward = final_reward;
m_blockTemplateBlob = m_blockHeader;
m_extraNonceOffsetInTemplate += m_blockHeader.size();
m_minerTxOffsetInTemplate = m_blockHeader.size();
@@ -591,7 +596,7 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
m_poolBlockTemplate->m_transactions.push_back(m_mempoolTxs[m_mempoolTxsOrder[i]].id);
}
m_poolBlockTemplate->m_minerWallet = *miner_wallet;
m_poolBlockTemplate->m_minerWallet = params.m_miningWallet;
// Layout: [software id, version, random number, sidechain extra_nonce]
uint32_t* sidechain_extra = m_poolBlockTemplate->m_sidechainExtraBuf;
@@ -613,7 +618,7 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
m_poolBlockTemplate->m_auxNonce = data.aux_nonce;
m_poolBlockTemplate->m_mergeMiningExtra.clear();
for (const AuxChainData& c : data.aux_chains) {
std::vector<uint8_t> v;
v.reserve(HASH_SIZE + 16);
@@ -626,6 +631,27 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
m_poolBlockTemplate->m_mergeMiningExtra.emplace(c.unique_id, std::move(v));
}
if (params.m_subaddress.valid()) {
uint8_t buf[HASH_SIZE + 2] = {};
memcpy(buf, params.m_subaddress.view_public_key().h, HASH_SIZE);
m_poolBlockTemplate->m_mergeMiningExtra.emplace(keccak_subaddress_viewpub, std::vector(buf, buf + sizeof(buf)));
}
if (!params.m_onionPubkey.empty()) {
uint8_t buf[HASH_SIZE + 2] = {};
memcpy(buf, params.m_onionPubkey.h, HASH_SIZE);
m_poolBlockTemplate->m_mergeMiningExtra.emplace(keccak_onion_address_v3, std::vector(buf, buf + sizeof(buf)));
}
if (!params.m_i2pDestinationHash.empty()) {
uint8_t buf[HASH_SIZE + 2] = {};
memcpy(buf, params.m_i2pDestinationHash.h, HASH_SIZE);
m_poolBlockTemplate->m_mergeMiningExtra.emplace(keccak_i2p_b32_address, std::vector(buf, buf + sizeof(buf)));
}
init_merge_mining_merkle_proof();
const std::vector<uint8_t> sidechain_data = m_poolBlockTemplate->serialize_sidechain_data();
@@ -714,7 +740,7 @@ void BlockTemplate::update(const MinerData& data, const Mempool& mempool, const
LOGINFO(3, "final reward = " << log::Gray() << log::XMRAmount(final_reward) << log::NoColor() <<
", weight = " << log::Gray() << final_weight << log::NoColor() <<
", outputs = " << log::Gray() << m_poolBlockTemplate->m_outputs.size() << log::NoColor() <<
", outputs = " << log::Gray() << m_poolBlockTemplate->m_outputAmounts.size() << log::NoColor() <<
", " << log::Gray() << m_numTransactionHashes << log::NoColor() <<
" of " << log::Gray() << m_mempoolTxs.size() << log::NoColor() << " transactions included");
@@ -734,7 +760,7 @@ void BlockTemplate::fill_optimal_knapsack(const MinerData& data, uint64_t base_r
{
// Find the maximum possible fee for every weight value and remember which tx leads to this fee/weight
// Run time is O(N*W) where N is the number of transactions and W is the maximum block weight
//
//
// Actual run time is 0.02-0.05 seconds on real full blocks
// It's too slow and uses too much memory to be practical
@@ -833,7 +859,8 @@ void BlockTemplate::select_mempool_transactions(const Mempool& mempool)
PoolBlock* b = m_poolBlockTemplate;
b->m_transactions.clear();
b->m_transactions.resize(1);
b->m_outputs.clear();
b->m_ephPublicKeys.clear();
b->m_outputAmounts.clear();
// Block template size without coinbase outputs and transactions (minus 2 bytes for output and tx count dummy varints)
size_t k = b->serialize_mainchain_data().size() + b->serialize_sidechain_data().size() - 2;
@@ -854,7 +881,7 @@ void BlockTemplate::select_mempool_transactions(const Mempool& mempool)
k += r / 34359738368ULL;
}
const size_t max_transactions = (MAX_BLOCK_SIZE > k) ? ((MAX_BLOCK_SIZE - k) / HASH_SIZE) : 0;
const uint32_t max_transactions = static_cast<uint32_t>((MAX_BLOCK_SIZE > k) ? ((MAX_BLOCK_SIZE - k) / HASH_SIZE) : 0);
LOGINFO(6, max_transactions << " transactions can be taken with current block size limit");
if (max_transactions == 0) {
@@ -895,10 +922,11 @@ int BlockTemplate::create_miner_tx(const MinerData& data, const std::vector<Mine
// Number of outputs (1 output per miner)
writeVarint(num_outputs, m_minerTx);
m_poolBlockTemplate->m_outputs.clear();
m_poolBlockTemplate->m_outputs.reserve(num_outputs);
m_poolBlockTemplate->m_ephPublicKeys.clear();
m_poolBlockTemplate->m_outputAmounts.clear();
const uint8_t tx_type = m_poolBlockTemplate->get_tx_type();
m_poolBlockTemplate->m_ephPublicKeys.reserve(num_outputs);
m_poolBlockTemplate->m_outputAmounts.reserve(num_outputs);
uint64_t reward_amounts_weight = 0;
for (size_t i = 0; i < num_outputs; ++i) {
@@ -907,7 +935,7 @@ int BlockTemplate::create_miner_tx(const MinerData& data, const std::vector<Mine
m_minerTx.push_back(b);
++reward_amounts_weight;
});
m_minerTx.push_back(tx_type);
m_minerTx.push_back(TXOUT_TO_TAGGED_KEY);
uint8_t view_tag = 0;
@@ -920,12 +948,11 @@ int BlockTemplate::create_miner_tx(const MinerData& data, const std::vector<Mine
LOGERR(1, "get_eph_public_key failed at index " << i);
}
m_minerTx.insert(m_minerTx.end(), eph_public_key.h, eph_public_key.h + HASH_SIZE);
m_poolBlockTemplate->m_outputs.emplace_back(m_rewards[i], eph_public_key, view_tag);
m_poolBlockTemplate->m_ephPublicKeys.emplace_back(eph_public_key);
m_poolBlockTemplate->m_outputAmounts.emplace_back(m_rewards[i], view_tag);
}
if (tx_type == TXOUT_TO_TAGGED_KEY) {
m_minerTx.emplace_back(view_tag);
}
m_minerTx.emplace_back(view_tag);
}
if (dry_run) {
@@ -956,7 +983,7 @@ int BlockTemplate::create_miner_tx(const MinerData& data, const std::vector<Mine
LOGINFO(4, "increased EXTRA_NONCE from " << EXTRA_NONCE_SIZE << " to " << corrected_extra_nonce_size << " bytes to maintain miner tx weight");
}
writeVarint(corrected_extra_nonce_size, m_minerTxExtra);
uint64_t extraNonceOffsetInMinerTx = m_minerTxExtra.size();
m_minerTxExtra.insert(m_minerTxExtra.end(), corrected_extra_nonce_size, 0);
@@ -1349,11 +1376,11 @@ bool BlockTemplate::get_aux_proof(const uint32_t template_id, uint32_t extra_non
return false;
}
bool found = false;
const hash sidechain_id = calc_sidechain_hash(extra_nonce);
const uint32_t n_aux_chains = static_cast<uint32_t>(m_poolBlockTemplate->m_auxChains.size() + 1);
uint32_t found_aux_slot = n_aux_chains;
std::vector<hash> hashes(n_aux_chains);
for (const AuxChainData& aux_data : m_poolBlockTemplate->m_auxChains) {
@@ -1361,7 +1388,7 @@ bool BlockTemplate::get_aux_proof(const uint32_t template_id, uint32_t extra_non
hashes[aux_slot] = aux_data.data;
if (aux_data.data == h) {
found = true;
found_aux_slot = aux_slot;
}
}
@@ -1369,17 +1396,31 @@ bool BlockTemplate::get_aux_proof(const uint32_t template_id, uint32_t extra_non
hashes[aux_slot] = sidechain_id;
if (sidechain_id == h) {
found = true;
found_aux_slot = aux_slot;
}
if (!found) {
if (found_aux_slot >= n_aux_chains) {
return false;
}
std::vector<std::vector<hash>> tree;
merkle_hash_full_tree(hashes, tree);
root_hash root;
const bool result = merkle_hash_with_proof(hashes, found_aux_slot, proof, path, root);
return get_merkle_proof(tree, h, proof, path);
if (pool_block_debug()) {
std::vector<std::vector<hash>> tree;
merkle_hash_full_tree(hashes, tree);
std::vector<hash> proof2;
uint32_t path2 = 0;
const bool result2 = get_merkle_proof(tree, h, proof2, path2);
if ((result2 != result) || (proof2 != proof) || (path2 != path)) {
LOGERR(1, "get_aux_proof: merkle_hash_with_proof and get_merkle_proof returned different results. Fix the code!");
}
}
return result;
}
std::vector<uint8_t> BlockTemplate::get_block_template_blob(uint32_t template_id, uint32_t sidechain_extra_nonce, size_t& nonce_offset, size_t& extra_nonce_offset, size_t& merkle_root_offset, hash& merge_mining_root, const BlockTemplate** pThis) const
@@ -1519,10 +1560,29 @@ void BlockTemplate::init_merge_mining_merkle_proof()
}
}
std::vector<std::vector<hash>> tree;
merkle_hash_full_tree(hashes, tree);
root_hash root;
uint32_t merkle_proof_path;
if (!merkle_hash_with_proof(hashes, aux_slot, m_poolBlockTemplate->m_merkleProof, merkle_proof_path, root)) {
LOGERR(1, "init_merge_mining_merkle_proof: merkle_hash_with_proof failed. Fix the code!");
return;
}
get_merkle_proof(tree, m_poolBlockTemplate->m_sidechainId, m_poolBlockTemplate->m_merkleProof, m_poolBlockTemplate->m_merkleProofPath);
if (pool_block_debug()) {
std::vector<std::vector<hash>> tree;
merkle_hash_full_tree(hashes, tree);
std::vector<hash> proof;
uint32_t path = 0;
if (!get_merkle_proof(tree, m_poolBlockTemplate->m_sidechainId, proof, path)) {
LOGERR(1, "init_merge_mining_merkle_proof: get_merkle_proof failed. Fix the code!");
return;
}
if ((proof != m_poolBlockTemplate->m_merkleProof) || (path != merkle_proof_path)) {
LOGERR(1, "init_merge_mining_merkle_proof: merkle_hash_with_proof and get_merkle_proof returned different results. Fix the code!");
}
}
}
} // namespace p2pool
+11 -3
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -29,6 +29,7 @@ class Mempool;
class Wallet;
struct PoolBlock;
struct MinerShare;
struct Params;
class BlockTemplate
{
@@ -39,7 +40,7 @@ public:
BlockTemplate(const BlockTemplate& b);
BlockTemplate& operator=(const BlockTemplate& b);
void update(const MinerData& data, const Mempool& mempool, const Wallet* miner_wallet);
void update(const MinerData& data, const Mempool& mempool, const Params& params);
uint64_t last_updated() const { return m_lastUpdated.load(); }
bool get_difficulties(const uint32_t template_id, uint64_t& height, uint64_t& sidechain_height, difficulty_type& mainchain_difficulty, difficulty_type& aux_diff, difficulty_type& sidechain_difficulty) const;
@@ -107,7 +108,14 @@ private:
PoolBlock* m_poolBlockTemplate;
BlockTemplate* m_oldTemplates[4] = {};
#ifdef P2POOL_UNIT_TESTS
BlockTemplate* m_oldTemplates[1] = {};
#else
// Nodejs-pool submits can arrive noticeably later than native stratum
// submits. Keep enough old templates to rebuild aux proofs for delayed
// shares instead of failing with stale_template after a few rotations.
BlockTemplate* m_oldTemplates[512] = {};
#endif
std::atomic<uint64_t> m_finalReward;
+142 -5
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -117,7 +117,6 @@ extern "C" void __nss_module_disable_loading();
namespace p2pool {
constexpr size_t HASH_SIZE = 32;
constexpr uint8_t HARDFORK_VIEW_TAGS_VERSION = 15;
constexpr uint8_t HARDFORK_SUPPORTED_VERSION = 16;
constexpr uint8_t MINER_REWARD_UNLOCK_TIME = 60;
constexpr uint8_t NONCE_SIZE = 4;
@@ -125,7 +124,6 @@ constexpr uint8_t EXTRA_NONCE_SIZE = 4;
constexpr uint8_t EXTRA_NONCE_MAX_SIZE = EXTRA_NONCE_SIZE + 10;
constexpr uint8_t TX_VERSION = 2;
constexpr uint8_t TXIN_GEN = 0xFF;
constexpr uint8_t TXOUT_TO_KEY = 2;
constexpr uint8_t TXOUT_TO_TAGGED_KEY = 3;
constexpr uint8_t TX_EXTRA_TAG_PUBKEY = 1;
constexpr uint8_t TX_EXTRA_NONCE = 2;
@@ -164,7 +162,31 @@ struct alignas(uint64_t) hash
{
uint8_t h[HASH_SIZE];
FORCEINLINE hash() : h{} {}
FORCEINLINE constexpr hash() noexcept : h{} {}
constexpr hash(std::initializer_list<uint8_t> l) noexcept : h{} {
auto it = l.begin();
for (size_t i = 0; (i < HASH_SIZE) && (it != l.end()); ++i, ++it) {
h[i] = *it;
}
}
explicit constexpr hash(const char (&s)[HASH_SIZE * 2 + 1]) noexcept : h{} {
for (size_t i = 0; i < HASH_SIZE * 2; ++i) {
char c = s[i];
if ('0' <= c && c <= '9') {
c -= '0';
} else if ('a' <= c && c <= 'f') {
c = (c - 'a') + 10;
} else if ('A' <= c && c <= 'F') {
c = (c - 'A') + 10;
}
h[i / 2] = (h[i / 2] << 4) | static_cast<uint8_t>(c);
}
}
FORCEINLINE bool operator<(const hash& other) const
{
@@ -204,6 +226,22 @@ struct alignas(uint64_t) hash
FORCEINLINE uint64_t* u64() { return reinterpret_cast<uint64_t*>(h); }
FORCEINLINE const uint64_t* u64() const { return reinterpret_cast<const uint64_t*>(h); }
template<int index>
FORCEINLINE constexpr uint64_t u64() const
{
if constexpr ((index < 0) || (index >= HASH_SIZE / sizeof(uint64_t))) {
return 0;
}
uint64_t k = 0;
for (size_t i = 0; i < sizeof(uint64_t); ++i) {
k |= static_cast<uint64_t>(h[index * sizeof(uint64_t) + i]) << (i * 8);
}
return k;
}
friend std::ostream& operator<<(std::ostream& s, const hash& d);
friend std::istream& operator>>(std::istream& s, hash& d);
};
@@ -371,6 +409,85 @@ FORCEINLINE difficulty_type operator/(const difficulty_type& a, const T& b)
return result;
}
#ifdef WITH_INDEXED_HASHES
struct indexed_hash
{
enum {
BUCKET_BITS = 12,
BUCKET_SHIFT = 32 - BUCKET_BITS,
};
static_assert((BUCKET_BITS > 0) && (BUCKET_BITS < 32) && (BUCKET_BITS + BUCKET_SHIFT == 32), "Invalid bucket bit size");
FORCEINLINE indexed_hash() noexcept : m_index(std::numeric_limits<uint32_t>::max()) {}
explicit indexed_hash(const hash& h);
~indexed_hash();
indexed_hash(const indexed_hash& h) noexcept;
FORCEINLINE indexed_hash(indexed_hash&& h) noexcept : m_index(h.m_index) { h.m_index = std::numeric_limits<uint32_t>::max(); }
indexed_hash& operator=(const indexed_hash& h) noexcept;
indexed_hash& operator=(indexed_hash&& h) noexcept;
FORCEINLINE indexed_hash& operator=(const hash& h)
{
if (*this == h) {
return *this;
}
return operator=(indexed_hash(h));
}
FORCEINLINE bool operator==(const indexed_hash& h) const { return m_index == h.m_index; }
FORCEINLINE bool operator==(const hash& h) const
{
const uint32_t i = m_index;
if (i == std::numeric_limits<uint32_t>::max()) {
return h.empty();
}
const uint32_t bucket = i >> BUCKET_SHIFT;
if (bucket != get_bucket(h)) {
return false;
}
return is_same(i, bucket, h);
}
FORCEINLINE operator hash() const
{
const uint32_t i = m_index;
if (i == std::numeric_limits<uint32_t>::max()) {
return {};
}
return get(i);
}
FORCEINLINE uint32_t get_bucket() const { return m_index >> BUCKET_SHIFT; }
static void cleanup_storage();
static void print_status();
private:
uint32_t m_index;
static FORCEINLINE uint32_t get_bucket(const hash& h) { return h.u64()[3] >> (64 - BUCKET_BITS); }
static hash get(uint32_t index);
static bool is_same(uint32_t index, uint32_t bucket, const hash& h);
};
static_assert(sizeof(indexed_hash) == 4, "indexed_hash has wrong size");
#else
typedef hash indexed_hash;
#endif
struct TxMempoolData
{
FORCEINLINE TxMempoolData() : id(), blob_size(0), weight(0), fee(0), time_received(0) {}
@@ -389,10 +506,22 @@ struct TxMempoolData
if (weight > tx.weight) return false;
// If two transactions have exactly the same fee and weight, just order them by id
#ifdef WITH_INDEXED_HASHES
const uint32_t id_bucket = id.get_bucket();
const uint32_t tx_id_bucket = tx.id.get_bucket();
if (id_bucket < tx_id_bucket) return true;
if (id_bucket > tx_id_bucket) return false;
const hash h1 = id;
const hash h2 = tx.id;
return h1 < h2;
#else
return id < tx.id;
#endif
}
hash id;
indexed_hash id;
uint64_t blob_size;
uint64_t weight;
uint64_t fee;
@@ -496,6 +625,14 @@ struct raw_ip
static_assert(sizeof(raw_ip) == 16, "struct raw_ip has invalid size");
struct MoneroBlockBroadcastHeader
{
uint32_t header_size;
uint32_t miner_tx_size;
};
static_assert(sizeof(MoneroBlockBroadcastHeader) == sizeof(uint32_t) * 2, "struct MoneroBlockBroadcastHeader has invalid size");
void* malloc_hook(size_t n) noexcept;
void* realloc_hook(void* ptr, size_t size) noexcept;
void* calloc_hook(size_t count, size_t size) noexcept;
+8 -5
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021 hyc <https://github.com/hyc>
*
* This program is free software: you can redistribute it and/or modify
@@ -35,7 +35,7 @@ static constexpr int DEFAULT_BACKLOG = 1;
namespace p2pool {
ConsoleCommands::ConsoleCommands(p2pool* pool)
: TCPServer(DEFAULT_BACKLOG, ConsoleClient::allocate, std::string())
: TCPServer(DEFAULT_BACKLOG, ConsoleClient::allocate, std::string(), Params::ProxyType::INVALID)
, m_pool(pool)
, m_tty{}
, m_stdin_pipe{}
@@ -91,7 +91,7 @@ ConsoleCommands::ConsoleCommands(p2pool* pool)
rng.discard(10000);
for (int i = 0; i < 10; ++i) {
if (start_listening(false, "127.0.0.1", 49152 + (rng() % 16384))) {
if (start_listening(false, "127.0.0.1", 49152 + static_cast<int>(rng() % 16384))) {
break;
}
}
@@ -224,6 +224,10 @@ static void do_status(p2pool *m_pool, const char * /* args */)
m_pool->print_merge_mining_status();
#ifdef WITH_INDEXED_HASHES
indexed_hash::print_status();
#endif
bkg_jobs_tracker->print_status();
if (p2p) {
@@ -293,7 +297,7 @@ static void do_status(p2pool *m_pool, const char * /* args */)
static void do_loglevel(p2pool * /* m_pool */, const char *args)
{
int level = strtol(args, nullptr, 10);
int level = static_cast<int>(strtol(args, nullptr, 10));
level = std::min(std::max(level, 0), log::MAX_GLOBAL_LOG_LEVEL);
log::GLOBAL_LOG_LEVEL = level;
LOGINFO(0, "log level set to " << level);
@@ -388,7 +392,6 @@ static void do_stop_mining(p2pool* m_pool, const char* /*args*/)
static void do_exit(p2pool *m_pool, const char * /* args */)
{
bkg_jobs_tracker->wait();
m_pool->stop();
}
+1 -1
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
+19 -18
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -66,7 +66,7 @@ private:
static RandomBytes* randomBytes = nullptr;
}
} // namespace
static FORCEINLINE bool less32(const uint8_t* k0, const uint8_t* k1)
{
@@ -89,7 +89,7 @@ void generate_keys(hash& pub, hash& sec)
} while (!sc_isnonzero(sec.h));
ge_p3 point;
ge_scalarmult_base(&point, sec.h);
ge_scalarmult_base_vartime(&point, sec.h);
ge_p3_tobytes(pub.h, &point);
}
@@ -113,7 +113,7 @@ void generate_keys_deterministic(hash& pub, hash& sec, const uint8_t* entropy, s
} while (!sc_isnonzero(sec.h));
ge_p3 point;
ge_scalarmult_base(&point, sec.h);
ge_scalarmult_base_vartime(&point, sec.h);
ge_p3_tobytes(pub.h, &point);
}
@@ -125,7 +125,7 @@ bool check_keys(const hash& pub, const hash& sec)
}
ge_p3 point;
ge_scalarmult_base(&point, sec.h);
ge_scalarmult_base_vartime(&point, sec.h);
hash pub_check;
ge_p3_tobytes(pub_check.h, &point);
@@ -206,7 +206,7 @@ public:
return false;
}
ge_scalarmult(&point2, key2.h, &point);
ge_scalarmult_vartime(&point2, key2.h, &point);
ge_mul8(&point3, &point2);
ge_p1p1_to_p2(&point2, &point3);
ge_tobytes(reinterpret_cast<uint8_t*>(&derivation), &point2);
@@ -218,7 +218,7 @@ public:
{
WriteLock lock(derivations_lock);
auto entry = derivations->emplace(index, DerivationEntry{ derivation, { 0xFFFFFFFFUL, 0xFFFFFFFFUL }, {}, t }).first;
auto entry = derivations->emplace(index, DerivationEntry{ derivation, { 0xFFFFFFFFUL, 0xFFFFFFFFUL }, {}, static_cast<uint32_t>(t) }).first;
entry->second.add_view_tag(static_cast<uint32_t>(output_index << 8) | view_tag);
}
@@ -253,7 +253,7 @@ public:
}
derivation_to_scalar(derivation, output_index, scalar);
ge_scalarmult_base(&point2, reinterpret_cast<uint8_t*>(&scalar));
ge_scalarmult_base_vartime(&point2, reinterpret_cast<uint8_t*>(&scalar));
ge_p3_to_cached(&point3, &point2);
ge_add(&point4, &point1, &point3);
ge_p1p1_to_p2(&point5, &point4);
@@ -262,7 +262,7 @@ public:
const uint64_t t = seconds_since_epoch();
{
WriteLock lock(public_keys_lock);
public_keys->emplace(index, PublicKeyEntry{ derived_key, t });
public_keys->emplace(index, PublicKeyEntry{ static_cast<indexed_hash>(derived_key), static_cast<uint32_t>(t) });
}
return true;
@@ -297,7 +297,7 @@ public:
const uint64_t t = seconds_since_epoch();
{
WriteLock lock(tx_keys_lock);
tx_keys->emplace(index, TxKeyEntry{ pub, sec, t });
tx_keys->emplace(index, TxKeyEntry{ pub, sec, static_cast<uint32_t>(t) });
}
}
@@ -306,7 +306,8 @@ public:
if (timestamp) {
auto clean_old = [timestamp](auto* table) {
for (auto it = table->begin(); it != table->end();) {
if (it->second.m_timestamp < timestamp) {
// Wraparound-safe way of checking "it->second.m_timestamp < timestamp"
if (((it->second.m_timestamp - static_cast<uint32_t>(timestamp)) & 0x80000000UL) != 0) {
it = table->erase(it);
}
else {
@@ -357,7 +358,7 @@ private:
uint32_t m_viewTags1[2] = { 0xFFFFFFFFUL, 0xFFFFFFFFUL };
std::vector<uint32_t> m_viewTags2;
// cppcheck-suppress unusedStructMember
uint64_t m_timestamp;
uint32_t m_timestamp = 0;
FORCEINLINE bool find_view_tag(size_t output_index, uint8_t& view_tag) const
{
@@ -390,7 +391,7 @@ private:
m_viewTags1[i] = k; \
return; \
} \
else if (t == k) { \
if (t == k) { \
return; \
} \
} while (0)
@@ -407,9 +408,9 @@ private:
struct PublicKeyEntry
{
hash m_key;
indexed_hash m_key;
// cppcheck-suppress unusedStructMember
uint64_t m_timestamp;
uint32_t m_timestamp = 0;
};
struct TxKeyEntry
@@ -417,7 +418,7 @@ private:
hash m_pub;
hash m_sec;
// cppcheck-suppress unusedStructMember
uint64_t m_timestamp;
uint32_t m_timestamp = 0;
};
typedef unordered_map<std::array<uint8_t, HASH_SIZE * 2>, DerivationEntry> DerivationsMap;
@@ -481,12 +482,12 @@ void init_crypto_cache()
void destroy_crypto_cache()
{
{
auto p = randomBytes;
auto* p = randomBytes;
randomBytes = nullptr;
delete p;
}
{
auto p = cache;
auto* p = cache;
cache = nullptr;
delete p;
}
+1 -1
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
+76
View File
@@ -0,0 +1,76 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2026 jpk68
*
* 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
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "common.h"
#include "util.h"
#include "i2p.h"
LOG_CATEGORY(I2P)
namespace p2pool {
hash from_i2p_b32(const std::string& address)
{
if ((address.length() < 8) || (address.find(".b32.i2p") != address.length() - 8)) {
LOGWARN(3, "Invalid I2P address \"" << address << "\": doesn't end with \".b32.i2p\"");
return {};
}
if (address.length() != 60) {
LOGWARN(3, "Invalid I2P address \"" << address << "\": expected length 60, got " << address.length());
return {};
}
const hash result = from_i2p_b32_const(address.c_str());
if (result.empty()) {
LOGWARN(3, "Invalid I2P address \"" << address << "\": has invalid character(s)");
return {};
}
return result;
}
std::string to_i2p_b32(const hash& dest_hash)
{
uint8_t buf[HASH_SIZE + 1];
memcpy(buf, dest_hash.h, HASH_SIZE);
buf[HASH_SIZE] = 0;
std::string result;
result.reserve(60);
uint64_t data = 0;
uint64_t bit_size = 0;
for (size_t i = 0; i < HASH_SIZE + 1; ++i) {
data = (data << 8) | buf[i];
bit_size += 8;
while (bit_size >= 5) {
bit_size -= 5;
result += base32_alphabet[(data >> bit_size) & 31];
}
}
result.append(".b32.i2p");
return result;
}
} // namespace p2pool
+73
View File
@@ -0,0 +1,73 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2026 jpk68
*
* 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
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "common.h"
#include <string>
#include <uv.h>
namespace p2pool {
static FORCEINLINE constexpr hash from_i2p_b32_const(const char* dest_hash)
{
uint8_t buf[HASH_SIZE + 4] = {};
uint8_t* p = buf;
uint64_t data = 0;
uint64_t bit_size = 0;
for (size_t i = 0; i < 52; ++i) {
const char c = dest_hash[i];
uint64_t digit = 0;
if ('a' <= c && c <= 'z') {
digit = static_cast<uint64_t>(c - 'a');
}
else if ('A' <= c && c <= 'Z') {
digit = static_cast<uint64_t>(c - 'A');
}
else if ('2' <= c && c <= '7') {
digit = static_cast<uint64_t>(c - '2') + 26;
}
else {
return {};
}
data = (data << 5) | digit;
bit_size += 5;
while (bit_size >= 8) {
bit_size -= 8;
*(p++) = static_cast<uint8_t>(data >> bit_size);
}
}
hash result;
for (size_t i = 0; i < HASH_SIZE; ++i) {
result.h[i] = buf[i];
}
return result;
}
hash from_i2p_b32(const std::string& address);
std::string to_i2p_b32(const hash& dest_hash);
} // namespace p2pool
+300
View File
@@ -0,0 +1,300 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "common.h"
#include "util.h"
#include "uv_util.h"
LOG_CATEGORY(indexed_hash)
namespace p2pool {
static constexpr uint32_t BUCKET_COUNT = 1U << indexed_hash::BUCKET_BITS;
static constexpr uint32_t INDEX_MASK = (1U << indexed_hash::BUCKET_SHIFT) - 1U;
// Stores hashes only
static std::vector<hash> storage1[BUCKET_COUNT];
// Stores first 4 bytes of each hash (for better cache locality during search) and reference counters
static std::vector<std::pair<uint32_t, uint32_t>> storage2[BUCKET_COUNT];
static constexpr uint32_t LOCK_COUNT = 64;
static ReadWriteLock locks[LOCK_COUNT];
static FORCEINLINE void decref(uint32_t index)
{
if (index == std::numeric_limits<uint32_t>::max()) {
return;
}
const uint32_t bucket = index >> indexed_hash::BUCKET_SHIFT;
index &= INDEX_MASK;
auto& d2 = storage2[bucket];
WriteLock lock(locks[bucket % LOCK_COUNT]);
auto& p2 = d2[index];
#ifdef P2POOL_DEBUGGING
if (p2.second == 0) {
LOGERR(0, "fatal error: reference counter is 0 when it shouldn't be 0");
PANIC_STOP();
}
#endif
--p2.second;
}
static FORCEINLINE void incref(uint32_t index)
{
if (index == std::numeric_limits<uint32_t>::max()) {
return;
}
const uint32_t bucket = index >> indexed_hash::BUCKET_SHIFT;
index &= INDEX_MASK;
auto& d2 = storage2[bucket];
WriteLock lock(locks[bucket % LOCK_COUNT]);
++d2[index].second;
}
indexed_hash::indexed_hash(const hash& h)
{
if (h.empty()) {
m_index = std::numeric_limits<uint32_t>::max();
return;
}
const uint32_t bucket = get_bucket(h);
auto& d1 = storage1[bucket];
auto& d2 = storage2[bucket];
const uint32_t h32 = static_cast<uint32_t>(h.u64()[0]);
uint32_t first_free_slot = std::numeric_limits<uint32_t>::max();
WriteLock lock(locks[bucket % LOCK_COUNT]);
const uint32_t n = static_cast<uint32_t>(d1.size());
for (uint32_t i = 0; i < n; ++i) {
auto& p2 = d2[i];
if ((p2.first == h32) && (d1[i] == h)) {
m_index = (bucket << BUCKET_SHIFT) | i;
++p2.second;
return;
}
if ((p2.second == 0) && (first_free_slot == std::numeric_limits<uint32_t>::max())) {
first_free_slot = i;
}
}
if (first_free_slot != std::numeric_limits<uint32_t>::max()) {
m_index = (bucket << BUCKET_SHIFT) | first_free_slot;
d1[first_free_slot] = h;
auto& p2 = d2[first_free_slot];
p2.first = h32;
p2.second = 1;
}
else {
const uint32_t index = (bucket << BUCKET_SHIFT) | n;
if ((n > INDEX_MASK) || (index == std::numeric_limits<uint32_t>::max())) {
LOGERR(0, "fatal error: storage overflow");
PANIC_STOP();
}
m_index = index;
if (n == d1.capacity()) {
const uint32_t new_capacity = static_cast<uint32_t>(std::min<size_t>(n + (n / 4) + 1, INDEX_MASK + 1));
d1.reserve(new_capacity);
d2.reserve(new_capacity);
}
d1.emplace_back(h);
d2.emplace_back(h32, 1);
}
}
indexed_hash::~indexed_hash()
{
decref(m_index);
}
indexed_hash::indexed_hash(const indexed_hash& h) noexcept
{
const uint32_t i = h.m_index;
m_index = i;
incref(i);
}
indexed_hash& indexed_hash::operator=(const indexed_hash& h) noexcept
{
if (this == &h) {
return *this;
}
const uint32_t i = m_index;
const uint32_t j = h.m_index;
if (i == j) {
return *this;
}
decref(i);
m_index = j;
incref(j);
return *this;
}
indexed_hash& indexed_hash::operator=(indexed_hash&& h) noexcept
{
if (this == &h) {
return *this;
}
const uint32_t i = m_index;
const uint32_t j = h.m_index;
// Empty h because we're moving it
h.m_index = std::numeric_limits<uint32_t>::max();
if (i == j) {
// If h had the same index, decrease h's reference counter because now we have 1 instead of 2 objects using this index
decref(j);
return *this;
}
// If h had a different index, decrease our reference counter because our index will be overwritten by the index from h
decref(i);
// No need to change the reference counter anymore because now we are referencing the hash that was referenced by h
m_index = j;
return *this;
}
hash indexed_hash::get(uint32_t index)
{
const uint32_t bucket = index >> BUCKET_SHIFT;
const auto& d1 = storage1[bucket];
index &= INDEX_MASK;
ReadLock lock(locks[bucket % LOCK_COUNT]);
#ifdef P2POOL_DEBUGGING
if (storage2[bucket][index].second == 0) {
LOGERR(0, "fatal error: reference counter is 0 when it shouldn't be 0");
PANIC_STOP();
}
#endif
return d1[index];
}
bool indexed_hash::is_same(uint32_t index, uint32_t bucket, const hash& h)
{
#ifdef P2POOL_DEBUGGING
if ((index >> BUCKET_SHIFT) != bucket) {
LOGERR(0, "fatal error: bucket doesn't match index");
PANIC_STOP();
}
#endif
const auto& d1 = storage1[bucket];
index &= INDEX_MASK;
ReadLock lock(locks[bucket % LOCK_COUNT]);
#ifdef P2POOL_DEBUGGING
if (storage2[bucket][index].second == 0) {
LOGERR(0, "fatal error: reference counter is 0 when it shouldn't be 0");
PANIC_STOP();
}
#endif
return d1[index] == h;
}
void indexed_hash::cleanup_storage()
{
for (auto& d1 : storage1) {
d1.clear();
d1.shrink_to_fit();
}
for (auto& d2 : storage2) {
#ifdef P2POOL_DEBUGGING
for (const auto& p2 : d2) {
if (p2.second) {
LOGERR(0, "storage is not empty at exit. Fix the code!");
PANIC_STOP();
}
}
#endif
d2.clear();
d2.shrink_to_fit();
}
}
void indexed_hash::print_status()
{
size_t total_hashes_stored = 0;
size_t total_refcount = 0;
size_t memory_used = 0;
const auto& s1 = storage1;
const auto& s2 = storage2;
for (uint32_t i = 0; i < LOCK_COUNT; ++i) {
ReadLock lock(locks[i]);
for (uint32_t j = i; j < BUCKET_COUNT; j += LOCK_COUNT) {
memory_used += s1[j].capacity() * HASH_SIZE + s2[j].capacity() * sizeof(uint32_t) * 2;
for (const auto& p2 : storage2[j]) {
if (p2.second) {
++total_hashes_stored;
total_refcount += p2.second;
}
}
}
}
memory_used += total_refcount * sizeof(indexed_hash);
LOGINFO(4, "status" <<
"\nTotal hashes stored = " << total_hashes_stored <<
"\nTotal refcount = " << total_refcount <<
"\nMemory used = " << static_cast<double>(memory_used) / 1048576.0 << " MB (reduced from " << static_cast<double>(total_refcount * HASH_SIZE) / 1048576.0 << " MB)"
);
}
} // namespace p2pool
+19 -1
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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 +57,7 @@ struct parse_wrapper<T, out_type> \
JSON_VALUE_PARSER(String, const char*)
JSON_VALUE_PARSER(String, std::string)
JSON_VALUE_PARSER(Uint, uint8_t)
JSON_VALUE_PARSER(Uint, uint32_t)
JSON_VALUE_PARSER(Uint64, uint64_t)
JSON_VALUE_PARSER(Bool, bool)
@@ -84,6 +85,23 @@ struct parse_wrapper<T, hash>
}
};
#ifdef WITH_INDEXED_HASHES
template<typename T>
struct parse_wrapper<T, indexed_hash>
{
static NOINLINE bool parse(T& v, const char* name, indexed_hash& out_value)
{
hash h;
if (!parse_wrapper<T, hash>::parse(v, name, h)) {
return false;
}
out_value = static_cast<indexed_hash>(h);
return true;
}
};
#endif
template<typename T>
struct parse_wrapper<T, difficulty_type>
{
+101 -52
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -27,7 +27,7 @@ namespace JSONRPCRequest {
struct CurlContext : public nocopy_nomove
{
CurlContext(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop);
CurlContext(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop, int timeout_seconds);
~CurlContext();
static int socket_func(CURL* easy, curl_socket_t s, int action, void* userp, void* socketp)
@@ -41,7 +41,8 @@ struct CurlContext : public nocopy_nomove
return reinterpret_cast<CurlContext*>(ctx)->on_timer(multi, timeout_ms);
}
static size_t write_func(const void* buffer, size_t size, size_t count, void* ctx)
// cppcheck-suppress constParameterCallback
static size_t write_func(char* buffer, size_t size, size_t count, void* ctx)
{
return reinterpret_cast<CurlContext*>(ctx)->on_write(buffer, size, count);
}
@@ -49,15 +50,13 @@ struct CurlContext : public nocopy_nomove
int on_socket(CURL* easy, curl_socket_t s, int action);
int on_timer(CURLM* multi, long timeout_ms);
static void on_timeout(uv_handle_t* req);
static void on_timeout(uv_timer_t* req);
size_t on_write(const void* buffer, size_t size, size_t count);
size_t on_write(const char* buffer, size_t size, size_t count);
static void curl_perform(uv_poll_t* req, int status, int events);
void check_multi_info();
static void on_close(uv_handle_t* h);
void shutdown();
std::vector<std::pair<curl_socket_t, uv_poll_t*>> m_pollHandles;
@@ -66,7 +65,7 @@ struct CurlContext : public nocopy_nomove
CallbackBase* m_closeCallback;
uv_loop_t* m_loop;
uv_timer_t m_timer;
uv_timer_t* m_timer;
CURLM* m_multiHandle;
CURL* m_handle;
@@ -82,13 +81,14 @@ struct CurlContext : public nocopy_nomove
uint64_t m_connectedTime;
std::string m_proxy;
int m_timeoutSeconds;
};
CurlContext::CurlContext(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop)
CurlContext::CurlContext(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop, int timeout_seconds)
: m_callback(cb)
, m_closeCallback(close_cb)
, m_loop(loop)
, m_timer{}
, m_timer(nullptr)
, m_multiHandle(nullptr)
, m_handle(nullptr)
, m_req(req)
@@ -96,6 +96,7 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
, m_startTime(0)
, m_connectedTime(0)
, m_proxy(proxy)
, m_timeoutSeconds(timeout_seconds)
{
m_pollHandles.reserve(2);
@@ -124,24 +125,16 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
m_req.clear();
}
else {
s << "/json_rpc\0";
s << "/json_rpc" << '\0';
}
m_url = buf;
}
int err = uv_timer_init(m_loop, &m_timer);
if (err) {
LOGERR(1, "uv_timer_init failed, error " << uv_err_name(err));
throw std::runtime_error("uv_timer_init failed");
}
m_timer.data = this;
m_multiHandle = curl_multi_init();
if (!m_multiHandle) {
static constexpr char msg[] = "curl_multi_init() failed";
LOGERR(1, msg);
uv_close(reinterpret_cast<uv_handle_t*>(&m_timer), nullptr);
throw std::runtime_error(msg);
}
@@ -151,6 +144,7 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
if (r != CURLM_OK) { \
static constexpr char msg[] = "curl_multi_setopt(" #__VA_ARGS__ ") failed"; \
LOGERR(1, msg << ": " << curl_multi_strerror(r)); \
curl_multi_cleanup(m_multiHandle); \
throw std::runtime_error(msg); \
} \
} while (0)
@@ -166,7 +160,6 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
static constexpr char msg[] = "curl_easy_init() failed";
LOGERR(1, msg);
curl_multi_cleanup(m_multiHandle);
uv_close(reinterpret_cast<uv_handle_t*>(&m_timer), nullptr);
throw std::runtime_error(msg);
}
@@ -176,6 +169,9 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
if (r != CURLE_OK) { \
static constexpr char msg[] = "curl_easy_setopt(" #__VA_ARGS__ ") failed"; \
LOGERR(1, msg << ": " << curl_easy_strerror(r)); \
curl_easy_cleanup(m_handle); \
curl_multi_cleanup(m_multiHandle); \
curl_slist_free_all(m_headers); \
throw std::runtime_error(msg); \
} \
} while (0)
@@ -185,14 +181,21 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
curl_easy_setopt_checked(m_handle, CURLOPT_WRITEFUNCTION, write_func);
curl_easy_setopt_checked(m_handle, CURLOPT_WRITEDATA, this);
int timeout = m_timeoutSeconds;
if (timeout <= 0) {
#ifdef DEV_TEST_SYNC
const int timeout = 10;
timeout = 10;
#else
const int timeout = proxy.empty() ? 1 : 5;
timeout = proxy.empty() ? 1 : 5;
#endif
}
curl_easy_setopt_checked(m_handle, CURLOPT_URL, m_url.c_str());
curl_easy_setopt_checked(m_handle, CURLOPT_POSTFIELDS, m_req.c_str());
if (!m_req.empty()) {
curl_easy_setopt_checked(m_handle, CURLOPT_POSTFIELDS, m_req.c_str());
}
curl_easy_setopt_checked(m_handle, CURLOPT_CONNECTTIMEOUT, timeout);
curl_easy_setopt_checked(m_handle, CURLOPT_TIMEOUT, timeout * 10);
@@ -221,7 +224,7 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
curl_easy_setopt_checked(m_handle, CURLOPT_SSL_VERIFYHOST, 0L);
if (!ssl_fingerprint.empty()) {
char buf[64] = {};
char buf[128] = {};
log::Stream s(buf);
s << "sha256//" << ssl_fingerprint;
@@ -230,15 +233,32 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
}
#endif
m_timer = new uv_timer_t{};
const int err = uv_timer_init(m_loop, m_timer);
if (err) {
LOGERR(1, "uv_timer_init failed, error " << uv_err_name(err));
delete m_timer;
curl_easy_cleanup(m_handle);
curl_multi_cleanup(m_multiHandle);
curl_slist_free_all(m_headers);
throw std::runtime_error("uv_timer_init failed");
}
m_timer->data = this;
CURLMcode curl_err = curl_multi_add_handle(m_multiHandle, m_handle);
if (curl_err != CURLM_OK) {
LOGERR(1, "curl_multi_add_handle failed: " << curl_multi_strerror(curl_err));
curl_easy_cleanup(m_handle);
curl_multi_cleanup(m_multiHandle);
uv_close(reinterpret_cast<uv_handle_t*>(&m_timer), nullptr);
curl_slist_free_all(m_headers);
uv_close(reinterpret_cast<uv_handle_t*>(m_timer), [](uv_handle_t* h) { delete reinterpret_cast<uv_timer_t*>(h); });
throw std::runtime_error("curl_multi_add_handle failed");
}
BACKGROUND_JOB_START(CurlContext);
m_startTime = microseconds_since_epoch();
}
@@ -249,7 +269,12 @@ CurlContext::~CurlContext()
if (m_error.empty() && !m_response.empty()) {
const uint64_t t = (m_proxy.empty() && m_connectedTime) ? m_connectedTime : microseconds_since_epoch();
tcp_ping = static_cast<double>(t - m_startTime) / 1000.0;
(*m_callback)(m_response.data(), m_response.size(), tcp_ping);
try {
(*m_callback)(m_response.data(), m_response.size(), tcp_ping);
}
catch (...) {
}
}
delete m_callback;
@@ -262,10 +287,15 @@ CurlContext::~CurlContext()
}
}
(*m_closeCallback)(m_error.c_str(), m_error.length(), tcp_ping);
try {
(*m_closeCallback)(m_error.c_str(), m_error.length(), tcp_ping);
}
catch (...) {
}
delete m_closeCallback;
curl_slist_free_all(m_headers);
BACKGROUND_JOB_STOP(CurlContext);
}
int CurlContext::on_socket(CURL* /*easy*/, curl_socket_t s, int action)
@@ -344,12 +374,17 @@ int CurlContext::on_socket(CURL* /*easy*/, curl_socket_t s, int action)
int CurlContext::on_timer(CURLM* /*multi*/, long timeout_ms)
{
if (!m_timer) {
LOGERR(1, "on_timer: timer is not initialized/already destroyed");
return -1;
}
if (timeout_ms < 0) {
uv_timer_stop(&m_timer);
uv_timer_stop(m_timer);
return 0;
}
const int result = uv_timer_start(&m_timer, reinterpret_cast<uv_timer_cb>(on_timeout), timeout_ms, 0);
const int result = uv_timer_start(m_timer, on_timeout, timeout_ms, 0);
if (result < 0) {
LOGERR(1, "uv_timer_start failed with error " << uv_err_name(result));
return -1;
@@ -358,7 +393,7 @@ int CurlContext::on_timer(CURLM* /*multi*/, long timeout_ms)
return 0;
}
void CurlContext::on_timeout(uv_handle_t* req)
void CurlContext::on_timeout(uv_timer_t* req)
{
CurlContext* ctx = reinterpret_cast<CurlContext*>(req->data);
@@ -375,15 +410,14 @@ void CurlContext::on_timeout(uv_handle_t* req)
}
}
size_t CurlContext::on_write(const void* buffer, size_t size, size_t count)
size_t CurlContext::on_write(const char* buffer, size_t size, size_t count)
{
if (!m_connectedTime) {
m_connectedTime = microseconds_since_epoch();
}
const size_t realsize = size * count;
const char* p = reinterpret_cast<const char*>(buffer);
m_response.insert(m_response.end(), p, p + realsize);
m_response.insert(m_response.end(), buffer, buffer + realsize);
return realsize;
}
@@ -448,23 +482,15 @@ void CurlContext::check_multi_info()
curl_multi_remove_handle(m_multiHandle, m_handle);
curl_easy_cleanup(m_handle);
curl_multi_cleanup(m_multiHandle);
m_handle = nullptr;
m_multiHandle = nullptr;
return;
}
}
}
void CurlContext::on_close(uv_handle_t* h)
{
CurlContext* ctx = reinterpret_cast<CurlContext*>(h->data);
h->data = nullptr;
if (ctx->m_timer.data) {
return;
}
delete ctx;
}
void CurlContext::shutdown()
{
for (const auto& p : m_pollHandles) {
@@ -473,26 +499,49 @@ void CurlContext::shutdown()
}
m_pollHandles.clear();
if (m_timer.data && !uv_is_closing(reinterpret_cast<uv_handle_t*>(&m_timer))) {
uv_close(reinterpret_cast<uv_handle_t*>(&m_timer), on_close);
if (m_timer->data && !uv_is_closing(reinterpret_cast<uv_handle_t*>(m_timer))) {
if (m_handle) {
if (m_multiHandle) {
curl_multi_remove_handle(m_multiHandle, m_handle);
}
curl_easy_cleanup(m_handle);
m_handle = nullptr;
}
if (m_multiHandle) {
curl_multi_cleanup(m_multiHandle);
m_multiHandle = nullptr;
}
curl_slist_free_all(m_headers);
uv_close(reinterpret_cast<uv_handle_t*>(m_timer), [](uv_handle_t* h) {
CurlContext* ctx = reinterpret_cast<CurlContext*>(h->data);
delete reinterpret_cast<uv_timer_t*>(h);
delete ctx;
});
}
}
void Call(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop)
void Call(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop, int timeout_seconds)
{
if (!loop) {
loop = uv_default_loop();
loop = uv_default_loop_checked();
}
const bool result = CallOnLoop(loop,
[=]()
{
try {
new CurlContext(address, port, req, auth, proxy, ssl, ssl_fingerprint, cb, close_cb, loop);
new CurlContext(address, port, req, auth, proxy, ssl, ssl_fingerprint, cb, close_cb, loop, timeout_seconds);
}
catch (const std::exception& e) {
const char* msg = e.what();
(*close_cb)(msg, strlen(msg), 0.0);
try {
(*close_cb)(msg, strlen(msg), 0.0);
}
catch (...) {
}
delete cb;
delete close_cb;
}
+7 -5
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -20,17 +20,19 @@
namespace p2pool {
namespace JSONRPCRequest {
typedef Callback<void, const char*, size_t, double>::Base CallbackBase;
typedef Callback<void, const char* /*msg*/, size_t /*msg_size*/, double /*tcp_ping*/>::Base CallbackBase;
void Call(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop);
FORCEINLINE static constexpr void dummy_callback(const char* /*msg*/, size_t /*msg_size*/, double /*tcp_ping*/) {}
void Call(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, CallbackBase* cb, CallbackBase* close_cb, uv_loop_t* loop, int timeout_seconds = 0);
template<typename T, typename U>
FORCEINLINE void call(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, T&& cb, U&& close_cb, uv_loop_t* loop = nullptr)
FORCEINLINE void call(const std::string& address, int port, const std::string& req, const std::string& auth, const std::string& proxy, bool ssl, const std::string& ssl_fingerprint, T&& cb, U&& close_cb, uv_loop_t* loop = nullptr, int timeout_seconds = 0)
{
typedef Callback<void, const char*, size_t, double>::Derived<T> CallbackT;
typedef Callback<void, const char*, size_t, double>::Derived<U> CallbackU;
Call(address, port, req, auth, proxy, ssl, ssl_fingerprint, new CallbackT(std::move(cb)), new CallbackU(std::move(close_cb)), loop);
Call(address, port, req, auth, proxy, ssl, ssl_fingerprint, new CallbackT(std::forward<T>(cb)), new CallbackU(std::forward<U>(close_cb)), loop, timeout_seconds);
}
} // namespace JSONRPCRequest
+17 -17
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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,12 +50,12 @@ NOINLINE void keccakf_plain(std::array<uint64_t, 25>& st)
bc[4] = st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24];
#define THETA(i) { \
const uint64_t t = bc[(i + 4) % 5] ^ ROTL64(bc[(i + 1) % 5], 1); \
st[i + 0 ] ^= t; \
st[i + 5] ^= t; \
st[i + 10] ^= t; \
st[i + 15] ^= t; \
st[i + 20] ^= t; \
const uint64_t t = bc[((i) + 4) % 5] ^ ROTL64(bc[((i) + 1) % 5], 1); \
st[(i) + 0 ] ^= t; \
st[(i) + 5] ^= t; \
st[(i) + 10] ^= t; \
st[(i) + 15] ^= t; \
st[(i) + 20] ^= t; \
}
THETA(0);
@@ -93,16 +93,16 @@ NOINLINE void keccakf_plain(std::array<uint64_t, 25>& st)
// Chi
#define CHI(j) { \
const uint64_t st0 = st[j ]; \
const uint64_t st1 = st[j + 1]; \
const uint64_t st2 = st[j + 2]; \
const uint64_t st3 = st[j + 3]; \
const uint64_t st4 = st[j + 4]; \
st[j ] ^= ~st1 & st2; \
st[j + 1] ^= ~st2 & st3; \
st[j + 2] ^= ~st3 & st4; \
st[j + 3] ^= ~st4 & st0; \
st[j + 4] ^= ~st0 & st1; \
const uint64_t st0 = st[(j) ]; \
const uint64_t st1 = st[(j) + 1]; \
const uint64_t st2 = st[(j) + 2]; \
const uint64_t st3 = st[(j) + 3]; \
const uint64_t st4 = st[(j) + 4]; \
st[(j) ] ^= ~st1 & st2; \
st[(j) + 1] ^= ~st2 & st3; \
st[(j) + 2] ^= ~st3 & st4; \
st[(j) + 3] ^= ~st4 & st0; \
st[(j) + 4] ^= ~st0 & st1; \
}
CHI( 0);
+5 -3
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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,6 +17,8 @@
#pragma once
#include "keccak_constexpr.h"
namespace p2pool {
enum KeccakParams {
@@ -47,7 +49,7 @@ FORCEINLINE void keccak(const uint8_t* in, int inlen, uint8_t (&md)[N])
}
template<typename T>
FORCEINLINE void keccak_custom(T&& in, int inlen, uint8_t* md, int mdlen)
FORCEINLINE void keccak_custom(T&& in, int inlen, uint8_t* md, int mdlen, bool SHA3 = false)
{
std::array<uint64_t, 25> st = {};
@@ -74,7 +76,7 @@ FORCEINLINE void keccak_custom(T&& in, int inlen, uint8_t* md, int mdlen)
temp[i] = in(offset + i);
}
temp[inlen++] = 1;
temp[inlen++] = SHA3 ? 6 : 1;
memset(temp + inlen, 0, rsiz - inlen);
temp[rsiz - 1] |= 0x80;
+17 -17
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -43,12 +43,12 @@ NOINLINE void keccakf_bmi(std::array<uint64_t, 25>& st)
bc[4] = st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24];
#define THETA(i) { \
const uint64_t t = bc[(i + 4) % 5] ^ ROTL64(bc[(i + 1) % 5], 1); \
st[i + 0 ] ^= t; \
st[i + 5] ^= t; \
st[i + 10] ^= t; \
st[i + 15] ^= t; \
st[i + 20] ^= t; \
const uint64_t t = bc[((i) + 4) % 5] ^ ROTL64(bc[((i) + 1) % 5], 1); \
st[(i) + 0 ] ^= t; \
st[(i) + 5] ^= t; \
st[(i) + 10] ^= t; \
st[(i) + 15] ^= t; \
st[(i) + 20] ^= t; \
}
THETA(0);
@@ -86,16 +86,16 @@ NOINLINE void keccakf_bmi(std::array<uint64_t, 25>& st)
// Chi
#define CHI(j) { \
const uint64_t st0 = st[j ]; \
const uint64_t st1 = st[j + 1]; \
const uint64_t st2 = st[j + 2]; \
const uint64_t st3 = st[j + 3]; \
const uint64_t st4 = st[j + 4]; \
st[j ] ^= _andn_u64(st1, st2); \
st[j + 1] ^= _andn_u64(st2, st3); \
st[j + 2] ^= _andn_u64(st3, st4); \
st[j + 3] ^= _andn_u64(st4, st0); \
st[j + 4] ^= _andn_u64(st0, st1); \
const uint64_t st0 = st[(j) ]; \
const uint64_t st1 = st[(j) + 1]; \
const uint64_t st2 = st[(j) + 2]; \
const uint64_t st3 = st[(j) + 3]; \
const uint64_t st4 = st[(j) + 4]; \
st[(j) ] ^= _andn_u64(st1, st2); \
st[(j) + 1] ^= _andn_u64(st2, st3); \
st[(j) + 2] ^= _andn_u64(st3, st4); \
st[(j) + 3] ^= _andn_u64(st4, st0); \
st[(j) + 4] ^= _andn_u64(st0, st1); \
}
CHI(0);
+114
View File
@@ -0,0 +1,114 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
namespace p2pool {
namespace ConstexprKeccak
{
template<int ROUNDS>
static FORCEINLINE constexpr void keccakf(std::array<uint64_t, 25>& st)
{
constexpr uint64_t round_constants[24] =
{
0x0000000000000001, 0x0000000000008082, 0x800000000000808a,
0x8000000080008000, 0x000000000000808b, 0x0000000080000001,
0x8000000080008081, 0x8000000000008009, 0x000000000000008a,
0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
0x000000008000808b, 0x800000000000008b, 0x8000000000008089,
0x8000000000008003, 0x8000000000008002, 0x8000000000000080,
0x000000000000800a, 0x800000008000000a, 0x8000000080008081,
0x8000000000008080, 0x0000000080000001, 0x8000000080008008
};
constexpr int order[25] = { 1, 6, 9, 22, 14, 20, 2, 12, 13, 19, 23, 15, 4, 24, 21, 8, 16, 5, 3, 18, 17, 11, 7, 10, 1 };
constexpr int shift[24] = { 44, 20, 61, 39, 18, 62, 43, 25, 8, 56, 41, 27, 14, 2, 55, 45, 36, 28, 21, 15, 10, 6, 3, 1 };
for (int round = 0; round < ROUNDS; ++round) {
uint64_t bc[5] = {};
// Theta
for (int i = 0; i < 5; ++i) bc[i] = st[i] ^ st[i + 5] ^ st[i + 10] ^ st[i + 15] ^ st[i + 20];
for (int i = 0; i < 5; ++i) {
const uint64_t t = bc[(i + 4) % 5] ^ ((bc[(i + 1) % 5] << 1) | (bc[(i + 1) % 5] >> 63));
for (int j = 0; j < 25; j += 5) st[i + j] ^= t;
}
// Rho Pi
const auto st0 = st;
for (int i = 0; i < 24; ++i) st[order[i]] = (st0[order[i + 1]] << shift[i]) | (st0[order[i + 1]] >> (64 - shift[i]));
// Chi
for (int i = 0; i < 25; i += 5) {
const uint64_t t[5] = { st[i], st[i + 1], st[i + 2], st[i + 3], st[i + 4] };
for (int j = 0; j < 5; ++j) st[i + j] ^= ~t[(j + 1) % 5] & t[(j + 2) % 5];
}
// Iota
st[0] ^= round_constants[round];
}
}
} // namespace ConstexprKeccak
template<int len>
static constexpr hash keccak(const char (&input)[len])
{
constexpr int rsiz = 136;
constexpr int inlen = len - 1;
static_assert(inlen < rsiz, "Too long input");
uint8_t temp[rsiz] = {};
for (int i = 0; i < inlen; ++i) {
temp[i] = static_cast<uint8_t>(input[i]);
}
temp[inlen] = 1;
temp[rsiz - 1] |= 0x80;
std::array<uint64_t, 25> st = {};
for (int i = 0; i < rsiz / 8; i++) {
uint64_t k = 0;
for (int j = 0; j < 8; ++j) {
k |= static_cast<uint64_t>(temp[i * 8 + j]) << (j * 8);
}
st[i] ^= k;
}
ConstexprKeccak::keccakf<24>(st);
hash result{};
for (size_t i = 0; i < HASH_SIZE; ++i) {
result.h[i] = static_cast<uint8_t>(st[i / 8] >> ((i % 8) * 8));
}
return result;
}
constexpr hash keccak_0x00 = keccak("\0");
constexpr hash keccak_subaddress_viewpub = keccak("subaddress_viewpub");
constexpr hash keccak_onion_address_v3 = keccak("onion_address_v3");
constexpr hash keccak_i2p_b32_address = keccak("i2p_b32_address");
static_assert(keccak_0x00.u64<0>() == 0x14281E7A9E7836BCULL, "constexpr keccak code check failed");
} // namespace p2pool
+109 -91
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -18,6 +18,7 @@
#include "common.h"
#include "uv_util.h"
#include "wallet.h"
#include "params.h"
#include <ctime>
#include <fstream>
#include <thread>
@@ -118,26 +119,37 @@ public:
BUF_SIZE = SLOT_SIZE * 8192,
};
FORCEINLINE Worker()
FORCEINLINE explicit Worker(const Params& p)
: m_writePos(0)
, m_readPos(0)
, m_stopped(false)
, m_needReopen(false)
, m_consoleLogEnabled(p.m_consoleLogEnabled)
, m_logFileEnabled(p.m_logFileEnabled)
, m_logFileLastStatTime(0)
, m_workerWaiting(false)
{
#if defined(_WIN32) && defined(_MSC_VER) && !defined(NDEBUG)
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
#endif
set_main_thread();
std::setlocale(LC_ALL, "C");
std::setlocale(LC_ALL, "en_001");
m_logFilePath = DATA_DIR + log_file_name;
m_logFilePath = p.m_logFilePath.empty() ? (p.m_dataDir + log_file_name) : p.m_logFilePath;
m_buf.resize(BUF_SIZE);
uv_cond_init(&m_cond);
uv_mutex_init(&m_mutex);
int err = uv_cond_init(&m_cond);
if (err) {
fprintf(stderr, "failed to init m_cond in the logger thread (%s), aborting\n", uv_err_name(err));
abort();
}
err = uv_mutex_init(&m_mutex);
if (err) {
fprintf(stderr, "failed to init m_mutex in the logger thread (%s), aborting\n", uv_err_name(err));
abort();
}
#ifdef _WIN32
SetConsoleMode(hStdIn, ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_EXTENDED_FLAGS);
@@ -153,9 +165,7 @@ public:
CONSOLE_COLORS = false;
}
init_uv_threadpool();
const int err = uv_thread_create(&m_worker, run_wrapper, this);
err = uv_thread_create(&m_worker, run_wrapper, this);
if (err) {
fprintf(stderr, "failed to start logger thread (%s), aborting\n", uv_err_name(err));
abort();
@@ -187,34 +197,37 @@ public:
uv_cond_destroy(&m_cond);
uv_mutex_destroy(&m_mutex);
m_logFile.close();
if (m_logFileEnabled) {
m_logFile.close();
}
}
FORCEINLINE void write(const char* buf, uint32_t size)
{
if (m_writePos.load() - m_readPos > BUF_SIZE - SLOT_SIZE * 16) {
// Buffer is full, can't log normally
if (size > 3) {
fwrite(buf + 3, 1, size - 3, stderr);
}
return;
}
uint32_t writePos = m_writePos.load(std::memory_order_relaxed);
do {
if (writePos - m_readPos.load(std::memory_order_relaxed) > BUF_SIZE - SLOT_SIZE) {
// Buffer is full, can't log normally
if ((size > 3) && m_consoleLogEnabled) {
fwrite(buf + 3, 1, size - 3, stderr);
}
return;
}
} while (!m_writePos.compare_exchange_weak(writePos, writePos + SLOT_SIZE, std::memory_order_acq_rel, std::memory_order_relaxed));
const uint32_t writePos = m_writePos.fetch_add(SLOT_SIZE);
char* p = m_buf.data() + (writePos % BUF_SIZE);
memcpy(p + 1, buf + 1, size - 1);
// Ensure memory order in the writer thread
#ifndef DEV_WITH_TSAN
std::atomic_thread_fence(std::memory_order_seq_cst);
#endif
// Mark that everything is written into this log slot
p[0] = buf[0] + 1;
std::atomic<char>* severity = reinterpret_cast<std::atomic<char>*>(p);
severity->store(static_cast<char>(buf[0] + 1), std::memory_order_release);
// Signal the worker thread
uv_cond_signal(&m_cond);
if (m_workerWaiting.load(std::memory_order_relaxed)) {
uv_cond_signal(&m_cond);
}
}
const std::string& log_file_path() const { return m_logFilePath; }
@@ -222,37 +235,20 @@ public:
FORCEINLINE void schedule_reopen()
{
m_needReopen = true;
uv_cond_signal(&m_cond);
// Signal the worker thread
if (m_workerWaiting.load(std::memory_order_relaxed)) {
uv_cond_signal(&m_cond);
}
}
private:
static void init_uv_threadpool()
{
#ifdef _MSC_VER
#define putenv _putenv
#endif
const uint32_t N = std::min(std::max(std::thread::hardware_concurrency(), 4U), 8U);
static char buf[40] = {};
log::Stream s(buf);
s << "UV_THREADPOOL_SIZE=" << N << '\0';
int err = putenv(buf);
if (err != 0) {
err = errno;
fprintf(stderr, "Couldn't set UV thread pool size to %u threads, putenv returned error %d\n", N, err);
}
static uv_work_t dummy;
err = uv_queue_work(uv_default_loop_checked(), &dummy, [](uv_work_t*) {}, nullptr);
if (err) {
fprintf(stderr, "init_uv_threadpool: uv_queue_work failed, error %s\n", uv_err_name(err));
}
}
bool reopen(struct stat& st)
{
if (!m_logFileEnabled) {
return true;
}
st = {};
if (m_logFile.is_open()) {
@@ -273,7 +269,6 @@ private:
return true;
}
private:
static void run_wrapper(void* arg) { reinterpret_cast<Worker*>(arg)->run(); }
NOINLINE void run()
@@ -282,21 +277,24 @@ private:
struct stat log_file_st;
if (!reopen(log_file_st)) {
if (!reopen(log_file_st) && m_consoleLogEnabled) {
fprintf(stderr, "failed to open %s: error %d\n", m_logFilePath.c_str(), errno);
}
do {
uv_mutex_lock(&m_mutex);
if (m_readPos == m_writePos.load()) {
// Nothing to do, wait for the signal or exit if stopped
if (m_stopped) {
uv_mutex_unlock(&m_mutex);
return;
{
MutexLock lock(m_mutex);
if (m_readPos.load(std::memory_order_relaxed) == m_writePos.load(std::memory_order_acquire)) {
if (m_stopped) {
return;
}
m_workerWaiting.store(true, std::memory_order_relaxed);
uv_cond_wait(&m_cond, &m_mutex);
m_workerWaiting.store(false, std::memory_order_relaxed);
}
uv_cond_wait(&m_cond, &m_mutex);
}
uv_mutex_unlock(&m_mutex);
bool expected = true;
if (m_needReopen.compare_exchange_strong(expected, false)) {
@@ -306,23 +304,20 @@ private:
}
}
for (uint32_t writePos = m_writePos.load(); m_readPos != writePos; writePos = m_writePos.load()) {
for (uint32_t writePos = m_writePos.load(std::memory_order_acquire); m_readPos.load(std::memory_order_relaxed) != writePos; writePos = m_writePos.load(std::memory_order_acquire)) {
// We have at least one log slot pending, possibly more than one
// Process everything in a loop before reading m_writePos again
do {
char* p = m_buf.data() + (m_readPos % BUF_SIZE);
char* p = m_buf.data() + (m_readPos.load(std::memory_order_relaxed) % BUF_SIZE);
// Wait until everything is written into this log slot
volatile char& severity = p[0];
while (!severity) {
std::atomic<char>* severity_ptr = reinterpret_cast<std::atomic<char>*>(p);
char severity;
while (!(severity = severity_ptr->load(std::memory_order_acquire))) {
std::this_thread::yield();
}
// Ensure memory order in the reader thread
#ifndef DEV_WITH_TSAN
std::atomic_thread_fence(std::memory_order_seq_cst);
#endif
uint32_t size = static_cast<uint8_t>(p[2]);
size = (size << 8) + static_cast<uint8_t>(p[1]);
@@ -337,9 +332,11 @@ private:
strip_colors(p, size);
}
fwrite(p, 1, size, (severity == 1) ? stdout : stderr);
if (m_consoleLogEnabled) {
fwrite(p, 1, size, (severity == 1) ? stdout : stderr);
}
if (m_logFile.is_open()) {
if (m_logFileEnabled && m_logFile.is_open()) {
if (c) {
strip_colors(p, size);
}
@@ -359,28 +356,37 @@ private:
}
// Mark this log slot empty
severity = '\0';
severity_ptr->store('\0', std::memory_order_relaxed);
m_readPos += SLOT_SIZE;
} while (m_readPos != writePos);
// fetch_add returns the pre-increment value; "+ SLOT_SIZE" gives us the new m_readPos
} while (m_readPos.fetch_add(SLOT_SIZE, std::memory_order_relaxed) + SLOT_SIZE != writePos);
}
// Flush the log file only after all pending log lines have been written
if (m_logFile.is_open()) {
if (m_logFileEnabled && m_logFile.is_open()) {
m_logFile.flush();
// Automatically reopen the file if either it
// no longer exists or it is now a different
// regular file; this detects manual moving or
// recreating of the file
struct stat buf;
if (stat(m_logFilePath.c_str(), &buf) == 0) {
if(log_file_st.st_dev && log_file_st.st_ino && S_ISREG(buf.st_mode) &&
(buf.st_dev != log_file_st.st_dev || buf.st_ino != log_file_st.st_ino)) {
// Throttle this check to once per 500 ms
const uint64_t now = microseconds_since_epoch();
if (now >= m_logFileLastStatTime + 500'000) {
m_logFileLastStatTime = now;
struct stat buf;
if (stat(m_logFilePath.c_str(), &buf) == 0) {
if (log_file_st.st_dev && log_file_st.st_ino && S_ISREG(buf.st_mode) &&
(buf.st_dev != log_file_st.st_dev || buf.st_ino != log_file_st.st_ino)) {
reopen(log_file_st);
}
}
else if (errno == ENOENT) {
reopen(log_file_st);
}
} else if(errno == ENOENT) {
reopen(log_file_st);
}
}
@@ -429,6 +435,11 @@ private:
std::ofstream m_logFile;
std::string m_logFilePath;
bool m_consoleLogEnabled;
bool m_logFileEnabled;
uint64_t m_logFileLastStatTime;
std::atomic<bool> m_workerWaiting;
};
static Worker* worker = nullptr;
@@ -453,7 +464,7 @@ static FORCEINLINE void writeCurrentTime(Stream& s)
s.setNumberWidth(2);
s << (t.tm_year + 1900) << '-' << (t.tm_mon + 1) << '-' << t.tm_mday << ' ' << t.tm_hour << ':' << t.tm_min << ':' << t.tm_sec << '.';
const int32_t mcs = time_point_cast<microseconds>(now).time_since_epoch().count() % 1000000;
const int32_t mcs = static_cast<int32_t>(time_point_cast<microseconds>(now).time_since_epoch().count() % 1000000);
s.setNumberWidth(4);
s << (mcs / 100);
@@ -474,20 +485,24 @@ NOINLINE Writer::Writer(Severity severity) : Stream(m_stackBuf)
NOINLINE Writer::~Writer()
{
const uint32_t size = static_cast<uint32_t>(m_pos + 1);
m_buf[1] = static_cast<uint8_t>(size & 255);
m_buf[2] = static_cast<uint8_t>(size >> 8);
m_buf[1] = static_cast<char>(static_cast<uint8_t>(size & 255));
m_buf[2] = static_cast<char>(static_cast<uint8_t>(size >> 8));
m_buf[m_pos] = '\n';
#ifndef P2POOL_LOG_DISABLE
worker->write(m_buf, size);
if (worker) {
worker->write(m_buf, size);
}
#endif
}
void start()
void start(const Params& p)
{
#ifndef P2POOL_LOG_DISABLE
worker = new Worker();
worker = new Worker(p);
LOGINFO(0, "started");
#else
(void)p;
#endif
}
@@ -495,10 +510,13 @@ void reopen()
{
// This will trigger the worker thread which will then reopen log file if it's been moved
#ifndef P2POOL_LOG_DISABLE
worker->schedule_reopen();
if (worker) {
worker->schedule_reopen();
}
#endif
}
// Called from main() after everything else is already shut down and destroyed, so no thread races here
void stop()
{
#ifndef P2POOL_LOG_DISABLE
+23 -5
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -20,6 +20,7 @@
namespace p2pool {
class Wallet;
struct Params;
namespace log {
@@ -82,9 +83,9 @@ struct Stream
const bool negative = is_negative(data);
std::make_unsigned_t<T> udata = abs(data);
char buf[32];
char buf[80];
size_t k = sizeof(buf);
int w = m_numberWidth;
int w = std::min<int>(m_numberWidth, static_cast<int>(sizeof(buf)));
do {
buf[--k] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"[udata % base];
@@ -184,6 +185,11 @@ template<> struct Stream::Entry<char>
static FORCEINLINE void put(char c, Stream* wrapper) { wrapper->writeBuf(&c, 1); }
};
template<> struct Stream::Entry<std::string_view>
{
static FORCEINLINE void put(const std::string_view& data, Stream* wrapper) { wrapper->writeBuf(data.data(), data.size()); }
};
#define INT_ENTRY(x) \
template<> struct Stream::Entry<x> { static FORCEINLINE void put(x data, Stream* wrapper) { wrapper->writeInt(data); } };
@@ -259,13 +265,20 @@ template<> struct Stream::Entry<hash>
}
};
#ifdef WITH_INDEXED_HASHES
template<> struct Stream::Entry<indexed_hash>
{
static FORCEINLINE void put(const indexed_hash& data, Stream* wrapper) { Stream::Entry<hash>::put(data, wrapper); }
};
#endif
template<> struct Stream::Entry<difficulty_type>
{
static NOINLINE void put(const difficulty_type& data, Stream* wrapper)
{
char buf[40];
size_t k = sizeof(buf);
int w = wrapper->m_numberWidth;
int w = std::min<int>(wrapper->m_numberWidth, sizeof(buf));
uint64_t a = data.lo;
uint64_t b = data.hi;
@@ -584,7 +597,12 @@ struct DummyStream
#define LOGINFO(level, ...) SIDE_EFFECT_CHECK(level, log_category_prefix << __VA_ARGS__)
#define LOGWARN(level, ...) SIDE_EFFECT_CHECK(level, log_category_prefix << __VA_ARGS__)
#ifdef P2POOL_ABORT_ON_LOG_ERROR
#define LOGERR(level, ...) do { SIDE_EFFECT_CHECK(level, log_category_prefix << __VA_ARGS__); abort(); } while (0)
#else
#define LOGERR(level, ...) SIDE_EFFECT_CHECK(level, log_category_prefix << __VA_ARGS__)
#endif
#else
@@ -605,7 +623,7 @@ struct DummyStream
#endif
void start();
void start(const Params& p);
void reopen();
void stop();
+126 -57
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -38,12 +38,15 @@
#endif // WITH_GRPC
#include <filesystem>
#include <fstream>
#ifdef WITH_RANDOMX
#include "randomx.h"
#endif
#ifdef WITH_TLS
#include "tls.h"
#endif
#if defined(_WIN32) && defined(_MSC_VER) && !defined(NDEBUG)
#include <DbgHelp.h>
@@ -56,17 +59,23 @@ void p2pool_usage()
{
printf("P2Pool %s\n"
"\nUsage:\n\n" \
"--wallet Wallet address to mine to. Subaddresses and integrated addresses are not supported!\n"
"--wallet Main wallet address (the one that starts with 4...). To mine to a subaddress of this wallet, use it together with --subaddress\n"
"--subaddress Subaddress to mine to. It must belong to the same wallet that was specified with --wallet parameter\n"
"--host IP address of your Monero node, default is 127.0.0.1\n"
"--rpc-port monerod RPC API port number, default is 18081\n"
"--zmq-port monerod ZMQ pub port number, default is 18083 (same port as in monerod's \"--zmq-pub\" command line parameter)\n"
"--stratum Comma-separated list of IP:port for stratum server to listen on\n"
"--nodejs-pool-rpc Comma-separated list of IP:port for daemon-compatible RPC facade for nodejs pools\n"
"--p2p Comma-separated list of IP:port for p2p server to listen on\n"
"--addpeers Comma-separated list of IP:port of other p2pool nodes to connect to\n"
"--stratum-ban-time N Number of seconds to ban misbehaving stratum client, default is %u\n"
"--light-mode Don't allocate RandomX dataset, saves 2GB of RAM\n"
"--loglevel Verbosity of the log, integer number between 0 and %d\n"
"--data-dir Path to store general p2pool files (log, cache, peer data, etc.), default is current directory\n"
"--log-file Path to the log file, default is \"p2pool.log\" in p2pool's working directory\n"
"--no-console-log Disable logging to the console\n"
"--no-log-file Disable logging to the file\n"
"--disable-log Equivalent to --no-console-log --no-log-file, disables logging entirely and saves ~8 MB of memory\n"
"--sidechain-config Name of the p2pool sidechain parameters file (only use it if you run your own sidechain)\n"
"--data-api Path to the p2pool JSON data (use it in tandem with an external web-server). Not affected by --data-dir setting!\n"
"--local-api Enable /local/ path in api path for Stratum Server and built-in miner statistics\n"
@@ -84,6 +93,7 @@ void p2pool_usage()
"--no-autodiff Disable automatic difficulty adjustment for miners connected to stratum (WARNING: incompatible with Nicehash and MRR)\n"
"--rpc-login Specify username[:password] required for Monero RPC server\n"
"--socks5 Specify IP:port of a SOCKS5 proxy to use for outgoing connections\n"
"--socks5-proxy-type The type of SOCKS5 proxy. Can be one of the following values: auto, plain, tor, i2p. Default is auto (auto-detected by the port number)\n"
"--no-dns Disable DNS queries, use only IP addresses to connect to peers (seed node DNS will be unavailable too)\n"
"--p2p-external-port Port number that your router uses for mapping to your local p2p port. Use it if you are behind a NAT and still want to accept incoming connections\n"
#ifdef WITH_UPNP
@@ -99,7 +109,14 @@ void p2pool_usage()
"--rpc-ssl Enable SSL on RPC connections to the Monero node\n"
"--rpc-ssl-fingerprint base64-encoded fingerprint of the Monero node's certificate (optional, use it for certificate pinning)\n"
#endif
"--stratum-proxy-protocol Enable HAProxy PROXY protocol v2 for incoming Stratum connections (use with HAProxy send-proxy-v2)\n"
"--p2p-proxy-protocol Enable HAProxy PROXY protocol v2 for incoming P2P connections (use with HAProxy send-proxy-v2)\n"
"--no-stratum-http Disable HTTP on Stratum ports\n"
"--full-validation Enables full share validation / increases CPU usage\n"
"--onion-address Tell other peers to use this .onion address to connect to this node through TOR\n"
"--i2p-address Tell other peers to use this .b32.i2p address to connect to this node through I2P\n"
"--no-clearnet-p2p Forces P2P server to listen on 127.0.0.1 and to not connect to clearnet IPs\n"
"--params-file File name to load parameters from. It can't be used together with any other command line parameters\n"
"--help Show this help message\n\n"
"Example command line:\n\n"
"%s --host 127.0.0.1 --rpc-port 18081 --zmq-port 18083 --wallet YOUR_WALLET_ADDRESS --stratum 0.0.0.0:%d --p2p 0.0.0.0:%d\n\n",
@@ -201,7 +218,7 @@ int p2pool_test()
constexpr char expected_hash[] = "3b5ecc2bb14f467161a04fe476b541194fba82dbbbfc7c320961f922a0294dee";
if (memcmp(buf, expected_hash, RANDOMX_HASH_SIZE * 2) != 0) {
if (memcmp(buf, expected_hash, static_cast<int>(RANDOMX_HASH_SIZE * 2)) != 0) {
printf("Invalid hash calculated: expected %s, got %s\n", expected_hash, buf);
return 1;
}
@@ -214,6 +231,56 @@ int p2pool_test()
return 0;
}
static p2pool::Params get_params(int argc, const char* const argv[]) noexcept
{
try {
std::vector<std::vector<std::string>> args;
args.reserve(argc);
// Group command-line parameters by the pattern "--name [data1 data2 ... data_n]"
// Each parameter starting with "--" can have 0 or more values attached to it
for (int i = 1; i < argc; ++i) {
std::string_view arg = argv[i];
if ((arg.size() > 2) && (arg[0] == '-') && (arg[1] == '-')) {
// Store the parameter name without the "--" prefix
arg.remove_prefix(2);
args.emplace_back(1, std::string(arg));
}
else if (!args.empty()) {
args.back().emplace_back(std::move(arg));
}
}
p2pool::Params params(args);
if (params.valid()) {
return params;
}
}
catch (const std::exception&) {
}
printf("Invalid or missing command line. Try \"p2pool --help\".\n");
abort();
}
static p2pool::Params get_params(const std::string& params_file) noexcept
{
try {
p2pool::Params params(p2pool::parse_config(params_file));
if (params.valid()) {
return params;
}
}
catch (const std::exception&) {
}
printf("Invalid or missing command line. Try \"p2pool --help\".\n");
abort();
}
int main(int argc, char* argv[])
{
if (argc == 1) {
@@ -221,11 +288,10 @@ int main(int argc, char* argv[])
return 0;
}
bool is_mini = false;
bool is_nano = false;
std::string params_file;
for (int i = 1; i < argc; ++i) {
if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "/help") || !strcmp(argv[i], "-h") || !strcmp(argv[i], "/h")) {
if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "/help") || !strcmp(argv[i], "-h") || !strcmp(argv[i], "/h") || !strcmp(argv[i], "/?")) {
p2pool_usage();
return 0;
}
@@ -239,53 +305,17 @@ int main(int argc, char* argv[])
return p2pool_test();
}
if ((strcmp(argv[i], "--data-dir") == 0) && (i + 1 < argc)) {
std::string path = argv[++i];
p2pool::DATA_DIR = std::move(path);
p2pool::fixup_path(p2pool::DATA_DIR);
}
if (!strcmp(argv[i], "--mini")) is_mini = true;
if (!strcmp(argv[i], "--nano")) is_nano = true;
}
// If the data directory is not set, check if P2Pool has write access to the current directory
// If it doesn't, switch to user's home directory
if (p2pool::DATA_DIR.empty()) {
std::ofstream f("p2pool.tmp");
if (f && f.put(' ')) {
f.close();
std::remove("p2pool.tmp");
}
else {
char buf[1024];
size_t size = sizeof(buf);
if (uv_os_homedir(buf, &size) == 0) {
p2pool::DATA_DIR.assign(buf, size);
p2pool::fixup_path(p2pool::DATA_DIR);
p2pool::DATA_DIR += ".p2pool/";
if (is_mini) {
p2pool::DATA_DIR += "mini/";
}
else if (is_nano) {
p2pool::DATA_DIR += "nano/";
}
}
if (!strcmp(argv[i], "--params-file") && (i + 1 < argc)) {
params_file = argv[++i];
}
}
if (!p2pool::DATA_DIR.empty()) {
printf("Using \"%s\" for P2Pool files\n", p2pool::DATA_DIR.c_str());
if (!params_file.empty() && (argc != 3)) {
fprintf(stderr, "--params-file can't be combined with other command line parameters\n");
return 1;
}
// Try to create it if it doesn't exist
if (!p2pool::DATA_DIR.empty()) {
std::error_code err;
std::filesystem::create_directories(p2pool::DATA_DIR, err);
}
p2pool::set_main_thread();
#if defined(_WIN32) && defined(_MSC_VER) && !defined(NDEBUG)
SymInitialize(GetCurrentProcess(), NULL, TRUE);
@@ -295,24 +325,53 @@ int main(int argc, char* argv[])
memory_tracking_start();
// Create default loop here
uv_default_loop();
int result;
{
p2pool::log::start();
// Create the default libuv loop and initialize libuv here
// It will call the important stuff like WSAStartup and many other things
// Some P2Pool code will not work without libuv initialized, so the code above this line must be minimal
p2pool::init_uv();
const p2pool::Params params = params_file.empty() ? get_params(argc, argv) : get_params(params_file);
if (!params.m_dataDir.empty()) {
printf("Using \"%s\" for P2Pool files\n", params.m_dataDir.c_str());
// Try to create it if it doesn't exist
std::error_code err;
std::filesystem::create_directories(params.m_dataDir, err);
}
if (params.m_consoleLogEnabled || params.m_logFileEnabled) {
p2pool::log::start(params);
}
else {
p2pool::log::GLOBAL_LOG_LEVEL = -1;
}
p2pool::init_crypto_cache();
int result = static_cast<int>(curl_global_init_mem(CURL_GLOBAL_ALL, p2pool::malloc_hook, p2pool::free_hook, p2pool::realloc_hook, p2pool::strdup_hook, p2pool::calloc_hook));
result = static_cast<int>(curl_global_init_mem(CURL_GLOBAL_ALL, p2pool::malloc_hook, p2pool::free_hook, p2pool::realloc_hook, p2pool::strdup_hook, p2pool::calloc_hook));
if (result != CURLE_OK) {
return result;
}
#ifdef WITH_GRPC
grpc_init();
if (params.grpc_needed()) {
grpc_init();
}
#endif
#ifdef WITH_TLS
if (!p2pool::ServerTls::global_init()) {
printf("ServerTls::global_init failed\n");
return 1;
}
#endif
try {
p2pool::p2pool pool(argc, argv);
p2pool::p2pool pool(params);
result = pool.run();
}
catch (...) {
@@ -320,14 +379,22 @@ int main(int argc, char* argv[])
}
#ifdef WITH_GRPC
grpc_shutdown();
if (params.grpc_needed()) {
grpc_shutdown();
}
#endif
curl_global_cleanup();
p2pool::destroy_crypto_cache();
p2pool::log::stop();
#ifdef WITH_INDEXED_HASHES
p2pool::indexed_hash::cleanup_storage();
#endif
if (params.m_consoleLogEnabled || params.m_logFileEnabled) {
p2pool::log::stop();
}
uv_loop_close(uv_default_loop());
@@ -335,6 +402,8 @@ int main(int argc, char* argv[])
uv_library_shutdown();
#endif
}
if (!memory_tracking_stop()) {
result = 1;
}
+2 -2
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -395,5 +395,5 @@ char* strdup_hook(const char* s) noexcept
#endif
}
}
} // namespace p2pool
#endif
+16 -2
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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
@@ -41,7 +41,7 @@ void Mempool::add(const TxMempoolData& tx)
}
}
void Mempool::swap(std::vector<TxMempoolData>& transactions)
void Mempool::swap_transactions(std::vector<TxMempoolData>& transactions)
{
const uint64_t cur_time = seconds_since_epoch();
@@ -59,10 +59,24 @@ void Mempool::swap(std::vector<TxMempoolData>& transactions)
}
m_transactions.clear();
m_transactions.reserve(transactions.size());
for (TxMempoolData& data : transactions) {
m_transactions.emplace(data.id, data);
}
}
void Mempool::remove(const std::vector<hash>& tx_hashes)
{
if (tx_hashes.empty()) {
return;
}
WriteLock lock(m_lock);
for (const hash& h : tx_hashes) {
m_transactions.erase(h);
}
}
} // namespace p2pool
+4 -2
View File
@@ -1,6 +1,6 @@
/*
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
* Copyright (c) 2021-2025 SChernykh <https://github.com/SChernykh>
* Copyright (c) 2021-2026 SChernykh <https://github.com/SChernykh>
*
* 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,7 +32,7 @@ public:
~Mempool();
void add(const TxMempoolData& tx);
void swap(std::vector<TxMempoolData>& transactions);
void swap_transactions(std::vector<TxMempoolData>& transactions);
size_t size() const
{
@@ -56,6 +56,8 @@ public:
m_transactions.clear();
}
void remove(const std::vector<hash>& tx_hashes);
private:
mutable uv_rwlock_t m_lock;
unordered_map<hash, TxMempoolData> m_transactions;

Some files were not shown because too many files have changed in this diff Show More