DarkFi x Monero Merge Mining using p2pool and xmrig
DISCLAIMER: This is a work in progress and not available on the current deployed testnet as of 22-May-2025.
This document provides a way to set up a Monero testnet that is able to merge-mine DarkFi using p2pool.
Build binaries from source
We can build Monero, p2pool, and xmrig from their respective source code repositories.
For Monero, we'll take the latest release tag:
$ git clone --recursive https://github.com/monero-project/monero
$ git checkout v0.18.4.0
$ make -j$(nproc)
Same for p2pool:
$ git clone --recursive https://github.com/SChernykh/p2pool
$ git checkout v4.6
$ mkdir build && cd build && cmake .. && make -j$(nproc)
And xmrig:
$ git clone --recursive https://github.com/xmrig/xmrig
$ git checkout v6.22.2
$ mkdir build && cd build && cmake .. && make -j$(nproc)
Copy the resulting binaries into a working directory where we'll be
doing the network setup. We'll need monerod
, monero-wallet-cli
,
p2pool
, and xmrig
.
Monero setup
We should first sync the Monero Testnet locally. We can simply do this
by starting up monerod
and waiting for the sync to finish:
$ ./monerod --testnet --no-igd --data-dir bitmonero --log-level 0 --hide-my-port --add-peer 125.229.105.12:28081 --add-peer 37.187.74.171:28089 --fast-block-sync=1
2025-05-22 13:04:16.492 I Synced 3601/2754128 (0%, 2750527 left)
2025-05-22 13:04:27.315 I Synced 5801/2754128 (0%, 2748327 left)
...
2025-05-22 13:04:38.705 I Synced 8101/2754128 (0%, 2746027 left)
2025-05-22 13:04:44.676 I Synced 9301/2754128 (0%, 2744827 left)
2025-05-22 13:04:47.174 I Synced 9801/2754128 (0%, 2744327 left)
After the sync is finished, we will take the node offline and continue
our work locally. So quit the monerod
node, and restart it offline
with fixed difficulty that will make our mining process faster:
$ ./monerod --testnet --no-igd --data-dir bitmonero --log-level 0 --hide-my-port --fixed-difficulty 5000 --disable-rpc-ban --offline --zmq-pub tcp://127.0.0.1:28083
Now we should also create a Monero wallet. Run monero-wallet-cli
and
follow the wizard to create a wallet:
$ ./monero-wallet-cli --testnet --trusted-daemon
Generated new wallet: 9zMUzh73iWm5pXha95quaQjW1BnL5w2kBA8np1RqNsaSKoK7nA3ZPg1VPmtpHjhDV1WHd6sVyuePPGdaWiQqyQTcN6RuQA4
View key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
**********************************************************************
Your wallet has been generated!
Now we have our Monero address 9zMUzh73iWm5pXha95quaQjW1BnL5w2kBA8np1RqNsaSKoK7nA3ZPg1VPmtpHjhDV1WHd6sVyuePPGdaWiQqyQTcN6RuQA4
that we can use with p2pool to receive mining rewards.
p2pool setup (without merge-mining)
First we'll start p2pool without merge-mining to make sure everything works in order. After we get xmrig set up, we'll restart p2pool with merge-mining enabled.
p2pool connects to monerod
's JSONRPC and ZMQ Pub ports in order to
retrieve necessary mining data. It also provides a Stratum mining
endpoint that xmrig
is able to connect to in order to receive
mining jobs and actually mine the proposed blocks.
We can start p2pool with the following command:
$ ./p2pool --host 127.0.0.1 --rpc-port 28081 --zmq-port 28083 --wallet 9zMUzh73iWm5pXha95quaQjW1BnL5w2kBA8np1RqNsaSKoK7nA3ZPg1VPmtpHjhDV1WHd6sVyuePPGdaWiQqyQTcN6RuQA4 --stratum 127.0.0.1:3333 --data-dir ./p2pool-data --no-igd
Once started, it should connect to monerod
and retrieve the latest
blockchain info. Now we can proceed with xmrig
to try and mine some
blocks.
xmrig setup
xmrig is pretty simple. Just start it with a chosen number of threads
and point it to p2pool's Stratum port. -u x+1 5000
is defined by the
--fixed-difficulty
setting we started monerod
with. -t 1
is the
number of CPU threads to use for mining. With a low difficulty, one
thread should be enough.
$ ./xmrig -u x+1 5000 -o 127.0.0.1:3333 -t 1
Now we should see blocks being mined in p2pool and submitted to our
Monero testnet. To stop mining you can ^C
xmrig anytime to quit it
or press p
to pause mining.
p2pool setup (with merge-mining)
Now that everything is in order, we can use p2pool with merge-mining enabled in order to merge mine DarkFi. For receiving mining rewards on DarkFi, we'll need a DarkFi wallet address. In this example we'll use the following:
GCP5e1aGWPTy347WzAbn4uA5yT8mzQ25GV3gpp3MBihS
We will also need darkfid
running. Make sure you enable the RPC
endpoint that will be used by p2pool in darkfid's config:
[network_config."testnet".mm_rpc]
rpc_listen = "http+tcp://127.0.0.1:8341"
Then start darkfid
as usual.
Stop p2pool if it's running, and re-run it with the merge-mining parameters appended:
$ ./p2pool --host 127.0.0.1 --rpc-port 28081 --zmq-port 28083 --wallet 9zMUzh73iWm5pXha95quaQjW1BnL5w2kBA8np1RqNsaSKoK7nA3ZPg1VPmtpHjhDV1WHd6sVyuePPGdaWiQqyQTcN6RuQA4 --stratum 127.0.0.1:3333 --data-dir ./p2pool-data --no-igd --merge-mine 127.0.0.1:8341 GCP5e1aGWPTy347WzAbn4uA5yT8mzQ25GV3gpp3MBihS
Now p2pool should communicate with both monerod
and darkfid
in
order to pick up Monero blocktemplates and inject them with DarkFi
data necessary for merge-mining verification on the DarkFi side.
Re-run xmrig and now we should be mining blocks again. Once blocks
are found, they will be submitted to both monerod
and darkfid
and
darkfid
should verify them and release block rewards to the address
provided to p2pool's merge-mine parameters.
Happy mining!