I want to start another discussion on pool rankings.
Following the delegation (https://hydra.iohk.io/build/3744897/download/1/delegation_design_spec.pdf) and rankings (https://hydra.iohk.io/build/4213276/download/1/pool-ranking.pdf) designs, there is no way to re-create the pool ranking we currently have in Daedalus.
The argument for wrongly implemented pool ranking system (i.e. not following the published design specifications) is empowered by the fact that multiple members have come to the same conclusions with independent calculations - including u/iiLap, u/Homersapiens and myself that I know of.
I believe I have pinpointed the issue with the implementation and it lies in the calculation of the non-myopic member reward
(function getNonMyopicMemberRewards ::
in the code). In the end, according to the specifications, the pool ranking uses exactly this value (non-myopic member reward
) to rank the pools in the wallet, with top pools having the highest non-myopic member reward
for a given amount of delegation, which is what is causing significant distortion to what we are expecting to see as rankings.
According to the specification, if a poolâs non-myopic member reward
is less than the pool cost, it should be set to 0
. However, this is not the case as I will exemplify, and I encourage everyone in here to confirm my (and u/iiLapâs and possibly u/HomerJâs) calculations.
This issue is well illustrated in u/iiLapâs gist (https://gist.github.com/ilap/ad088d31e542f73685a3a245b3ad6c50#cardano-pool-ranking-in-daedalus), but I will just set one example here as well:
Instead of showing all calculations for a 1PCT pool, I will jump straight to its non-myopic member reward
as that is what is finally used to rank the pools. The important thing to understand is that any 1PCT pool, based on itâs desirability (f(pledge, cost, margin)) is not in the top 150 pools by desirability, therefore, for its non-myopic member reward
calculation, the system should only use its pledge (111k ADA).
When queried, the non-myopic member reward
for a 1PCT pool should be 0.00
according to the formula posted at the end which reads âif a poolâs non-myopic member reward
is less than pool cost, it is set to 0â [1].
This means that there should be absolutely no way for that pool to be near the top, because even assuming 300% apparent performance would only get it close to having the non-myopic member reward > cost
, and that is by no means enough to get near the top rankings.
However, when the non-myopic member reward
for 1PCT#3 is queried from daedalus-wallet
, it comes back as 73.504539
(in ADA, by default it is returned in lovelaces), placing it at rank 11 in the current system state for an intended stake of 100k ADA.
I see two possible reasons for this:
- The
non-myopic member reward
formula is wrongly implemented, where the calculation for 1PCT pool (and all pools) is using itâs live stake rather than pledge for the calculation (i.e. the first order selection by desirability is not working).
- The
non-myopic member reward
formula is wrongly implemented, where it does not set thenon-myopic member reward
to0
ifnon-myopic member reward < cost
.
To confirm which of these is the case, I have calculated the non-myopic member reward
myself in both the case of using just the pledge, and the case of using live stake for the calculation, then compared it with the actual non-myopic member reward
value we get when quering the cardano-wallet
for it. Pool in question is 1PCT#3, and the intended delegation is 100k ADA.
Firstly, considering the case of using only the pledge - 111k ADA (the way it should work), the non-myopic member reward
is 82.92054846
according to the general rewards formula posted below [2]. This means it is less than the pool cost
(340) and the non-myopic member reward
should be at that point set to 0
.
Secondly, considering the case of using the live stake - 50.61M ADA (the way it should not work), the non-myopic member reward
is 37813.184
, which is higher than the pool cost
, hence the calculation continues according to the formula:
(37813.184 - cost) * (1 - 0.01) * 100000 / 50.61 * 1000000
-> 73.30261244
Now, to make the final conclusion on which path is being taken, we must consider what the system assigned for the non-myopic member reward
to 1PCT#3 - which is 73.504539
. This is a remarkably close number to the one calculated using its live stake, hence my conclusion is that option 1) is what is wrong with the system.
Daedalus rankings play if not the most important role in delegators decisions, yet this issue has been addressed in a nonchalant way.
I would like some questions answered:
- Why is there such a nonchalant approach to this matter? Is it not agreed that Daedalus rankings play a crucial role?
- Given what is presented here, can you explain the current pool ranking?
- The protocol is code. Why are there all these speculations on what apparent performance is causing - i.e. where are the tests that confirm correct behaviour?
- Why are there âopinionsâ on this matter? Some people seem to think that the only issue with the rankings is the saturation warnings being absent, while the specifications are correctly implemented. I believe most people think it is not correctly implemented, but there is only 1 right answer and it should not be difficult to prove which one it is.
Update:
my calculations for the case of 1PCT#3 being in the top150 were miscalculated. That number indeed matches that whatâs in the wallet, hence 1PCT#3 is in the top150 according to desirability, and that can only be explained by hit rate estimates.
I think the way the protocol assigns hit rates is âpunishingâ small pools that donât have a lot of blocks produced - so to compensate for the lack of data, it assigns the lower end of the estimates to those pools. That means the top pools are ranked the way they are because they produced a lot of blocks and small pools havenât. This should then improve over time as slowly block production increases the total number of blocks produced for even the small pools. This is my understanding now. Or there is an issue with the estimations.
Please raise awareness of this issue so we can get to the bottom of it. Discuss here or at:
The formulas:
non-myopic member rewards formula [1]
general rewards formula [2]