Quadratic Issuance Tapering
tl;dr
- The linear tapering proposal reduces issuance to zero at a 50% staking ratio, but the yield curve arrives at zero non-tangentially resulting in an abrupt cut-off
- A quadratic deduction can eliminate this slope discontinuity: the yield curve reaches zero and is tangential to the x-axis at saturation
- Requiring the deduction to be zero at \(f=0\), equal to \(r_\text{sat}\) at \(f=f_\text{sat}\), and to match the slope of \(r(f)\) at \(f_\text{sat}\) uniquely determines the quadratic \(d(f) = (5f - 6f^2)r_\text{sat}\), leaving
BASE_REWARD_FACTORas the sole free parameter - Two multiples of
BASE_REWARD_FACTORare considered: B=128 (2×), which crosses the current yield at \(f\approx 20.7\%\), and B=256 (4×), which crosses at \(f\approx 30.3\%\), close to today’s staking ratio; yields at deployment (\(f\approx 33\%\)) are \(\approx\!0.96\%\) and \(\approx\!1.93\%\) respectively - The cost relative to linear tapering: minimising yield impact at transition requires a larger BRF increase and produces higher peak issuance (\(\approx\!1.57\%\) at \(f\approx 12.9\%\), versus \(\approx\!1.0\%\) at \(f\approx 19.8\%\) for linear)
Introduction
Previously, we considered linear tapering as a means to ensure that equilibrium yield is reached at some point below a 50% staking ratio. That proposal was aimed at the simplest possible modification to the existing issuance curve which would achieve this goal, while preserving key properties (particularly incentives for correct validator participation).
While the linear tapering proposal achieves its stated goal, it does so with an abrupt cut off at the saturation staking ratio, rather than tapering smoothly. This article will explore the minimal constraint for a smooth yield pinch-off as the staking ratio approaches the saturation level by using a quadratic rather than linear tapering deduction. As in the linear case, both multiplicative and subtractive formulations can achieve smooth pinch-off. Also as in the linear case, the subtractive formulation is found to be superior (lower peak issuance, better anti-discouragement coverage), so the subtractive formulation will be the focus of this article.
Smooth Pinch-off
The current CL yield at staking ratio \(f\) is \[r(f) = \frac{B\,E}{\sqrt{f\,S_0}}\] where \(B\) is BASE_REWARD_FACTOR, \(E\) is epochs per year, and \(S_0\) is the total ETH supply in Gwei.
In the modified (linear tapered) yield curve \(\tilde{r}_\text{lin}\) we had:
\[\tilde{r}_\text{lin}(f) = \begin{cases} r(f)-\dfrac{f}{f_\text{sat}}r_\text{sat} & f \le f_\text{sat} \\ 0 & f > f_\text{sat} \end{cases}\]
The deduction \(\frac{f}{f_\text{sat}}r_\text{sat}\) is linear in \(f\), so its slope is the constant \(\frac{r_\text{sat}}{f_\text{sat}}\). Since \(r(f)\propto f^{-1/2}\), we have \(r'(f)=-r(f)/2f\), giving
\[\tilde{r}_\text{lin}'(f) = -\frac{r(f)}{2f} - \frac{r_\text{sat}}{f_\text{sat}}\]
At saturation:
\[\tilde{r}_\text{lin}'(f_\text{sat}) = -\frac{r_\text{sat}}{2f_\text{sat}} - \frac{r_\text{sat}}{f_\text{sat}} = -\frac{3r_\text{sat}}{2f_\text{sat}} \neq 0\]
So with the linear deduction the yield curve arrives at zero with non-zero slope. For a smooth taper to zero, the deduction must also match the slope of \(r(f)\) at \(f_\text{sat}\). This additional condition forces a quadratic. We therefore consider the general quadratic deduction:
\[\tilde{r}_\text{quad}(f) = \begin{cases} r(f) - af - bf^2 & f \le f_\text{sat} \\ 0 & f > f_\text{sat} \end{cases}\]
for constants \(a\) and \(b\) to be determined by the two pinch-off conditions (\(\tilde{r}_\text{quad}(f_\text{sat})=0\) and \(\tilde{r}_\text{quad}'(f_\text{sat})=0\)). The quadratic deduction has no constant term because the deduction must be zero at \(f=0\).
The unique quadratic deduction
Smooth pinch-off imposes three conditions on the deduction \(d(f)\):
| Condition | Meaning |
|---|---|
| \(d(0) = 0\) | No deduction at zero staking |
| \(d(f_\text{sat}) = r_\text{sat}\) | Full cancellation at saturation |
| \(d'(f_\text{sat}) = r'(f_\text{sat})\) | Slopes match, so net slope is zero |
With \(f_\text{sat} = \tfrac{1}{2}\), we have \(r'(f_\text{sat}) = -r_\text{sat}/(2\times\tfrac{1}{2}) = -r_\text{sat}\). The general quadratic through the origin is \(d(f)=af+bf^2\). Applying the two remaining constraints:
\[d\!\left(\tfrac{1}{2}\right) = \tfrac{a}{2}+\tfrac{b}{4} = r_\text{sat}, \qquad d'\!\left(\tfrac{1}{2}\right) = a + b = -r_\text{sat}\]
Solving the above gives us the coefficients for the quadratic deduction \(d(f)\):
\[d(f) = (5f - 6f^2)r_\text{sat}\]
This is the unique quadratic through the origin that reaches \(r_\text{sat}\) at \(f_\text{sat}=\tfrac{1}{2}\) with matching slope. Because all three constraints are fixed, BASE_REWARD_FACTOR — which scales both \(r(f)\) and \(r_\text{sat}\) proportionally — is the only free parameter. So our modified yield curve \(\tilde{r}_\text{quad}(f)\) is given by:
\[\tilde{r}_\text{quad}(f) = r(f)-(5f-6f^2)r_\text{sat}\]
Yield Calibration
The naive quadratic taper (B=64) yields \(\approx 0.48\%\) at today’s staking ratio — well below the current \(\approx 2.63\%\). As with the linear proposal, BASE_REWARD_FACTOR is increased to compensate. We consider two alternative curves: doubling to B=128 and quadrupling to B=256. B=128 crosses the current yield at \(f\approx 20.7\%\), giving a yield at deployment of \(\approx\!0.96\%\); B=256 crosses at \(f\approx 30.3\%\), closer to today’s staking ratio, with a yield at deployment of \(\approx\!1.93\%\):
Implementation
The implementation structure is identical to the linear proposal: base_penalty_per_increment uses the unattenuated curve (preserving penalties throughout the staking ratio range) and base_reward_per_increment is the tapered net reward. The only difference is the deduction formula.
Consensus Layer Spec
Two constants are updated or added; one function is modified.
Constants
| Constant | Old value | New value | Notes |
|---|---|---|---|
BASE_REWARD_FACTOR |
uint64(64) |
uint64(128) or uint64(256) |
2× (crossover at \(f\approx 20.7\%\)) or 4× (crossover at \(f\approx 30.3\%\)) |
SATURATION_BALANCE |
— | Gwei(60_250_000 * 10**9) |
Total active balance at \(f_\text{sat}=50\%\); same as linear proposal |
Modified function
get_base_penalty_per_increment is unchanged from the linear proposal (unattenuated, using the new BRF).
get_base_reward_per_increment is modified to apply quadratic tapering:
def get_base_reward_per_increment(state: BeaconState) -> Gwei:
total_active_balance = get_total_active_balance(state)
if total_active_balance >= SATURATION_BALANCE:
return Gwei(0)
n = total_active_balance // EFFECTIVE_BALANCE_INCREMENT
n_sat = SATURATION_BALANCE // EFFECTIVE_BALANCE_INCREMENT
p_sat = Gwei(
EFFECTIVE_BALANCE_INCREMENT * BASE_REWARD_FACTOR
// integer_squareroot(SATURATION_BALANCE)
)
# deduction = p_sat * (n/n_sat) * (5 - 3*(n/n_sat)) / 2
deduction = Gwei(
p_sat * n * (5 * n_sat - 3 * n)
// (2 * n_sat * n_sat)
)
return Gwei(max(0, get_base_penalty_per_increment(state) - deduction))The intermediate product p_sat * n * (5 * n_sat - 3 * n) reaches \(\sim\!10^{19}\), requiring 128-bit arithmetic in non-Python implementations — the same concern noted for the linear deduction.