SIMD-0553: Resource and Inclusion Fee#553
Conversation
|
Hello cavemanloverboy! Welcome to the SIMD process. By opening this PR you are affirming that your SIMD has been thoroughly discussed and vetted in the SIMD discussion section. The SIMD PR section should only be used to submit a final technical specification for review. If your design / idea still needs discussion, please close this PR and create a new discussion here. This PR requires the following approvals before it can be merged:
Once all requirements are met, you can merge this PR by commenting |
525d62d to
9eda9a9
Compare
bw-solana
left a comment
There was a problem hiding this comment.
Left some comments.
That said, I'm a little concerned we don't have enough alignment on:
- Pre/post Alpenglow and how to deal with votes
- Using cost units as the ruler
- The 0.5 multiplier
and thus talking about bits and bytes is time wasting
|
|
||
| | Activity | Today | After | Δ | | ||
| | -------- | ----- | ----- | -- | | ||
| | Vote (w/ CB ixns) | 5000 | 2500 + 1883 | -12.3% | |
There was a problem hiding this comment.
looks like we're implicitly suggesting we take the ceiling of cost_units * resource_fee_rate, we should specify that somewhere
|
|
||
| | Component | Formula | Burn | Leader| | ||
| | ------------------ | -----------------------------------------| ---- | ------| | ||
| | Base inclusion fee | 2500 lamports × num_signatures | 0% | 100% | |
There was a problem hiding this comment.
pedantic: we should specify which signatures we're talking about here explicitly (just transaction level, or inclusive of precompiles)
| `requested_cost_units` is the transaction's pre-execution scheduler cost (same | ||
| value used for block packing and cost tracking today). |
There was a problem hiding this comment.
might be good to be explicit about what goes into this. The sum of:
- signature cost
- write-lock cost
- instruction-data cost
- program-execution cost
- loaded-account-data-size cost
|
|
||
| Note that simple votes as they exist today request 54k units! With a | ||
| `resource_fee_rate` of 0.5 would skyrocket pre-Alpenglow vote cost to nearly | ||
| 6x current values! But, votes can request appropriate loaded account data |
There was a problem hiding this comment.
this seems like a de facto MUST when it comes to default client implementation.
Should we also mention SIMD-0387 as a dependency? I believe that is the one that creates the change in how vote costs are classified.
What is the vote cost after adding CBP ixs to set max CUs/data?
There was a problem hiding this comment.
SIMD-0458 is live in mnb. The cost-model charges simple vote transaction same as normal transaction, it's compute units count is:
1,440 signatures + 600 write locks + 19 instruction data + 200,000 execution allocation + 16,384 loaded-account data (for default 64MiB) = 218,443 units
There was a problem hiding this comment.
If to use CBP ixs, client would request 1 page (32KiB) for loaded accounts, then request ~4,500CU for compute-units, which includes:
- 2,100 CU for Vote ix,
- 2*150 =300 CU for 2 CBP ixs,
- 8 for loaded accounts size (for 1 page size)
- ~2,000 for signatures, write locks and instruction data
Note, by adding CBP ixs to legacy vote transaction, it not longer qualifies as "Simple Vote" transaction. The concept of "Simple Vote" is going away, but the flag still exists and have effects on current execution path.
Client could also send vote with v1 transaction, setting compute-units and loaded-accounts-data-size without CBP.
|
|
||
| - **Resource fee rate** — lamports per requested cost unit; **0.5** at activation. | ||
|
|
||
| ## Detailed Design |
There was a problem hiding this comment.
might be good to specify exactly when the new fee model should take place. Presumably if it goes active on the transition from Epoch E -> E+1, you want the new fees in place starting with the first slot in E+1.
But this could create an awkward transition for anyone using transaction sim on the boundaries.
(I'm still fine with doing the obvious thing, just think we should spell it out)
|
|
||
| ## Summary | ||
|
|
||
| We split the present static **5000-lamport per-signature fee** (2500 burned, 2500 |
There was a problem hiding this comment.
I understand the stated "split the present static (base fee) ..." as two separate proposals:
- lower signature fee in half, reward 100% to leader
- introducing requested-cu based fee, 100% burned. This better align burn and resource usage.
They are related, but don't have to depend on each other.
There was a problem hiding this comment.
the reason why they must depend on each other is precisely because if done separately either
- vote costs are way too high (if base stays the same with new resource fee)
- dos attacks are super cheap (if base halves before new resource fee)
There was a problem hiding this comment.
thanks for clarifying, it makes sense
|
|
||
| Note that simple votes as they exist today request 54k units! With a | ||
| `resource_fee_rate` of 0.5 would skyrocket pre-Alpenglow vote cost to nearly | ||
| 6x current values! But, votes can request appropriate loaded account data |
There was a problem hiding this comment.
SIMD-0458 is live in mnb. The cost-model charges simple vote transaction same as normal transaction, it's compute units count is:
1,440 signatures + 600 write locks + 19 instruction data + 200,000 execution allocation + 16,384 loaded-account data (for default 64MiB) = 218,443 units
|
|
||
| Note that simple votes as they exist today request 54k units! With a | ||
| `resource_fee_rate` of 0.5 would skyrocket pre-Alpenglow vote cost to nearly | ||
| 6x current values! But, votes can request appropriate loaded account data |
There was a problem hiding this comment.
If to use CBP ixs, client would request 1 page (32KiB) for loaded accounts, then request ~4,500CU for compute-units, which includes:
- 2,100 CU for Vote ix,
- 2*150 =300 CU for 2 CBP ixs,
- 8 for loaded accounts size (for 1 page size)
- ~2,000 for signatures, write locks and instruction data
Note, by adding CBP ixs to legacy vote transaction, it not longer qualifies as "Simple Vote" transaction. The concept of "Simple Vote" is going away, but the flag still exists and have effects on current execution path.
Client could also send vote with v1 transaction, setting compute-units and loaded-accounts-data-size without CBP.
|
|
||
| 1. **Negligible SOL burn today.** At the current ~3000 TPS the network burns on | ||
| the order of ~648 SOL/day from signature fees alone — several orders of magnitude | ||
| below daily inflation (~60,000 SOL/day). This makes the tokenomics of SOL unsound. |
There was a problem hiding this comment.
From original discussion, where condition's opposite: tons of traffic, lots of heavy transactions; with proposed 100% burn Resource Fee (based on often over-requested compute units), would daily burns exceed inflation significantly?
There was a problem hiding this comment.
no it is bounded and does not scale with traffic in the same way that priority fee does. it will certainly increase but only by a factor of 2 or so on average is my hunch... until block limits are removed...
There was a problem hiding this comment.
block limits only applies to actual compute units. requested compute units technically are not bounded by it (but do by tx CU limit, and indirectly by number of large txs can be packed in one block), heavy/complex transactions are likely to over-requesting CUs, potentially leads to over-burning.
| otherwise game-theoretic incentives would lead leaders to drop zero-prio txns. | ||
|
|
||
| - **Resource fee** — `requested_cost_units × resource_fee_rate`, entirely | ||
| burned. |
There was a problem hiding this comment.
to clarify - in case of fee-only, tx will be charged by Base inclusion fee + Resource fee?
There was a problem hiding this comment.
and priority fee, as is the case now. right?
There was a problem hiding this comment.
right, was focusing on the base fee split part.
There was a problem hiding this comment.
but my point i guess is that fee-only behavior stays the same (user still pays their full fee).
i agree however that the simd should be updated to state this explicitly. i will do this
| - **Base inclusion fee** — static **2500 lamports** per signature to the block | ||
| leader; renamed from "base fee". Pays for inclusion, not resource consumption. | ||
| **Required** so the leader is paid even when the priority fee is zero; | ||
| otherwise game-theoretic incentives would lead leaders to drop zero-prio txns. |
There was a problem hiding this comment.
Seems number of signatures are accounted in both Base inclusion fee and Resource fee. Why can't Base inclusion fee be a simple static number, so number of signatures are not double counted?
There was a problem hiding this comment.
there's a note about this down below, ctrl+f "legacy"
There was a problem hiding this comment.
yea, was thinking setting base inclusion fee to a static value would make things a bit easier
There was a problem hiding this comment.
i agree but if you were to do that now before update cost model to make sigs more expensive, the cost per txn for multiple sigs would be very low
There was a problem hiding this comment.
so i think the move should be:
- inclusion fee * sigs (for legacy reasons) with cheaper sig-component of resource based fee
- increase sig-component of resource based fee by updating cost model
- remove *sig multiplicand on inclusion fee
| cost, and intended to move slowly (static rate at activation; dynamic tuning | ||
| may follow). | ||
|
|
||
| ## Impact |
There was a problem hiding this comment.
nit: should Impact section includes:
- changes economics for estimation cu limit, over-estimating = over paying, which may lead to large changes on existing app.
| **Wallets and SDKs.** MUST estimate | ||
| `2500 × num_signatures + requested_cost_units × resource_fee_rate` (+ priority). | ||
|
|
||
| ## Security Considerations |
There was a problem hiding this comment.
Another possible consideration: potentially makes it cheaper (as much as half) to construct dos attack
|
I'm in favor but would prefer to keep the base signature fee where it is at 5000 lamports. I think its too low already at about $0.0003 per tx. |
|
Writing this as an everyday Solana developer. I’m not sure this is the right place for this kind of discussion, so forgive me if it isn’t. I found this while reading the latest Solana Changelog post on twitter. We already have the base fee, priority fee, and, on top of that, tips such as Jito/Nozomi. Now this proposal adds a resource fee, with a fairly complicated charging scheme. While I understand the need to increase SOL burn, I think adding another fee component could be bad for DX and add more complexity. From a developer’s point of view, this would mean dealing with 3 protocol-level fee components, plus tips on top, for a total of 4 separate payment components. Usually, blockchain developers only need to think about 2 protocol-level fee components. On top of that, many people will read this as: “transactions on Solana are getting more expensive.” Even if that is not true for every transaction, I think that will still be the public perception, which could be bad optics. My main concern is day-to-day developer experience and the ease of onboarding new people into the Solana ecosystem. That said, I know I have only a fraction of your knowledge about Solana internals, but I just wanted to share my “regular” Solana developer’s point of view. |
|
I agree that keeping it as simple as possible is important. But in the same time I don´t have any better idea than the one presented by the author of this SIMD.
|
|
In principle, I agree with your arguments. We are increasing complexity, and under the current design some low-fee, zero-priority transactions would become ~32x more expensive. That is a large jump. Some kind of deflation mechanism may be needed, but I wonder whether this is the best way to achieve it. We already have a default CU limit per instruction when |
the long term plan outlined by the simd is to
so the base cost for 1-signature txns can be made higher and argued in the follow-up simd. |
some low-fee, zero-priority compute-heavy* transactions will become 32x more expensive. this introduces an incentive for those inefficient programs in question to optimize their programs, which is a healthy incentive long term imo. there might be a 32x sudden jump for some, but after optimization (for the case of pump/helium, as simple as anchor v2 migration), the jump will be lower. |
9eda9a9 to
ccab36c
Compare
|
ok me and my clanker addressed everything here pretty sure. @tao-stones @bw-solana. |
ccab36c to
660f4ee
Compare
I am certainly up for any simplification. But making some minimum priority fee mandatory would not solve the burn problem, because all priority fees are paid as reward and not burned. Vote on re-introducing again 50% priority fee burn would probably not pass if in the past super-majority voted for abandoning it. I am not sure that the understanding, that removing the burn actually reduced the profit for stakers by creating large supply/demand imbalance that pushes SOL price down long-term, has reached the majority of stakers yet ... |
in a future where there is protocol-enforced ordering (before and after MCP), resource fee vs priority fee are independent axes. i think this three-component fee is basically what we will end up at, so it introduces no complexity beyond what will eventually be introduced. This is beyond the scope here but MCP may introduce a fourth (success) fee, in fact:
under MCP, and more generally under any system with in-protocol ordering, it does not make sense for the leader to get any revenue otherwise the leader has an advantage on their own slots which is the whole thing in-protocol ordering is attempting to avoid. This would be a post-mcp discussion, but if the full prio fee burn is enough after MCP, then i think we can make a plan to remove the resouce based fee after that. But that's about 18-24 months away and this SIMD can do quite a bit of good from now until then (and also hedge against further delays). |
|
|
||
| ## Conformance | ||
|
|
||
| Implementations SHOULD verify: |
| magnitude below daily inflation (~60,000 SOL/day). This makes the tokenomics | ||
| of SOL unsound. |
There was a problem hiding this comment.
This makes the tokenomics of SOL unsound.
advocacy language doesn't belong in the SIMD
apfitzge
left a comment
There was a problem hiding this comment.
Overall very supportive of the SIMD. Compute on the network should not be free. Would like to see a couple clarifications and I feel pretty strongly that something you listed as out of scope should be brought within scope. See those comments.
I will also comment here about the general compute/cost unit contention. Cost units are the meter we have now, if we want to make a change now, they are the tool we have. IF we have a better measure in the future, I'm fully in support of moving to that, but we don't have it now.
|
|
||
| ## New Terminology | ||
|
|
||
| - **Base inclusion fee** — static **2500 lamports** per signature to the block |
There was a problem hiding this comment.
I think the idea here is that zero-prio txns shouldn't just be dropped since they do not reward the leader.
Is there a reason this base reward to leader should scale with number of signature, aside from current behavior? Why not just use an actual static inclusion like 2500 lamports per txn?
My motivation in this comment is that it gives less of a special-case to signatures in terms of economic cost. Just treat them more similarly to how we treat other compute.
Additionally, we already model the computational cost of the different signatures differently...we have pre-compiles at nearly an order of magnitude ore expensive than top-level signatures, yet the cost to user is exactly the same! I'd rather we just move to something that is more consistent, this proposal is a fantastic opportunity to do so.
There was a problem hiding this comment.
agree. Use inclusion cost to:
- Nudge things towards the 5k lamport "base fee" concept we're familiar with today w/o having to overhaul cost model.
- Incentivize leader to pack
Separately, encompass signature cost as just another dimension of overall resource cost
| 3. **Follow-up** — move to a flat base inclusion fee and remove the | ||
| per-signature multiplicand. | ||
|
|
||
| Steps 2 and 3 are out of scope here. |
There was a problem hiding this comment.
see my previous comment - I do not think this is out of scope. Let's just move straight to a consistent model of flat_fee + resource_fee + priority_fee.
| apply starting at the **first slot of epoch `E`**. All earlier slots MUST use | ||
| the pre-activation fee model. | ||
|
|
||
| Transaction simulation and fee estimation at epoch boundaries therefore depend |
There was a problem hiding this comment.
Doesn't belong in this section, but do not see it mentioned elsewhere.
IMO we should explicitly call out nonces. I do not think they should get any special treatment here, after activation they will get charged more. However, this does introduce the case where a txn signed a very long time ago costs more if executed after the activation.
I agree to keep the base fee as it is at 5000 of which 2500 is burned and 2500 goes to validators and just add a new resource-based fee. So the total fee would be
I think it is not necessary to reduce the base fee when SIMD-0296 expands the maximum transaction packet size 4x. |
9a54c22 to
090ea70
Compare
|
after chatting w/ @cavemanloverboy and @apfitzge my understanding is we'll rework to be something like the following:
We will use a multi feature gate ladder up to 0.5 multiplier (likely 0.1, 0.25, 0.5). We will be conservative in ramping up multiplier so we can give people a chance to experience increased fees and optimize programs before their costs shoot up immediately. We also don't want to drastically increase cost for cheap operations like oracle updates Part of the appeal of this approach is:
Then in future SIMD(s), we get the cost model more accurate so that the resource costs align more closely to what they're costing the cluster. I'm fine with 2.5k, 3k, 5k, or whatever as the base fee. I lean towards something like 4k lamports because it ends up fairly close to the 5k lamport min fee of today for most cheap operations and increasing operational cost of, e.g. oracle updates, feels like a silly side effect of what we're trying to do here and not the place to stall out for getting this across the line. |
keep in mind that the minimum cost model cost of a txn is 1080, so at the terminal resource fee rate of 1/2, the min txn fee is however, note that moving this fee will impact leader incentives, as the validator income from the base fee increases by 20-60% (so the priority fee market structure will change). 3000 seems to be the right choice for optimizing these two things (minimizing impact to builder incentive, keeping txn fees close to original fee for small txns). |
apfitzge
left a comment
There was a problem hiding this comment.
A few lints to fix, but I am happy with the proposal as is. Changes to cost-model can be done separately to make sure that signatures are not under-charged.
090ea70 to
d5bbee1
Compare
fixed lints (skip line length for tables with pubkeys) |
|
Thanks, bw-solana!
|
d5bbee1 to
8929738
Compare
So under this model the only thing that gets burned is the new resource fee? What is the estimated burn if it gets implemented with the suggested multipliers? |
|


Summary
(Note: Although it's reframed a bit, the design is identical to that in the originating discussion with a higher
resource_fee_rate, with the additional change of 5000->2500 to the base fee.)SIMD-0553 splits today's 5000-lamport per-signature fee (2500 burned / 2500 to the leader) into:
Goal: tie SOL burn to real resource use. Low-resource-usage txs (votes, oracle updates) can pay slightly less than today's 5000 lamport base fee if we use a
resource_fee_rateof 0.5; high-compute, zero-priority txs pay much more (see examples in the doc).Rough burn ~7.5–9k SOL/day vs ~648 SOL/day today.