Performance-based Rewards

From Internet Computer Wiki
Revision as of 00:21, 24 November 2025 by Alexander.ufimtsev (talk | contribs) (Added a page on Performance-based Rewards)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Introduction

The ICP network incentivizes node providers to contribute their nodes by paying them ‘node rewards’. These rewards have been static to date, regardless of node performance. Introduction of Performance-based Rewards (PBR) incentivizes Node Provider to keep their nodes healthy and prominently address any issue with the hardware or connectivity, as well as proactively communicate any problems that appear to be within the IC-OS stack.

How do Performance-based Rewards V1 Work?

PBR treats the current Node rewards as the base maximum each eligible node can achieve in a month, i.e. 100%. It is then augmented with Node Trustworthy Metrics to show how each node has performed each month. In particular, Trustworthy Metrics depend on ‘Block Maker Failure Rate’. In short, the Nodes in a subnet are given an equal number of chances to make a block to keep the subnet running. However, if a node isn’t reachable or starved of resources (CPU, RAM, Disk I/O), it won’t be able to create a block, thereby increasing the ‘Block Maker Failure Rate’. This statistic is collected regularly by the NNS, which uses it to compute the performance reduction score between 0 and 100%. As illustrated below, the reward reduction is 0 for failure rates up to 10%, then increases linearly to 80% at a failure rate of 60%, and finally stays at 80% for higher failure rates.

PBR and Unassigned Nodes.

If nodes do not belong to any subnet, they do not participate in block-making activities, making it impossible to use Trustworthy Metrics for their performance. As a result, unassigned nodes are getting rewards based on the average performance of the assigned nodes for each node provider. Each node provider will have at least one assigned node to calculate the average score.

Calculating Failure Rate

For each node in a subnet, the system calculates:

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

Subnet Performance

Multiple nodes in each subnet can fail to make blocks. To make the calculation fair and not punish everyone, each subnet calculates its overall performance using 75th Percentile. So, the subnet uses the node that is slower than 3/4 of all nodes to set its performance. For example, in a hypothetical subnet with four nodes with failure rates [0.99%, 4.76%, 16.67%, 33.33%] (sorted), the 3rd-slowest node (failure rate:16.67%) will be used as the overall subnet performance.

Relative Performance

Once Subnet Performance is computed, a relative performance metric for each node can be derived.

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

For example, the Node failure rate is 33.33%, and the subnet performance is 16.67%. So, relative node performance is therefore (33.33%- 16.67%) = 16.66%. This reduces each node's failure rate by the failure rate of the subnets it is in, making the score fairer for everyone.

Performance Multiplier

To derive a performance multiplier for the relative node performance, the following formula is used:

If Relative Performance < 10%:
    Performance Multiplier = 1.0 (No penalty)
Else If Relative Performance ≥ 60%:
    Performance Multiplier = 0.2 (Maximum penalty - 80% reduction)
Else:
    Performance Multiplier = 1.0 - ((Relative Performance - 10%) / (60% - 10%)) × 80%

If we use our example:

  • Relative performance: 16.66%
  • Since 10% ≤ 16.66% < 60%:
  • Penalty = ((16.66% - 10%) / (60% - 10%)) × 80% = 10.66%
  • Performance Multiplier = 1.0 - 10.66% = 89.34%

Therefore, the node will get 89.34% of its possible rewards for its Generation and location remuneration.

Working with Performance Data

Both commercial, free and open source tools are available for retrieving node performance data.

Command Line Tool (Open Source)

PBR support has been fully integrated into ‘dre’ tool (https://github.com/dfinity/dre). You can obtain it for Linux and MacOS by downloading it from (https://github.com/dfinity/dre/releases). In case you already have dre tool installed, you can upgrade it by running dre upgrade.

Current Rewards

To display current node rewards, run dre node-rewards ongoing. This will display a list of node provider principals, current projected rewards vs the base (100% potential), and the difference between them. It will also display a list of underperforming nodes.

Past Rewards

To display rewards for the previous month, run ‘dre node-rewards past-rewards YYYY-MM, where YYYY is a year and MM is a month you are interested in.

dre node-rewards past-rewards 2025-10

This will display a breakdown for each node provider for each day within that reward period.

Exporting data as CSV

It might be more comfortable to export the data into a spreadsheet. For that, there is --csv-detailed-output-path parameter. If specified, it will use the specified folder (you can use a dot (.) for the current folder or select another). It will create a folder with details for all nodes and all node providers.

Open the folder and find the sub-folder for your node provider principal. Within that folder, you will find a variety of CSV files:

   1. rewards_summary: One record for each day, showing:
       * The rewards_total_xdr_permyriad value of rewards earned
       * The number of nodes found in the registry
       * The first five characters of the ID of nodes that were underperforming that day, if any
   2. base_rewards: One record for each day for each type of node showing:
       * The monthly_xdr_permyriad value for that area from the rewards table
       * The daily_xdr_permyriad value (monthly / 30.4375)
       * The node reward type (if NP has more than one type registered, then there will be more than one record for each day
       * The region that is called from the rewards table
   3. base_rewards_type3: 
       * 
   4. A file for each node that was registered in the NNS that month, which records for each day:
       * The node type
       * The region it’s registered to
       * The DC
       * The subnet it was assigned to that day, if any
       * subnet_assigned_fr_percent
       * Number of blocks proposed for that subnet
       * Number of blocks failed for that subnet
       * original_fr_percent
       * relative_fr_percent
       * extrapolated_fr_percent
       * performance_multiplier_percent
       * rewards_reduction_percent = The penalty percentage applied that day
       * base_rewards_xdr_permyriad = Base rewards from the rewards table
       * adjusted_rewards_xdr_permyriad = Adjusted rewards after penalty applied
       * Node status assigned or not

Analyzing Node Penalties and Their Impact on Rewards:

  1. Download the CSV and locate the folder for your own NP principal
  2. Use the Rewards Summary file to identify which nodes had issues that month quickly
  3. Please open the file for that particular node to see which day(s) it had issues, the block failure rate for that day, and how the NNS calculated the penalty for that day. Details on the exact formulas that are used are provided in the first section of this document.