New Block Rewards Formula - #430
Open
fredericosteixeira wants to merge 10 commits into
Open
Conversation
fredericosteixeira
requested review from
madxor and
thomaslavaur
and
a lite review from Copilot
August 31, 2026 08:13
Contributor
There was a problem hiding this comment.
Pull request overview
This PR updates the Logos Blockchain economics specifications to redefine block rewards as uncapped block fees plus a stake-driven reserve release, and realigns downstream specs (execution market, storage market, leader rewards, cryptoeconomics overview) to the new epoch-based settlement and fee-routing model.
Changes:
- Redefines block rewards and accounting around
R_t = R^{block}_t + iota_twith epoch settlement andu128-safe integer rules. - Moves leader/Blend splitting to occur once per epoch total; routes execution priority fees outside
R^{block}and outside epoch settlement. - Updates related specifications’ wording and pseudocode to match the new routing/settlement definitions.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| docs/blockchain/raw/block-rewards.md | Core rewrite of the reward equation, controller, epoch settlement, and integer consensus rule; adds references/assets for analysis and diagrams. |
| docs/blockchain/raw/execution-market.md | Updates fee-routing narrative to split base vs priority fee destinations under the new reward model. |
| docs/blockchain/raw/bedrock-anonymous-leaders-reward.md | Updates leader pool crediting to include both epoch leader-share settlement and priority fees. |
| docs/blockchain/raw/storage-markets.md | Aligns storage-fee routing terminology and R^{block} notation with the new Block Rewards spec. |
| docs/blockchain/raw/overview-cryptoeconomics.md | Updates overview narrative and pseudocode to accrue over the epoch and reflect new routing/splitting rules. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+24
to
+26
| | 1.0.0 | Initial revision. | 2026-08-12 | | ||
| | 1.1.0 | Changing from burning/minting to pooling/distributing/releasing, removing $S_{tge}$ | 2026-06-22 | | ||
| | 1.2.0 | Block reward redefined as $`R_t = R^{\text{block}}_t + A_t c`$. Fee cap, fee split and excess capture removed; the reserve throttle removed and replaced by a solvency clamp. | 2026-08-23 | |
| | 1.0.0 | Initial revision. | 2026-04-24 | | ||
| | 1.1.0 | Changing from burning/minting to pooling/distributing/releasing, removing $`S_{tge}`$ | 2026-08-25 | | ||
| | 1.0.0 | Initial revision. | 2026-08-12 | | ||
| | 1.1.0 | Changing from burning/minting to pooling/distributing/releasing, removing $S_{tge}$ | 2026-06-22 | |
Comment on lines
+87
to
+91
| The mechanism is specified to satisfy the following requirements. Each is discharged by a numbered result in [\[Analysis\] Block Rewards](analysis_new_block_rewards_specs.md). The requirement is normative here; the proof that the mechanism meets it is in that document. | ||
|
|
||
| For optimal functionality, block rewards should be anchored to specific observable metrics rather than arbitrary values. Block numbers simply track time passage without indicating chain state. Transaction counts per block are vulnerable to manipulation. On the other hand, tracking the number of Blend nodes or inferring total stake provide more robust information about the chain state, specially when they can be compared with targets that are considered “healthy”. | ||
| | | Requirement | Discharged by | | ||
| | --- | --- | --- | | ||
| | R1 | The token supply is fixed. The mechanism never mints. The stocks it controls are conserved under every state transition. | [Derived Property P1](analysis_new_block_rewards_specs.md#p1-conservation) | |
| | R4 | The block reward is a continuous function of the state. No threshold produces a jump in the amount paid. | [Derived Property P6](analysis_new_block_rewards_specs.md#p6-the-reserve-pool-covers-every-released-reward) | | ||
| | R5 | Gross emission into circulation is bounded per block and per year, in every state, independently of fee revenue. | [Derived Property P3](analysis_new_block_rewards_specs.md#p3-block-reward-bounds-and-monotonicity) | | ||
| | R6 | No stock accumulates without a release rule. Any token withheld from a block reward is held in an account the mechanism can later draw on. | [Derived Property P2](analysis_new_block_rewards_specs.md#p2-the-rewards-pool-accrues-within-an-epoch-and-discharges-at-the-boundary) | | ||
| | R7 | No participant profits from inflating the fees in a block. | [Incentive Analysis I1](analysis_new_block_rewards_specs.md#i1-inflating-fees-is-not-profitable-but-is-no-longer-bounded-in-effect). Weakened relative to revision 1.0.0; see [Open Items](#open-items). | |
|
|
||
| - When security participation is below target, a higher reserve release attracts more validators. | ||
| - As usage increases and fees are pooled, the reserve release adjusts downward and distribution from the pool rises to stabilize circulating supply. | ||
|  |
| np.maximum(STAKE_TARGET + FEE_AVG_NUMERATOR * sum_fees - total_stake, int64(0)), | ||
| A_SCALE, | ||
| ) | ||
| A full chain of $`20`$ epochs of $`L = 21600`$ blocks, $`432000`$ blocks in total, was simulated against exact rational arithmetic with $`D_t \in [0, 4 \cdot 10^9]`$ LGO and $`R^{\text{block}}_t \in [0, 3c]`$ drawn independently at each block. The run was repeated with the reserve initialized at $`2 \cdot 10^6`$ LGO so that the clamp binds. The differential test is `new-block-rewards/assets/reference_implementation.py`. |
| leader_rewards += get_execution_market_tips(b) # get Execution market tips | ||
| settlement += get_block_rewards(b) # accrue, do not split per block | ||
| leader_rewards += get_execution_market_tips(b) # tips, in full, no Blend share | ||
| leader_rewards += 2 * settlement // 5 # the residual, 40% |
Comment on lines
61
to
+65
| The mechanism operates on four core principles: | ||
|
|
||
| - Dynamic Base Fee: A protocol-defined base_fee for Execution Gas must be paid for a transaction to be included in a block. This fee adjusts automatically based on a smoothed average of recent network demand relative to a predefined capacity target, ensuring sustainable network load. This base_fee is the minimal threshold to be paid for the transaction to be accepted by the block builder. | ||
| - Priority Fee (Tip): To incentivize faster inclusion by block builders, users add a priority_fee on top of the base fee. This creates a simple and transparent auction for block space during periods of high demand. The proceeds of this goes to the block builder. | ||
| - Fee Splitting and Pooling: The two fee components are treated differently. The entire base_fee is routed to the rewards pool, removing it from circulation. As usage grows, more base fees are routed to the pool and removed from circulation, which creates a direct link between network activity and the circulating supply of the native token. The priority_fee is not immediately distributed to the block builder (to preserve privacy), but instead it is directed into the block builders reward stream. 40% of the rewards will be allocated to block builders and the remaining 60% to Blend nodes. Rewards are privacy-preserving via [Anonymous Leaders Reward Protocol](bedrock-anonymous-leaders-reward.md). | ||
| - Dynamic Base Fee: A protocol-defined base_fee for Execution Gas must be paid for a transaction to be included in a block. This fee adjusts automatically based on a smoothed average of recent network demand relative to a predefined capacity target, ensuring sustainable network load. This base fee is the minimal threshold to be paid for the transaction to be accepted by the block builder. | ||
| - Priority Fee (Tip): To incentivize faster inclusion by block builders, users add a priority fee on top of the base fee. This creates a simple and transparent auction for block space during periods of high demand. The proceeds go to the block builder class in full, with no Blend share, and are claimed anonymously rather than collected in the block itself. | ||
|
|
| - Built-in safeguards against manipulation through moving averages and bounded functions. | ||
|
|
||
| This specification represents a comprehensive approach to creating a robust economic foundation for the Logos Blockchain network that balances security requirements with long-term economic sustainability. | ||
| The properties this mechanism satisfies, its behaviour across the range of its state variables, the incentives it creates, its failure modes, and the trade-offs taken are derived in [\[Analysis\] Block Rewards](analysis_block_rewards_specs.md), revised to 1.1.0 alongside this document. Results proved there are referenced from this document by the labels P for derived properties, S for scenarios, I for incentive results, and F for failure modes. That document also records which results of revision 1.0.0 were replaced, reversed or withdrawn by this revision. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Reviewer Orientation
Read Motivation before the first entry. The revision replaces the block reward equation, and every other change in this PR follows from it. Row 8 is a blocking omission rather than a change to review.
u64tou128widening. Determinism across nodes depends on this section aloneleaders_rewardsnow has two inflows on the same epoch schedule. Check the unlinkability argument extended to the tipblock-rewards.mdresolve to nothing in this repositoryStatus tracker
Change log
Motivation
Revision 1.1.0 of Block Rewards paid$R_t = A_t c + (1 - A_t) \bar{R}_t$ , where $\bar{R}_t$ is a 120-block moving average of pooled fees and $c$ the per-block release cap. That form has three consequences the network cannot carry. The block reward was bounded above by $c$ at any fee level, so fee revenue above the cap was withheld in the rewards pool with no rule that ever released it. The release depended on a second key performance indicator, the annualized average pooling rate $\gamma_t$ , so fee activity displaced the security subsidy rather than adding to it. Sustaining that average required a 120-block fee window in consensus state, and a proposer influences its own contribution to that window.
The reserve throttle inherited the same defect. It scaled the release by the reserve balance, which left the mechanism releasing an ever smaller amount exactly when the security target was still unmet and the reserve was nearly spent.
This revision separates the two jobs the reward performs. Fees are recycled to the participants who produced the blocks that collected them. The reserve pays for security while the network is establishing it, sized only by how far the inferred total stake sits below target. The two components no longer interact, gross emission is bounded per block and per year at any fee level, and consensus state loses the fee window.
Proposal
Block Rewards 1.2.0 redefines the block reward as
the block's Execution base fees and Permanent Storage fees passed through in full, plus a release drawn from the genesis reserve.$A_t$ is a piecewise-linear security controller reading the inferred total stake alone. The fee-average indicator $\gamma_t$ , its responsiveness constants $\alpha_d$ and $\alpha_a$ , the look-back window $T$ and the reserve throttle are removed. A solvency clamp $\iota_t = \min \lbrace A_t c, \; B_{t-1} \rbrace$ replaces the throttle.
Payment moves from per block to per epoch. Block rewards accrue in the rewards pool over the$L = 21600$ blocks of an epoch and are transferred in full at the boundary, split once on the epoch total: 60% to Blend, the residual to leaders.
Execution priority fees are removed from the block reward entirely. They route to the leader reward accumulator, take no Blend share, and are settled to leaders alone. Execution Market, Storage Markets, Anonymous Leaders Reward and the cryptoeconomics overview are realigned to these definitions with no change to their own mechanisms.
Discussion
Properties withdrawn
Three claims of revision 1.1.0 no longer hold, and the specification states this explicitly. Reviewers who rely on any of them must revisit their assumptions.
Costs accepted
u128is now mandatory.u64is insufficient by seventeen orders of magnitude for the controller intermediate, and does not accommodate the accumulator either.Compatibility
The change is not backwards compatible at the consensus rule. Nodes implementing 1.1.0 compute a different reward for the same state, pay it on a different schedule, and maintain a fee window this revision does not define. No migration path is specified.
Details
D1. Block reward redefined as fees plus a stake-driven release
block-rewards.md, section Block Rewards.Removed, revision 1.1.0:
Added, equation (1), the design statement:
Added, equation (2), the normative rule, solvency clamped:
The constant$c = I_{max} S_{cap} \Delta_t / f$ is unchanged in value at $62500/657 \approx 95.129$ LGO, and changed in role. It is now the maximum draw on the reserve in one block, and it is never applied to fees.
The two components are additively separable, with zero cross-partial. Bounds become
The lower bound is the block's fees, not zero. The upper bound is not absolute.
The clamp is not a design parameter. It binds only in the final blocks of the reserve's life. It preserves continuity of$R_t$ in $D_t$ , in $R^{\text{block}}_t$ and in $B_{t-1}$ , since a minimum of continuous functions is continuous.
D2. Controller reduced to one indicator
Same document, section Security Controller.
Removed:
Added:
The normative form for implementation carries no division by$D_{target}$ :
Both forms are equivalent. The second is normative because$\Lambda$ is measured in tokens and compares directly against the stake shortfall.
Removed from the parametrization:$\alpha_d = 1/4$ , $\alpha_a = 1$ , $I_{min} = 0\%$ , $T = 120$ , $w_i$ , and $D_{1,target} = 10^{10}$ . Added: $\Lambda = 5 \cdot 10^8$ LGO, $L = 21600$ blocks, and $c$ as an explicit constant. $D_{0,target}$ is renamed $D_{target}$ . $S_{cap}$ , $I_{max}$ , $Y$ , $\Delta_t$ and $f$ are unchanged.
At$\delta^\ast = 1/6$ the controller saturates at or below $\theta = 25\%$ and reaches zero at $\theta = 30\%$ . The release-funded annual yield over the saturated region is
measured against the base at saturation,$D_{target} - \Lambda = 2.5 \cdot 10^9$ LGO, not against $D_{target}$ .
D3. Payout moves from per block to per epoch
Same document, sections Accounting and Supply Dynamics and Epoch settlement. New requirement R9: the obligation accrued over an epoch is discharged in full at the boundary, and the rewards pool retains no balance across epochs.
Two flows occur at every block, in any order:
At$t = T_e = e L$ the pool is emptied:
Assigning the residual rather than computing both shares with independent floor divisions is normative. Two independent floors lose up to one base unit per settlement and break conservation. Splitting on the epoch aggregate instead of per block reduces the truncation residual by a factor of$L$ .
The identity$S_t + P_t + B_t$ is invariant under these flows. Over an epoch,
D4. Integer rule restated,
u128now requiredSame document, section Float Precision for Implementation. All quantities are in base units,$1$ LGO $= 10^{d}$ base units with $d = 18$ .
Constants:
Rule:
The fee term enters exactly, with no scaling and no floor, so all approximation error is confined to the released component. The largest intermediate is
which fits$\Lambda$ or $M$ must preserve $\max \lbrace \Lambda^{\ast} M, \; M c^{\ast} \rbrace < 2^{128}$ . The rewards pool accumulator is bounded only by conservation, $P_t \le S_{cap}^{\ast} = 10^{28}$ base units.
u128with a factor of 158 of headroom and exceedsu64by seventeen orders of magnitude. Any change toReported accuracy against exact rational arithmetic over$432000$ blocks: worst deviation $2.22 \cdot 10^{-8}$ LGO per block, a relative error of $2.3 \cdot 10^{-10}$ on annual emission.
D5. Execution priority fees leave the block reward
execution-market.md1.1.3. A second aggregate is defined, and the two account for the block's total fees:The economic property is restated. Routing the base fee to the pool recycles it rather than destroying it, so usage applies no permanent downward pressure on circulating supply and none on total supply. Within an epoch the pooled amount is a float on circulation.
No change to the price mechanism, the EMA update rule, or any parameter.
D6. The leader pool is credited by two streams
bedrock-anonymous-leaders-reward.md1.1.1.leaders_rewardsis credited epoch by epoch fromThe unlinkability argument is extended to the tip: paying a tip to the proposer in its own block would tie the amount received to that block's contents and defeat the property this protocol provides. The share formula and the voucher mechanics are unchanged.
D7. Storage-market references realigned
storage-markets.md1.1.2. NotationD8. Cryptoeconomics overview realigned
overview-cryptoeconomics.md1.2.2. The KPI description is corrected: the release function takes the inferred total stake alone and does not depend on fee revenue. The pseudocode accrues over the epoch and splits once on the total:Note that$\lfloor 2 \Pi_e / 5 \rfloor$ , while D3 specifies it as the residual $\Pi_e - \Pi^{blend}_e$ . The two differ by one base unit whenever $\Pi_e \not\equiv 0 \pmod 5$ .
update_leader_rewardscomputes the leader share as an independent floor,Chores
block-rewards.mdrevision history is re-dated inconsistently.1.0.0moves from 2026-04-24 to 2026-08-12 and1.1.0from 2026-08-25 to 2026-06-22, which places 1.1.0 before 1.0.0. The new1.2.0row is dated 2026-08-23, earlier than the 2026-08-27 rows added to the three sibling specifications in the same PR.block-rewards.md1.1.0 row had lost its math delimiters,$S_{tge}$for$`S_{tge}`$. Fixed in this PR.overview-cryptoeconomics.mdhad a math span missing its closing backtick,$`e+2$for$`e+2`$, which left the rest of the sentence unrendered. Fixed in this PR.execution-market.mdintroduces a blank line between the Priority Fee and Fee Routing and Pooling bullets, which splits one list into two. The surrounding text still announces four core principles while three bullets follow, a discrepancy that predates this PR.overview-cryptoeconomics.mdcorrects the second list marker from1.to2.and still ends without a trailing newline.execution-market.mdfixes the impact-dampening typo,($1q$)forblock-rewards.mddrops its only inbound link toanalysis-block-reward-parameter-calibration.md. Nothing in the repository now links to that document. Confirm whether it is superseded, and mark it Deprecated if so.#open-itemsinblock-rewards.mdpoint at a section the document does not contain.execution-market.mdcarries 22 inline math spans andstorage-markets.md38, all written as bare$...$rather than$`...`$. They predate this PR and are left untouched here to keep the diff on-subject.Implementation
Blocking work on the specification itself comes first. The analysis document this revision depends on is not in the repository, so 39 of its cross-references currently resolve to nothing.
docs/blockchain/raw/, renamed to the repository's hyphen convention. It exists at revision 1.1.0 but only outside this repositoryanalysis-block-rewards.md, which is at 1.0.0 and analyses the superseded mechanism. Decide whether the new revision replaces that file or is added beside itanalysis_new_block_rewards_specs.mdlinks and the 1analysis_block_rewards_specs.mdlink inblock-rewards.mdto the added fileblock-rewards/assets/token-flows.pngand the.dotsource, and repoint the Figure 1 reference, which currently targets anew-block-rewards/assets/directory that does not existreference_implementation.pyunder the same assets directory and repoint the reference in the Accuracy sectionblock-rewards.mdlinks to twice, or remove both linksblock-rewards/assets/high-level-system-design.pngand its.dotsource if Figure 1 supersedes themu128. Widen anyu64reward pathAffected Specifications
leaders_rewardsblock-rewards.mdcites revision 1.1.0 of it 39 times under a filename that does not exist here. This PR cannot be verified without it