|
| 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