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” .
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:
non-myopic member rewardformula 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).
non-myopic member rewardformula is wrongly implemented, where it does not set the
non-myopic member rewardto
non-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 . This means it is less than the pool
cost (340) and the
non-myopic member reward should be at that point set to
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 ->
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.
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:
non-myopic member rewards formula 
general rewards formula