|
| 1 | +--- |
| 2 | +title: Slashing prevention and recovery |
| 3 | +description: Learn how Dusk soft slashing affects provisioners and what to check after a slashing event. |
| 4 | +--- |
| 5 | + |
| 6 | +Dusk uses **soft slashing** to discourage repeated faults and long downtime. Stake is not burned, but a provisioner can lose eligibility or effective participation, which reduces rewards. |
| 7 | + |
| 8 | +Soft slashing can happen when a provisioner repeatedly fails to participate correctly in consensus. Common operational causes include: |
| 9 | + |
| 10 | +- Running an outdated or incompatible node version. |
| 11 | +- Being offline for too long. |
| 12 | +- Falling behind the network tip. |
| 13 | +- Network or firewall problems that prevent consensus messages from being sent or received. |
| 14 | +- Consensus key or node configuration issues. |
| 15 | + |
| 16 | +## If your provisioner was slashed |
| 17 | + |
| 18 | +Start by restoring healthy node operation. Slashing is a symptom; the first priority is to make sure the node is on the right chain, on the right version, and progressing. |
| 19 | + |
| 20 | +### 1. Check the installed version |
| 21 | + |
| 22 | +```sh |
| 23 | +ruskquery version |
| 24 | +``` |
| 25 | + |
| 26 | +If the network has a required release, upgrade to it: |
| 27 | + |
| 28 | +```sh |
| 29 | +curl --proto '=https' --tlsv1.2 -sSfL https://github.com/dusk-network/node-installer/releases/latest/download/node-installer.sh | sudo bash |
| 30 | +sudo service rusk start |
| 31 | +``` |
| 32 | + |
| 33 | +For testnet: |
| 34 | + |
| 35 | +```sh |
| 36 | +curl --proto '=https' --tlsv1.2 -sSfL https://github.com/dusk-network/node-installer/releases/latest/download/node-installer.sh | sudo bash -s -- --network testnet |
| 37 | +sudo service rusk start |
| 38 | +``` |
| 39 | + |
| 40 | +If a newly installed release is known to be problematic and the network can still run the previous version, follow [Rollback a node update](/operator/guides/rollback-node-update). |
| 41 | + |
| 42 | +### 2. Check sync status |
| 43 | + |
| 44 | +```sh |
| 45 | +ruskquery block-height |
| 46 | +``` |
| 47 | + |
| 48 | +Compare the height with the explorer. If the node is stuck or far behind, use [fast-sync](/operator/guides/fast-sync): |
| 49 | + |
| 50 | +```sh |
| 51 | +download_state |
| 52 | +sudo service rusk start |
| 53 | +``` |
| 54 | + |
| 55 | +### 3. Check service status and logs |
| 56 | + |
| 57 | +```sh |
| 58 | +service rusk status |
| 59 | +tail -n 100 /var/log/rusk.log |
| 60 | +``` |
| 61 | + |
| 62 | +Look for errors related to: |
| 63 | + |
| 64 | +- wrong network or chain mismatch |
| 65 | +- consensus key loading |
| 66 | +- peer discovery |
| 67 | +- Kadcast address or UDP connectivity |
| 68 | +- state/database errors |
| 69 | + |
| 70 | +### 4. Check staking status |
| 71 | + |
| 72 | +```sh |
| 73 | +rusk-wallet stake-info |
| 74 | +``` |
| 75 | + |
| 76 | +Confirm that the expected stake is still present and inspect the reported stake state. If the wallet cannot connect, fix node connectivity first. |
| 77 | + |
| 78 | +### 5. Monitor after recovery |
| 79 | + |
| 80 | +After the node is updated, synced, and running, keep the logs open and check the block height repeatedly: |
| 81 | + |
| 82 | +```sh |
| 83 | +tail -F /var/log/rusk.log |
| 84 | +ruskquery block-height |
| 85 | +``` |
| 86 | + |
| 87 | +The height should continue to progress. If the node falls behind again, treat it as an unresolved infrastructure or networking issue. |
| 88 | + |
| 89 | +### 6. Unstake and restake if the node is healthy |
| 90 | + |
| 91 | +If the node is on the right version, fully synced, and operating normally, unstake and restake to restore normal provisioner participation. |
| 92 | + |
| 93 | +Slashing can be caused by temporary operational issues, such as cloud provider downtime, network disruption, or downtime during a live node update. If the underlying issue is gone, restaking is the recovery step. |
| 94 | + |
| 95 | +```sh |
| 96 | +rusk-wallet unstake |
| 97 | +rusk-wallet stake --amt <amount> |
| 98 | +``` |
| 99 | + |
| 100 | +Replace `<amount>` with the amount you want to stake. The new stake must mature before it starts participating again. |
| 101 | + |
| 102 | +## Prevention checklist |
| 103 | + |
| 104 | +- Keep the node updated during announced network upgrades. |
| 105 | +- Monitor `ruskquery block-height` against the explorer. |
| 106 | +- Alert on service downtime and repeated restart loops. |
| 107 | +- Keep UDP `9000` reachable for Kadcast. |
| 108 | +- Keep consensus keys backed up and readable by the Rusk service. |
| 109 | +- Avoid running experimental or mismatched binaries on a staked provisioner. |
| 110 | +- Use [fast-sync](/operator/guides/fast-sync) when a node falls behind instead of waiting for a long resync from genesis. |
| 111 | + |
| 112 | +## Related guides |
| 113 | + |
| 114 | +- [Upgrade a node](/operator/guides/upgrade-node) |
| 115 | +- [Roll back a node update](/operator/guides/rollback-node-update) |
| 116 | +- [Fast-sync a node](/operator/guides/fast-sync) |
| 117 | +- [Troubleshooting](/operator/troubleshooting) |
0 commit comments