Skip to content

Commit 9a93d71

Browse files
authored
Epoch-utilization, fee, and reward computations (#299)
* Epoch-utilization, fee, and reward computations
1 parent 9cad20b commit 9a93d71

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed

Logbook.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,32 @@ Findings:
1818
- The Rust simulation uses more CPU at high IB rates than the Haskell simulation does.
1919
- The Rust simulation sometimes does not produce enough votes to certify an EB.
2020

21+
## 2025-04-16
22+
23+
### Leios IB rate for counteracting depletion of Reserves
24+
25+
The analysis [Motivating Leios: Fees and rewards](analysis/epoch-utiilization.md) estimates the transaction throughput needed to maintain current reward levels on `mainnet` in the future. It assumes that fee-related protocol parameters remain the same in the future.
26+
27+
- If Praos were fully utilized in terms of bytes and Plutus execution, it would generate approximately 446 thousand ADA per epoch.
28+
- Current rewards are approximately 8 million ADA per epoch.
29+
- The Reserve is being depleted at the rate of 12.8% per year.
30+
- In five years, the Reserve's contribution to rewards may drop by half.
31+
- The following table shows the rate of maximum-fee Praos-like blocks needed to maintain make up for the diminishing contribution of the Reserve. These correspond to the Leios input block (IB) production rate if Leios and Praos blocks were the same size and had the same fee structure.
32+
33+
| Year | IB rate [block/slot] |
34+
|-------:|----------------------|
35+
| `2025` | `0.008` |
36+
| `2026` | `0.112` |
37+
| `2027` | `0.203` |
38+
| `2028` | `0.284` |
39+
| `2029` | `0.355` |
40+
| `2030` | `0.418` |
41+
| `2031` | `0.472` |
42+
| `2032` | `0.521` |
43+
| `2033` | `0.563` |
44+
| `2034` | `0.601` |
45+
| `2035` | `0.634` |
46+
2147
## 2025-04-13
2248

2349
### Haskell simulation

analysis/epoch-utilization.md

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
# Motivating Leios: Fees and rewards
2+
3+
Given the current protocol parameters on `mainnet` and historical ada prices, even fully utilized Praos blocks do not generate sufficient fees to cover stakepool operating costs. However, higher transaction throughput on `mainnet` can generate sufficient fees to cover the cost of operating stakepool under Praos or Leios.
4+
5+
6+
## Maximum theoretical fee for a block or epoch
7+
8+
The protocol parameters for Epoch 550 are shown in the following table.
9+
10+
| Parameter | Value | Units |
11+
|----------------------|--------------:|---------------|
12+
| `max_block_size` | `90112` | byte/block |
13+
| `min_fee_a` | `44` | lovelace/byte |
14+
| `min_fee_b` | `155381` | lovelace/tx |
15+
| `max_block_ex_mem` | `62000000` | me/block |
16+
| `price_mem` | `0.0577` | lovelace/mem |
17+
| `max_block_ex_steps` | `20000000000` | ste/block |
18+
| `price_step` | `7.21e-05` | lovelace/step |
19+
20+
From historical data, we see that approximately 75 tx/block is the maximum number of transactions practically included in a full block. Each epoch has an average of 21,600 blocks.
21+
22+
Now estimate the approximate maximum fee possible for a block or epoch:
23+
24+
| Item | Computation | Fee [lovelace/block] | Fee [ADA/epoch] |
25+
|------------------|-----------------------------------|---------------------:|-----------------:|
26+
| Bytes | `max_block_size * min_fee_a` | `3 964 928` | `85 642` |
27+
| Transactions | `75 * min_fee_b` | `11 653 575` | `251 717` |
28+
| Execution memory | `max_block_ex_mem * price_mem` | `3 577 400` | `77 272` |
29+
| Execution steps | `max_block_ex_steps * price_step` | `1 442 000` | `31 147` |
30+
| *Total* | | *`20 637 903`* | *`445 778`* |
31+
32+
33+
## Current rewards and fees
34+
35+
Recent epochs distribute about eight million ada in rewards.
36+
37+
```sql
38+
select
39+
earned_epoch as "Epoch Earned"
40+
, sum(amount) / 1e6 as "Reward [ADA/epoch]"
41+
, fees / 1e6 as "Fees [ADA/Epoch]"
42+
from reward
43+
inner join ada_pots
44+
on earned_epoch = epoch_no - 1
45+
where earned_epoch between 525 and 550
46+
group by earned_epoch, epoch_no, fees
47+
order by earned_epoch desc;
48+
```
49+
50+
| Epoch Earned | Reward [ADA/epoch] | Fees [ADA/Epoch] |
51+
|-------------:|-------------------:|-----------------:|
52+
| `550` | `7 725 300` | `67 431` |
53+
| `549` | `7 728 511` | `56 324` |
54+
| `548` | `7 765 678` | `53 136` |
55+
| `547` | `7 840 690` | `54 873` |
56+
| `546` | `7 870 624` | `53 377` |
57+
| `545` | `7 726 349` | `63 417` |
58+
| `544` | `7 753 134` | `66 943` |
59+
| `543` | `7 795 722` | `99 113` |
60+
| `542` | `7 901 127` | `73 755` |
61+
| `541` | `7 871 007` | `74 074` |
62+
| `540` | `7 981 229` | `76 503` |
63+
| `539` | `7 975 418` | `67 915` |
64+
| `538` | `7 822 513` | `76 469` |
65+
| `537` | `7 980 990` | `117 841` |
66+
| `536` | `8 070 426` | `93 384` |
67+
| `535` | `7 961 201` | `102 941` |
68+
| `534` | `8 106 461` | `135 143` |
69+
| `533` | `8 022 325` | `97 834` |
70+
| `532` | `8 113 573` | `92 068` |
71+
| `531` | `8 084 133` | `107 386` |
72+
| `530` | `7 995 335` | `103 650` |
73+
| `529` | `8 052 614` | `113 830` |
74+
| `528` | `8 108 593` | `132 087` |
75+
| `527` | `8 012 455` | `158 411` |
76+
| `526` | `8 072 808` | `190 021` |
77+
| `525` | `8 119 182` | `211 458` |
78+
79+
Thus, even the fees from full blocks would only amount to six percent of current rewards. Current fees are approximately fifteen percent of the theoretical maximum.
80+
81+
82+
## Depletion of the Reserve
83+
84+
Most of the rewards currently come from the Reserve, but that Reserve is depleting at the rate of about thirteen percent per year.
85+
86+
```sql
87+
select
88+
100 * ln( 1.0
89+
* (select reserves from ada_pots where epoch_no = 350)
90+
/ (select reserves from ada_pots where epoch_no = 550)
91+
) / ((550 - 350) / (365.24 / 5)) as "Reserve depletion [%/year]" ;
92+
```
93+
94+
| Reserve depletion [%/year] |
95+
|---------------------------:|
96+
| `12.81` |
97+
98+
At this rate, the Reserve (and hence the rewards from it) will drop to half of its current amount in five years.
99+
100+
```sql
101+
select 100 * exp(- 0.128178815456265966 * 5) as "Reserve in five years [%]";
102+
```
103+
104+
| Reserve in five years [%] |
105+
|--------------------------:|
106+
| `52.68` |
107+
108+
109+
## Implications for Leios
110+
111+
Anecdotal evidence indicates that the current rewards and ada price are approximately sufficient for stakepools to be profitable. How much would the production rate of full Praos blocks have to be in order to make up the shortfall of decreasing Reserve?
112+
113+
```sql
114+
select
115+
2025 + years "Year"
116+
, (select sum(amount) / 1e6 from reward where earned_epoch = 550) -- Current rewards
117+
* (1 - exp(- 0.128178815456265966 * years)) -- Shortfall from diminishing Reserve
118+
/ 445778 -- Maximum Praos fee per epoch
119+
* 0.05 -- Praos active slot coefficient
120+
+ 0.16 * 0.05 -- Current Praos utilization
121+
as "Full-block rate required to maintain rewards [block/slot]"
122+
from generate_series(0, 10) as years;
123+
```
124+
125+
| Year | Full-block rate required to maintain rewards [block/slot] |
126+
|-------:|----------------------------------------------------------:|
127+
| `2025` | `0.008` |
128+
| `2026` | `0.112` |
129+
| `2027` | `0.203` |
130+
| `2028` | `0.284` |
131+
| `2029` | `0.355` |
132+
| `2030` | `0.418` |
133+
| `2031` | `0.472` |
134+
| `2032` | `0.521` |
135+
| `2033` | `0.563` |
136+
| `2034` | `0.601` |
137+
| `2035` | `0.634` |
138+
139+
Assuming current ada price and protocol parameters, this indicates that transaction throughput would have to increase to about one full Praos-like block every three seconds by 2029 to maintain rewards at current levels.

0 commit comments

Comments
 (0)