FAQ
General
Which operating system is recommended?
Ubuntu 24.04 LTS is officially supported, tested and therefore recommended.
Which node should I run to participate in consensus?
The full node that is used to take part in the consensus is the provisioner node.
Can I build Rusk from source?
Yes, instructions to build Rusk from source can be found here
Which ports does Dusk use?
- 9000/udp: Required for Kadcast message dissemination.
- 8080/tcp: Optional HTTP(S) API for querying the node.
You can use ports other than 9001 and 9000, as long as inbound traffic is allowed for those ports and outbound UDP traffic is allowed for most ports.
Can public and private ports be the same?
Yes, public port and private port can be the same. More information about the meaning of those can be found here.
How to know if my node is running on the correct chain ID?
You can launch ruskquery info
to check the chain ID of your node. If you have a chain ID of 1, it indicates that your node is running on mainnet.
How many blocks are there in one epoch?
One epoch consists of 2160 blocks.
Can I run a node without staking?
Yes, you can run a node to just propagate transactions. But your node won’t be able to participate in consensus and accrue staking rewards.
Staking
What is the minimum amount of DUSK I must stake?
1000 (1 thousand) Dusk.
How long until rewards starts accruing, and how are they determined?
Staking becomes active after the 4320 block maturity period, which corresponds to approximately 12 hours. More information regarding staking rewards can be found here.
Increase your stake & compounding Rewards
Details about increasing your stake and compounding your rewards can be found here.
Security
What about maintenance & security?
Maintaining a secure and stable node is important for the proper functioning of your consensus participation. We recommend using a firewall, restricting access to unused APIs, performing regular updates, and using a static IP for uninterrupted service.
Are my keys secure on a server/vps?
The wallet stores your keys in encrypted form. In addition, the keys that the node uses in-memory to participate in consensus can be separated from other keys.
Your stake is defined by a consensus key and an owner. The owner is by default the same key, but can also be a contract or separate key. Your Public Balance is held by a key too, the same goes for the private, shielded Balance.
- If your owner key is set to a different key, no one is able to unstake, stake or withdraw using your consensus key.
- If the key you use to send funds around is set to a different key than the consensus key, no one will be able to send funds from your wallet using your consensus key.
- This is naturally the case for shielded accounts as they use different keys by default.
- For public accounts, you need to create a separate account holding your public account balance.
In summary, consensus keys can be strictly limited to signing consensus messages such as block proposal, validation, and voting. All other critical operations, such as unstaking or sending funds, can be separated into other keys.
Can I store my keys separately from the machine running the node?
The node only needs the consensus key. Use that wallet instance to export the key and copy it over to the node.
You can do that by using scp
, for example with:
scp consensus.keys duskadmin@yournodeipaddress :/opt/dusk/conf/
As there’s also a password on the file when you export, you need to set it on the server side as well (the sh /opt/dusk/bin/setup_consensus_pwd.sh step)
What if I lose access to my server or keys?
As long as you have your mnemonic phrase stored safely, you can recover everything else.
What should I do if I lose my SSH key file?
- Spin up a fresh instance and install Rusk
- Restore your wallet using the previous mnemonic.
- Export the consensus key from the restored wallet.
- Once the new node is fully synced, it will start participating in consensus. There is no need to stake again. You can then safely delete the old instance.
How To’s
How can I stake 3000 DUSK?
You can use:
rusk-wallet moonlight-stake --amt 3000
How to resume validating again after missing an upgrade?
If you didn’t upgrade your node on time and got soft slashed, you need to:
- Unstake the full amount
- Upgrade your node
- Use
download_state
to get you back to a recent block - Start the node again and wait until it’s fully synced
- Stake again
How can I recover my node if the state is corrupted?
Reload from a snapshot by running:
download_state
(and confirm the warning by typing ‘Y’). Then, restart the node with:
service rusk start
How can I run a Dusk node on Docker?
We don’t support a production-ready Docker image for Rusk. To run Rusk through Docker as ephemeral (non-persistent storage), you can use the following command:
docker run -p 9000:9000/udp -p 8080:8080/tcp dusknetwork/node
This command starts a temporary node instance without persistent storage. Data will be lost if the container stops.
How do I configure Kadcast to use a port other than 9000/udp?
Bootstrapper nodes are used during initial synchronization to help your node join the network. They operate on their own predefined Kadcast port (9000 by default).
If you configure your node to use a different port (e.g., 42069), it’s crucial to ensure that other nodes, including bootstrappers, are aware of and can adapt to this port. Otherwise, they will not route messages to your node.
With the Node Installer:
If you are using the Node Installer, it is recommended to specify Kadcast configuration updates in /opt/dusk/services/rusk.conf.user
. This file takes precedence over rusk.conf.default
and ensures your changes are retained during updates.
You can add or modify the following section:
KADCAST_PUBLIC_ADDRESS=<MY_WAN_IPv4:<NEW_PORT>KADCAST_LISTEN_ADDRESS=<MY_LOCAL_IPv4:<NEW_PORT>
It is important to note that:
- On a VPS, the
KADCAST_PUBLIC_ADDRESS
andKADCAST_LISTEN_ADDRESS
are often the same, as the public IPv4 is directly exposed to the internet. - If you are running your node from home, behind NAT, a private network, or VPN, these may differ. Ensure you configure your local IP and port accordingly, and verify that the port is forwarded correctly on your router.
/opt/dusk/services/rusk.conf.user
is the highest priority file. Changes torusk.toml
will be overridden by the defaultrusk.conf.default
configuration.
Without the Node Installer:
If you are not using the Node Installer, you will need to explicitly define the ports and IPs in the [kadcast]
section of the rusk.toml
file. Here’s an example:
[kadcast]bootstrapping_nodes = [ { address = "165.22.193.63", port = <new-port> }, { address = "167.172.175.19", port = <new-port> }]
[http]listener_addr = "0.0.0.0:8080" # Default HTTP listener address
You can override the HTTP listener port by:
- Using the
--http-listener-addr
flag (e.g.--http-listener-addr 0.0.0.0:8081
). - Modifying the
listener_addr
in the rusk.toml file as shown above. - Setting it as an environment variable (e.g.
HTTP_LISTENER_ADDR=0.0.0.0:8081
).
Configuration precedence is not applicable here, as settings are directly defined in rusk.toml
.
How to set up SSH on Digital Ocean?
To set up SSH on DO, you can follow the steps below.
- Generate an SSH key:
ssh-keygen -t rsa -b 4096
- Add the public key to Digital Ocean during droplet creation:
ssh -o "IdentitiesOnly=yes" -i myssh root@<your-droplet-ip>
- Secure your droplet by removing the default console:
sudo apt-get purge droplet-agent
How can I transfer an SSH-key to another device?
Copy the .ssh
folder and key files to the new device from ~/.ssh
(Linux).
How can I get data from testnet or mainnet nodes?
First, set up the base URLs:
Testnet: testnet.nodes.dusk.network
Mainnet: nodes.dusk.network
For example:
const WS_URL = 'https://nodes.dusk.network/on';const EVENT_SUBSCRIPTION_URL = 'https://nodes.dusk.network/on/blocks/accepted';
Then, initialize a Rusk session by sending a POST request to the session endpoint (WS_URL
). The server will return a Rusk-Session-Id
:
{ "sessionId": "abcd1234efgh5678ijkl"}
Use this session ID as an HTTP header (Rusk-Session-Id: EVENT_SUBSCRIPTION_URL
.
Finally, keep a websocket connection open using the session ID. Events will be sent to your websocket in real time.
How can I relay my internal port 8080 when using RUES?
You can relay your internal port using socat
:
socat tcp-listen:8081,reuseaddr,fork tcp:localhost:8080
This makes local port 8080 available on port 8081 and allows you to access it via external-ip:8081. To turn this into a service, you can create a /etc/systemd/system/rusk-relay.service
file with the following content:
[Unit]Description=Rusk relayAfter=rusk.serviceRequires=rusk.service
[Service]Type=simpleExecStart=socat tcp-listen:8081,reuseaddr,fork tcp:localhost:8080Restart=always
[Install]WantedBy=multi-user.target
How can I configure the mempool timeout?
The node installer sets a default value, but you can customize the mempool timeout by editing the rusk.toml configuration file.
How can I perform a liveness check on my node?
To check if your node is live and functioning properly, you can:
A) Check the block height
To see the current block height detected by the node, launch:
ruskquery block-height
Monitor it over a period of time to ensure the block height is progressing.
B) Check peer connectivity
To view the current number of connected peers, you can launch:
ruskquery peers
C) Check service status
If you’re running the node as a service, you can verify its status with:
systemctl status rusk