Documentation

Emissions for Validators

How are emissions calculated for Validators?


Dividends are the value used to determine how emissions are divided amongst the Validators. Maximizing emission means higher returns for the validator and for all delegators of tao to the validator. Validator incentive comes from VTrust, Stake. These are converted by Yuma Consensus into Dividends.


VTrust

  1. Validators test miners and create a weighted list of scores. These are submitted to the Yuma consensus.
  2. These scores are compared to the other validators - and each validator is judged to be in consensus with the rest of the validators.

If a Validator is judged to be out of consensus, their VTrust (validator trust) will decrease. VTrust is a value between 0 and 1, where 0 is terrible, and 1 is perfect.

Stake

The other value in the determination of validator emissions is the stake value. Validators with higher stake will receive higher emissions.

Dividends

Dividends are the percentage of the total validator emissions that will be given to each validator. It is calculated from Vtrust and Stake. High stake & high Vtrust lead to high dividends. High dividends yield high emissions.


Delegates

One common misconception is that all of the Validator dividends is awarded to the Validators. However, most of the emission is awarded to delegates of stakeholders.

The validator can determine the percentage that they "Take" using the take function. It can be a percentage from 0-18%. The remaining 82-100% is divided to the stakehodlers based on the amount they have staked.

Child Hotkeys also can also play a role in emission for validators, but at the time of writing, no parent hotkey added to a child hotkey has added a take.

Example Math

Let's use the Bittensor Python library to extract data from Subnet 13. We'll extract Stake (subnet.S), Dividend (subnet.D), Emissions (subnet.E) and Vtrust (subnet.Tv). We'll loop through all of the neurons of the subnet, and ID validators as those with over 1000 stake. We'll create arrays of all the data, determine the total amount of stake, and then create a % stake array.

import bittensor as bt

sub = bt.subtensor( network = 'finney' )



subnet_number = 13
min_stake = 1000

#get subnet details
subnet = bt.metagraph( netuid = subnet_number, lite = False)
subnet_stake = subnet.S
subnet_dividend = subnet.D
subnet_emission = subnet.E
subnet_vtrust = subnet.Tv
# Initialize lists to hold the data for plotting
uids = []
stakes = []
percentstakes = []
vTrusts = []
dividends = []
emissions = []

div_stake_diff =[]


val_counter =0
total_stake = 0
#get validators by looping through stake
#grab those with over min_stake stake
for neuron in subnet.stake:
    stake = neuron.item()
    if stake > min_stake:
        #validator!
        uid = val_counter
        vtrust = subnet_vtrust[val_counter].item()
        dividend = subnet_dividend[val_counter].item()
        emission = subnet_emission[val_counter].item()
        uids.append(uid)
        stakes.append(stake)
        vTrusts.append(vtrust)
        dividends.append(dividend)
        emissions.append(emission)
    val_counter +=1
    total_stake += stake

counter =0
for stake in stakes:
    percentstakes.append( stake/total_stake)
    div_stake_diff.append(stake/total_stake- dividends[counter])
    counter +=1
    

We can build charts of the data:


import matplotlib.pyplot as plt

# Plot each item against the UID
plt.figure(figsize=(10, 8))

# Plot 'percent stake & dividends' vs 'uid'
plt.subplot(2, 2, 1)
plt.plot(uids, percentstakes, marker='o',color="blue")
plt.plot(uids, dividends, marker='o', color='red')

plt.title('%Stake & dividend vs UID')
plt.xlabel('UID')
plt.ylabel('Stake')

# Plot 'vTrust' vs 'uid'
plt.subplot(2, 2, 2)
plt.plot(uids, vTrusts, marker='o', color='green')
plt.title('vTrust vs UID')
plt.xlabel('UID')
plt.ylabel('vTrust')

# Plot 'dividend stake diff' vs 'uid'
plt.subplot(2, 2, 3)
plt.plot(uids, div_stake_diff, marker='o', color='red')
plt.title('Dividend/stake diff vs UID')
plt.xlabel('UID')
plt.ylabel('Dividend')

# Plot 'emission' vs 'uid'
plt.subplot(2, 2, 4)
plt.plot(uids, emissions, marker='o', color='purple')
plt.title('Emission vs UID')
plt.xlabel('UID')
plt.ylabel('Emission')

# Adjust layout to prevent overlap
plt.tight_layout()

# Show the plot
plt.show()

Vtrust chart

Most of the validators are over 80% Vtrust. But, there is clearly one validator with low vTrust (under 50%!). How does this affect their Dividends?


Dividends Vs. Stake

The blue line is stake, red is dividends

With a high VTrust, the percentage stake that the validator has is a VERY GOOD indicator for the amount of dividends that they will receive. Our validator with low VTrust is losing out on a significant amount of Dividends. If we chart the difference between the red and blue lines, we see the following:


Let's examine this in the Taostats metagraph:

Comparing rows 8&9 (very similar stake, but 50% difference in Vtrust) - the Dividends are also 50% different.

Comparing rows 9 &11 (twice as much stake, half the Vtrust - the Dividends are nearly identical.