§ Wiki · Wiki entry

Performance-based Rewards

How the Performance-based Rewards (PBR) v1 schedule scales monthly node rewards according to block-maker failure rates relative to subnet baseline.

Node providers were originally paid a flat monthly rate per machine regardless of how the node performed. Performance-based Rewards (PBR) changes that. PBR scales each node's monthly reward by a multiplier derived from the Trustworthy Node Metrics — specifically, its block-maker failure rate relative to the rest of its subnet. Healthy nodes are paid the full baseline; nodes that fall materially behind are paid less, with the penalty capped.

This entry summarises how the v1 schedule works, how unassigned nodes are handled, and how a provider can pull their own performance data using the open-source dre tool. For the rate cards themselves, see Node Provider Remuneration.

How v1 works

PBR treats the existing per-node rate as the baseline maximum — the most a node can earn in a month, before any performance adjustment. The actual monthly reward is the baseline times a performance multiplier in the range [0.2, 1.0].

The headline curve:

  • Up to 10% relative failure rate — no penalty. Multiplier is 1.0. The node is paid the full baseline.
  • Between 10% and 60% relative failure rate — linear reduction. The penalty grows from 0% at 10% to 80% at 60%.
  • Above 60% — capped. The multiplier never falls below 0.2; a node always earns at least 20% of its baseline.

Block-maker failure rate

Every node in a subnet is given equal opportunity to propose blocks. A node that is unreachable, low on CPU, low on RAM, or starved on disk I/O fails to produce blocks when its slot comes up. The NNS collects this data per node.

Node Failure Rate = Failed Blocks / (Proposed Blocks + Failed Blocks)

Subnet baseline

Subnets vary — an entire subnet can run hot during a state-sync or under heavy traffic. PBR normalises by subtracting the subnet's own baseline from each node's failure rate. The baseline is the 75th-percentile failure rate across nodes in that subnet, i.e. the rate at the edge of the slowest 25%.

Relative Performance = max(0, Node Failure Rate - Subnet Performance)

Performance multiplier

The multiplier is a piecewise function of Relative Performance:

If Relative Performance < 10%:
    Multiplier = 1.0
Else if Relative Performance >= 60%:
    Multiplier = 0.2
Else:
    Multiplier = 1.0 - ((Relative Performance - 10%) / 50%) * 80%

Worked example

A node has Relative Performance = 16.66%.

Penalty     = ((16.66% - 10%) / 50%) * 80% = 10.66%
Multiplier  = 100% - 10.66% = 89.34%

The node earns 89.34% of its baseline reward for the month.

Unassigned nodes

A node not currently assigned to a subnet has no opportunity to propose blocks, so it has no failure rate of its own. PBR pays unassigned nodes at the average performance multiplier of their provider's assigned nodes. A provider whose assigned fleet is healthy is paid in full for their unassigned nodes; a provider whose assigned fleet is degraded is paid less for both.

Pulling your own performance data

The dre command-line tool, maintained by DFINITY, surfaces PBR data per provider. It is open source and packaged for Linux and macOS: github.com/dfinity/dre/releases. Upgrade an existing install with:

dre upgrade

Current rewards

dre node-rewards ongoing

Prints the current projected monthly rewards versus baseline and identifies which of your nodes are currently underperforming.

Past rewards

dre node-rewards past-rewards YYYY-MM

Prints the daily breakdown for a past month.

CSV export

dre node-rewards --csv-detailed-output-path ./pbr-data

Generates several CSV files in the target directory:

  • rewards_summary — daily total rewards plus the IDs of any underperforming nodes that day.
  • base_rewards — daily breakdown by node type and region.
  • One file per node — daily failure rate, multiplier, and adjusted reward.

Investigating a penalty

When a node has been penalised:

  1. Pull the CSV bundle for your node provider principal.
  2. Open rewards_summary and identify the dates and nodes flagged.
  3. Open the per-node CSV for each flagged node and read off the failure rate, the subnet baseline that day, and the resulting multiplier.
  4. Cross-reference against Node Provider Troubleshooting for the likely physical causes — networking, storage, power.