Skip to content

Commit 9e0d06b

Browse files
jsync-swirldsmgarbs
authored andcommitted
HIP-1313: Enable a new high volume entity creation option (hiero-ledger#1313)
Signed-off-by: Joseph S <121976561+jsync-swirlds@users.noreply.github.com> Signed-off-by: Joseph S. <121976561+jsync-swirlds@users.noreply.github.com> Signed-off-by: Michael Garber <michael.garber@hashgraph.com> Co-authored-by: Michael Garber <michael.garber@hashgraph.com>
1 parent 585a47c commit 9e0d06b

1 file changed

Lines changed: 381 additions & 0 deletions

File tree

HIP/hip-1313.md

Lines changed: 381 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,381 @@
1+
---
2+
hip: 1313
3+
title: High-Volume Entity Creation
4+
author: Richard Bair (@rbair23), Joseph Sinclair (@jsync-swirlds)
5+
type: Standards Track
6+
category: Core
7+
requested-by: Hashgraph
8+
discussions-to: https://github.com/hiero-ledger/hiero-improvement-proposals/pull/1313
9+
needs-hiero-approval: Yes
10+
needs-hedera-review: Yes
11+
status: Last Call
12+
last-call-date-time: 2025-12-30T07:00:00Z
13+
created: 2025-10-17
14+
updated: 2025-12-16
15+
requires: 1261
16+
---
17+
18+
## Abstract
19+
This proposal introduces a second set of limits on how quickly new entities,
20+
like accounts or tokens, can be created on the Hiero network. These new limits,
21+
called **high-volume throttles**, sit alongside the existing standard throttles.
22+
Users can choose to use these high-volume throttles by setting a simple flag in
23+
their transaction. When they do this, they agree to pay extra during busy times
24+
to access this additional capacity. The standard throttles remain unchanged,
25+
with their own capacity and fixed prices, ensuring regular users experience no
26+
disruptions.
27+
28+
## Motivation
29+
Networks like Hiero use limits, or throttles, to manage the flow of
30+
transactions. This prevents any single activity from overwhelming the system,
31+
protecting against overuse of storage, processing power, or network bandwidth.
32+
For instance, creating new accounts might be limited to a few per second across
33+
the entire network, while transferring tokens could allow thousands per second.
34+
35+
These throttles work well for everyday use but can slow down applications that
36+
need to create many items quickly, such as onboarding large groups of users.
37+
During peak times, these applications face delays as they wait for available
38+
slots under the standard throttles. This proposal adds a way for users to access
39+
extra capacity when needed, without affecting those using the standard throttle
40+
system.
41+
42+
## Rationale
43+
The design creates a new parallel system for handling transactions that create
44+
new items, without changing the existing throttle system.
45+
46+
### Standard Throttle System (Unchanged)
47+
Transactions without the special flag use the existing throttles and prices:
48+
- Fixed costs based on the current fee schedule.
49+
- Predictable capacity that operates independently of the high-volume system.
50+
- No need for any changes in existing applications, unless they want to take
51+
advantage of enhanced throttles.
52+
53+
### High-Volume Throttle System (New)
54+
Transactions with the flag set use a separate set of throttles with the
55+
following characteristics:
56+
- Dedicated capacity that does not overlap with the standard system.
57+
- Transactions that use the high volume throttle do not use the "normal"
58+
throttle capacity at all.
59+
- Prices that increase based on how busy this high-volume capacity is,
60+
encouraging efficient use.
61+
- Even when the high-volume capacity is idle, prices may be higher than the
62+
standard throttle system.
63+
- Prices in the high-volume system follow a clear formula set by network
64+
governance, avoiding surprises from market fluctuations or hidden rules.
65+
- This does not mean prices are static; other transactions in the network
66+
can change the price paid by increasing throttle usage.
67+
- The duration during which a high volume throttle applies is also set by
68+
network governance.
69+
- Users must actively choose this option and can set a maximum price they're
70+
willing to pay.
71+
72+
Importantly, choosing high-volume does not give transactions priority over
73+
others; all are processed in the order they arrive, maintaining fairness.
74+
75+
## User Stories
76+
- **As a developer**, I can opt to pay more during busy periods to create items
77+
at a higher rate without being blocked by standard throttles.
78+
- **As a developer**, I can set a maximum fee for high-volume transactions to
79+
control costs.
80+
- **As a developer**, I can estimate costs in advance to plan my operations
81+
effectively when not using high volume throttles.
82+
- **As a developer**, I can roughly estimate costs in advance and coordinate
83+
with my operations budget effectively when using high volume throttles.
84+
- **As a developer**, my existing applications continue working unchanged using
85+
standard throttles.
86+
- **As a developer**, my transactions are processed fairly alongside all others,
87+
regardless of the limit system used.
88+
- **As a new user**, I pay standard prices by default and only encounter higher
89+
costs if I explicitly choose the high-volume throttle system **and** during
90+
peak periods for the specific transaction I’m submitting.
91+
- **As a network operator**, high-volume capacity is protected from abuse
92+
through increasing costs, making prolonged attacks expensive.
93+
94+
## Specification
95+
96+
### Key Concepts
97+
- **Throttle**: A limit on the volume of transactions to protect network
98+
resources.
99+
- **Entity Creation**: Making new items like accounts, tokens, or files on the
100+
network.
101+
- **Utilization Percentage**: How much of the available capacity is currently in
102+
use (0% empty, 100% full).
103+
- **Pricing Curve**: A formula that determines how much extra to charge based on
104+
utilization.
105+
106+
### Transaction Changes
107+
A new optional field is added to the basic transaction structure:
108+
109+
```protobuf
110+
syntax = "proto3";
111+
message TransactionBody {
112+
// Existing fields remain unchanged...
113+
/**
114+
* If set to true, this transaction uses high-volume throttles and pricing
115+
* for entity creation. It only affects supported transaction types; otherwise,
116+
* it is ignored.
117+
*/
118+
bool high_volume = 25;
119+
}
120+
```
121+
122+
This field applies to transactions involving entity creation, such as:
123+
- `ConsensusCreateTopic`
124+
- `ContractCreate` (HAPI call)
125+
- `CryptoApproveAllowance`
126+
- `CryptoCreate`
127+
- `CryptoTransfer` (when creating new accounts)
128+
- `FileCreate`
129+
- `LambdaSStore`
130+
- `ScheduleCreate`
131+
- `TokenAirdrop`
132+
- `TokenAssociateToAccount`
133+
- `TokenCreate`
134+
- `TokenClaimAirdrop`
135+
- `TokenMint`
136+
137+
For example, a `CryptoTransfer` that creates accounts uses high-volume pricing
138+
for those creations but standard throttles for the transfers themselves.
139+
Note that EVM transactions which create entities are not included in this HIP.
140+
EVM specific behavior will be defined in a subsequent HIP for greater clarity.
141+
142+
### High-Volume Throttles Configuration
143+
High-volume throttles are defined separately in the network's throttle settings.
144+
Each has its own capacity, marked as high-volume:
145+
146+
```json
147+
{
148+
"buckets": [
149+
{
150+
"burstPeriodMs": 15000,
151+
"name": "HighVolumeCryptoThrottles",
152+
"highVolume": true,
153+
"throttleGroups": [
154+
{
155+
"milliOpsPerSec": 10500000,
156+
"operations": [
157+
"ScheduleCreate",
158+
"CryptoCreate"
159+
]
160+
}
161+
]
162+
},
163+
{
164+
"burstPeriodMs": 15000,
165+
"name": "HighVolumeTotalThrottles",
166+
"highVolume": true,
167+
"throttleGroups": [
168+
{
169+
"milliOpsPerSec": 31500000,
170+
"operations": [
171+
"ScheduleCreate",
172+
"CryptoCreate",
173+
// all entity create transactions listed here
174+
]
175+
}
176+
]
177+
}
178+
]
179+
}
180+
```
181+
Notes on this example:
182+
- The burstPeriodMs should not be too short or too long.
183+
- We have demonstrated 15s here as a reasonable value for a public network.
184+
- There are two levels of throttles. Closely related groups of transactions, or
185+
individual transactions, have a particular throttle and pricing curve. At the
186+
same time there is a maximum total entity creation rate for all transactions
187+
combined that has a separate pricing curve that generally has effect only
188+
if the total of all entity creation transactions exceeds the maximum for any
189+
one entity class.
190+
191+
### Pricing Configuration
192+
Pricing for high-volume is set in the fee definitions as a variable rate pricing
193+
structure:
194+
195+
```protobuf
196+
syntax = "proto3";
197+
198+
message ServiceFeeDefinition {
199+
// ... existing fields ...
200+
201+
/**
202+
* Variable rate pricing configuration for this fee definition.
203+
* If not specified, variable rates are not supported for this
204+
* transaction type, and the transaction will be charged the standard fee.
205+
*/
206+
VariableRateDefinition high_volume_rates = 5;
207+
}
208+
209+
/**
210+
* Defines the configuration for variable rate pricing.
211+
* If variable rate pricing is in effect, the resulting fee multiplier will be a
212+
* value between 1 (standard fee) and `max_multiplier` (cost ceiling). If a
213+
* `pricing_curve` is specified, then the multiplier will be determined by the
214+
* utilization percentage of the variable rate throttle and the pricing curve. If
215+
* no `pricing_curve` is specified, then the multiplier will be interpolated
216+
* on an _effective_ pricing curve described by a straight line
217+
* between the standard fee and `max_multiplier` * `standard_fee`.
218+
*/
219+
message VariableRateDefinition {
220+
/**
221+
* Maximum multiplier to prevent extreme pricing (cost ceiling).
222+
* Given the normal price of the transaction, the computed variable price
223+
* will not exceed `max_multiplier` * `standard_fee`. Provides predictability
224+
* for users regardless of utilization. The minimum price will be the
225+
* `standard_fee`. This value is divided by 1,000,000 and then added to the
226+
* minimum value of 1.
227+
* <p>
228+
* ##Example
229+
* A value of `2,450,300` results in an _effective_ floating point multiplier
230+
* of `3.4503`.<br/>
231+
* A value of `0` results in an _effective_ floating point
232+
* multiplier of `1.0`.
233+
*/
234+
uint32 max_multiplier = 2;
235+
236+
/**
237+
* Pricing curve configuration defining how fees scale with variable rate
238+
* capacity utilization. Given a utilization percentage (0.0 to 1.0), the
239+
* pricing curve determines the multiplier to use. If the curve returns a
240+
* multiplier greater than `max_multiplier`, then `max_multiplier`
241+
* will be used.
242+
* <p>
243+
* If the pricing_curve is not specified, then the multiplier will be linearly
244+
* interpolated between 1 and `max_multiplier`.
245+
*/
246+
PricingCurve pricing_curve = 3;
247+
}
248+
249+
/**
250+
* Defines the pricing curve used for variable rate calculations.
251+
* This can be one of several types of curves, each with its own formula for
252+
* calculating the multiplier based on the utilization percentage of the
253+
* variable rate throttle.
254+
*/
255+
message PricingCurve {
256+
oneof curve_type {
257+
PiecewiseLinearCurve piecewise_linear = 1;
258+
}
259+
}
260+
261+
/**
262+
* Contains a set of points (utilization, multiplier) that define a piecewise
263+
* linear curve for variable pricing. Each point represents a linear segment
264+
* between two utilization thresholds. The multiplier to use is interpolated
265+
* between these points based on the current utilization percentage.
266+
*
267+
* For example, given points
268+
* - (0.0, 1.0)
269+
* - (0.5, 2.0)
270+
* - (1.0, 5.0)
271+
* The multiplier for a utilization of 0.75 would be interpolated between the
272+
* second and third points, resulting in a multiplier of 3.5.
273+
*/
274+
message PiecewiseLinearCurve {
275+
/**
276+
* A list of points defining the piecewise linear curve.
277+
* Each point is a pair of (utilization_percentage, multiplier). The list
278+
* must be sorted by utilization_percentage in ascending order, and
279+
* sub-ordered by multiplier in ascending order for points with the same
280+
* utilization percentage. It is legal to have two points with the same
281+
* utilization percentage, but they must have different multipliers.
282+
* This allows the creation of stepped pricing curves.
283+
*/
284+
repeated PiecewiseLinearPoint points = 1;
285+
}
286+
287+
/**
288+
* Represents a single point in a piecewise linear curve, with a utilization
289+
* percentage and the corresponding multiplier.
290+
*/
291+
message PiecewiseLinearPoint {
292+
/**
293+
* The utilization percentage for this point, in thousandths of one percent.
294+
* This value must be between 0 and 100,000, inclusive.
295+
*/
296+
uint32 utilization_percentage = 1;
297+
298+
/**
299+
* The multiplier to apply at this utilization percentage.
300+
* This value is divided by 1,000,000 then added to 1.
301+
*/
302+
uint32 multiplier = 2;
303+
}
304+
```
305+
306+
Limits and pricing are configured independently for flexibility.
307+
308+
### Fee Calculation Steps
309+
For high-volume transactions:
310+
1. Measure current utilization of high-volume throttles.
311+
2. Compute standard fee.
312+
3. Determine multiplier from pricing curve (capped at `max_multiplier`).
313+
4. Final `fee = standard fee × multiplier` (but not exceeding user's
314+
`maxTransactionFee`).
315+
316+
## Mirror Node Changes
317+
1. Add high volume fields to relevant APIs (e.g. `/api/v1/transactions`,
318+
`/api/v1/transactions/{id}` and the list of transactions
319+
within `/api/v1/accounts/{id}`)
320+
2. Incorporate high volume as an estimation option in fee estimation.
321+
322+
## Backwards Compatibility
323+
No changes for transactions without the `high_volume` flag. Existing
324+
applications work as before.
325+
326+
## Security Implications
327+
High-volume does not alter transaction order or bypass total network limits on
328+
storage. Increasing prices deter abuse, as sustaining high utilization becomes
329+
costly.
330+
331+
## How to Teach This
332+
333+
### For Developers
334+
Use high-volume like this (Java SDK example):
335+
336+
```java
337+
AccountCreateTransaction tx = new AccountCreateTransaction()
338+
.setKey(publicKey)
339+
.setInitialBalance(Hbar.from(10))
340+
.setHighVolume(true) // Opt in
341+
.setMaxTransactionFee(Hbar.from(5)); // Set cost limit
342+
```
343+
344+
Always check current rates:
345+
346+
```java
347+
// Query the Mirror Node for a fee estimate
348+
HighVolumeRateInfo info = client.getHighVolumeRate(HieroFunctionality.CRYPTO_CREATE);
349+
if (info.getCurrentHighVolumeFee().compareTo(Hbar.from(3)) <= 0) {
350+
// Use high-volume
351+
} else {
352+
// Fall back to standard
353+
}
354+
```
355+
356+
Use high-volume for bursts or time-sensitive tasks; stick to standard for
357+
routine work.
358+
359+
### For SDK Maintainers
360+
Add methods for setting `high_volume`. Enforce fee limits and provide helpers
361+
for estimation.
362+
Add methods to query and estimate costs for transactions using the `high_volume`
363+
setting.
364+
365+
### For Users
366+
High-volume throttles open a new avenue to unblock use cases that require entity
367+
creation during peak times while maintaining fair ordering. Always set price
368+
limits when using high-volume throttles.
369+
370+
### For Operators
371+
Allocate capacity, set pricing curves, and monitor usage to balance
372+
accessibility and protection.
373+
374+
## References
375+
- [HIP-1261 Simple Fees](https://hips.hedera.com/hip/hip-1261)
376+
377+
## Copyright/license
378+
This document is licensed under the Apache License, Version 2.0 — see LICENSE
379+
or https://www.apache.org/licenses/LICENSE-2.0.
380+
381+

0 commit comments

Comments
 (0)