Skip to main content

TIP-1000: State Creation Cost Increase

Protocol Version: T1
Status: Mainnet
Authors: Dankrad Feist @dankrad

Abstract

This TIP increases the gas cost for creating new state elements, accounts, and contract code to provide economic protection against state growth spam attacks. The proposal increases the cost of writing a new state element from 20,000 gas to 250,000 gas, introduces a 250,000 gas charge for account creation (when the account’s nonce is first written), and implements a new contract creation cost model: 1,000 gas per byte of contract code plus 500,000 gas for keccak hash and codesize fields.

Motivation

Tempo’s high throughput capability (approximately 20,000 transactions per second) creates a vulnerability where an adversary could create a massive amount of state with the intent of permanently slowing the chain down. If each transaction is used to create a new account, and each account requires approximately 200 bytes of storage, then over 120 TB of storage could be created in a single year. Even if this storage is technically feasible, the database performance implications are unknown and would likely require significant R&D on state management much earlier than needed for business requirements. The current EVM gas schedule charges 20,000 gas for writing a new state element and has no cost for creating an account. This makes state creation attacks economically viable for adversaries. By increasing these costs to 250,000 gas each, we create a meaningful economic barrier: creating 1 TB of state would cost approximately 50million,andcreating10TBwouldcostapproximately50 million, and creating 10 TB would cost approximately 500 million (based on the assumption that a TIP-20 transfer costs 50,000 gas = 0.1 cent, implying 1 cent per 500,000 gas).

Alternatives Considered

  1. Storage rent: Implementing a periodic fee for holding state. This was rejected due to complexity and poor user experience.
  2. State expiry: Automatically removing unused state after a time period. This was rejected due to technical complexity and breaking changes to existing applications.
  3. Lower cost increases: Using smaller multipliers (e.g., 50,000 gas instead of 250,000 gas). This was rejected as it would not provide sufficient economic deterrent against well-funded attackers.

Terminology

This TIP uses the following economic unit terminology:
  • Microdollars: TIP-20 token units at 10^-6 USD precision (6 decimals). One TIP-20 token unit = 1 microdollar = 0.000001 USD = 0.0001 cents.
  • Attodollars: Gas accounting units at 10^-18 USD precision. Gas prices (basefee) are denominated in attodollars.
  • Conversion: Gas cost in microdollars = (gas × basefee in attodollars) / 10^12
These units provide precise economic accounting while maintaining human-readable dollar relationships.

Specification

Gas Cost Changes

New State Element Creation

Current Behavior:
  • Writing a new state element (SSTORE to a zero slot) costs 20,000 gas
Proposed Behavior:
  • Writing a new state element (SSTORE to a zero slot) costs 250,000 gas
This applies to all storage slot writes that transition from zero to non-zero, including:
  • Contract storage slots
  • TIP-20 token balances
  • Nonce key storage in the Nonce precompile (when a new nonce key is first used)
  • Rewards-related storage (userRewardInfo mappings, reward balances)
  • Active key count tracking in the Nonce precompile
  • Any other state elements stored in the EVM state trie
Since Tempo-specific operations (nonce keys, rewards processing, etc.) ultimately use EVM storage operations (SSTORE), they are automatically subject to the new state creation pricing. The implementation must ensure all new state element creation is correctly charged at 250,000 gas, regardless of which precompile or contract creates the state.

Account Creation

Current Behavior:
  • Account creation has no explicit gas cost
  • The account is created implicitly when its nonce is first written
Proposed Behavior:
  • Account creation incurs a 250,000 gas charge when the account’s nonce is first written
  • This charge applies when the account is first used (e.g., sends its first transaction), not when it first receives tokens
Implementation Details:
  • The charge is applied when account.nonce transitions from 0 to 1
  • The charge also applies to other nonces with nonce keys (2D nonces)
  • Transactions with a nonce value of 0 need to supply at least 271,000 gas and are otherwise invalid
  • For EOA accounts: charged on the first transaction sent from that address (when the account is first used)
  • For contract accounts: charged when the contract is deployed (CREATE or CREATE2)
  • Important: When tokens are transferred TO a new address, the recipient’s nonce remains 0, so no account creation cost is charged. The account creation cost only applies when the account is first used (sends a transaction).
  • The charge is in addition to any other gas costs for the transaction

Contract Creation

Current Behavior:
  • Contract creation (CREATE/CREATE2) has a base cost of 32,000 gas plus 200 gas per byte of contract code
  • Total cost formula: 32,000 + (code_size × 200) gas
  • Example: A 1,000 byte contract costs 32,000 + (1,000 × 200) = 232,000 gas
Proposed Behavior:
  • Contract creation replaces the existing EVM per-byte cost with a new pricing model:
    • Each byte: 1,000 gas per byte (linear pricing)
    • TX create cost: 2 × 250,000 gas = 500,000 gas for keccak hash and nonce fields
  • This pricing applies to the contract code size (the bytecode being deployed)
Implementation Details:
  • The code storage cost is calculated as: code_size × 1,000
  • Additional state creation costs: 2 × 250,000 gas = 500,000 gas for keccak hash and codesize fields
  • Total contract creation cost: (code_size × 1,000) + 500,000 gas
  • This replaces the existing EVM per-byte cost for contract creation (not an additional charge)
  • Applies to both CREATE and CREATE2 operations
  • The account creation cost (250,000 gas) is separate and still applies when the contract account’s nonce transitions from 0 to 1

Intrinsic Transaction Gas

A transaction is invalid if the minimal costs of a (reverting) transaction can’t be covered by caller’s balance. Those checks are done in the transaction pool as a DOS prevention measure as well as when a transaction is first executed as part of a block.
  • Transaction with nonce == 0 require an additional 250,000 gas
  • Tempo transactions with any nonce_key and nonce == 0 require an additional 250,000 gas
  • Changes to EIP-7702 authorization lists:
    • EIP-7702 authorisation list entries with auth_list.nonce == 0 require an additional 250,000 gas.
    • The base cost per authorization is reduced to 12,500 gas
    • There is no refund if the account already exists
  • The additional initial cost for CREATE transactions that deploy a contract is increased to 500,000 from currently 32,000 (to reflect the upfront cost in contract creation)
    • If the first transaction in a batch is a CREATE transaction, the additional cost of 500,000 needs to be charged

Other Changes

The transaction gas cap is changed from 16M to 30M to accommodate the deployment of 24kb contracts. Tempo transaction key authorisations can’t determine whether it is going to create new storage or not. If the transaction cannot pay for the key authorization storage costs, the transaction reverts any authorization key that has been set.

Gas Schedule Summary

OperationCurrent Gas CostProposed Gas CostChange
New state element (SSTORE zero → non-zero)20,000250,000+230,000
Account creation (first nonce write)0250,000+250,000
Contract creation (per byte)2001,000+800
Contract creation (keccak + codesize fields)Included in base500,000+500,000
Existing state element (SSTORE non-zero → non-zero)5,0005,000No change
Existing state element (SSTORE non-zero → zero)-15,000 (refund)-15,000 (refund)No change

Economic Impact Analysis

Cost Calculations

Based on the assumptions:
  • TIP-20 transfer cost (to existing address, including base transaction and state update): 50,000 gas = 0.1 cent (1,000 microdollars)
  • Implied gas price: 1 cent per 500,000 gas (10,000 microdollars per 500,000 gas)
New State Element Creation:
  • Gas cost: 250,000 gas
  • Dollar cost: 250,000 / 500,000 = 0.5 cents (5,000 microdollars) per state element
Account Creation:
  • Gas cost: 250,000 gas
  • Dollar cost: 250,000 / 500,000 = 0.5 cents (5,000 microdollars) per account
Contract Creation:
  • Per byte: 1,000 gas = 0.002 cents (20 microdollars) per byte
  • Keccak + nonce fields: 500,000 gas (2 × 250,000) = 1.0 cent (10,000 microdollars)
  • Example: 1,000 byte contract = (1,000 × 1,000) + 500,000 = 1,500,000 gas = 3.0 cents (30,000 microdollars)

Attack Cost Analysis

Creating 1 TB of state:
  • 1 TB = 1,000,000,000,000 bytes
  • Assuming ~100 bytes per state element: 10,000,000,000 state elements
  • Cost: 10,000,000,000 × 0.5 cents = $50,000,000
Creating 10 TB of state:
  • 10 TB = 10,000,000,000,000 bytes
  • Assuming ~100 bytes per state element: 100,000,000,000 state elements
  • Cost: 100,000,000,000 × 0.5 cents = $500,000,000
These costs serve as a significant economic deterrent against state growth spam attacks.

Impact on Normal Operations

Transfer to New Address

Current Cost:
  • TIP-20 transfer (base + operation): 50,000 gas
  • New state element (balance): 20,000 gas
  • Total: ~70,000 gas ≈ 0.14 cents
  • Note: Account creation cost does not apply here because the recipient’s nonce remains 0
Proposed Cost:
  • TIP-20 transfer (base + operation): 50,000 gas
  • New state element (balance): 250,000 gas
  • Total: ~300,000 gas ≈ 0.6 cents
  • Note: Account creation cost does not apply here because the recipient’s nonce remains 0
Impact: A transfer to a new address increases from 0.14 cents to 0.6 cents, representing a 4.3x increase. The account creation cost (0.5 cents) will be charged separately when the recipient first uses their account.

First Use of New Account

Current Cost:
  • TIP-20 transfer (base + operation + state update): 50,000 gas
  • Account creation: 0 gas
  • Total: 50,000 gas ≈ 0.1 cents
Proposed Cost:
  • TIP-20 transfer (base + operation + state update): 50,000 gas
  • Account creation (nonce 0 → 1): 250,000 gas
  • Total: ~300,000 gas ≈ 0.6 cents
Impact: The first transaction from a new account increases from 0.1 cents to 0.6 cents, representing a 6x increase. Combined with the initial transfer cost (0.6 cents), the total onboarding cost for a new user is approximately 1.2 cents.

Transfer to Existing Address

Current Cost:
  • TIP-20 transfer (base + operation + state update): 50,000 gas
  • Total: 50,000 gas ≈ 0.1 cents
Proposed Cost:
  • TIP-20 transfer (base + operation + state update): 50,000 gas
  • Total: 50,000 gas ≈ 0.1 cents
Impact: No change for transfers to existing addresses.

Contract Deployment

Current Cost:
  • Contract code storage: 32,000 gas base + 200 gas per byte
  • Example for 1,000 byte contract: 32,000 + (1,000 × 200) = 232,000 gas ≈ 0.46 cents
Proposed Cost:
  • Account creation: 250,000 gas
  • Contract code storage: code_size × 1,000 gas
  • Keccak + nonce fields: 500,000 gas (2 × 250,000)
  • Example for 1,000 byte contract: 250,000 + (1,000 × 1,000) + 500,000 = 1,750,000 gas ≈ 3.5 cents
Impact: Contract deployment costs increase significantly, especially for larger contracts. A 100 byte contract costs (100 × 1,000) + 500,000 + 250,000 = 850,000 gas = 1.7 cents total.

Invariants

The following invariants must always hold:
  1. State Creation Cost Invariant: Any SSTORE operation that writes a non-zero value to a zero slot MUST charge exactly 250,000 gas (not 20,000 gas).
  2. Account Creation Cost Invariant: The first transaction that causes an account’s nonce to transition from 0 to 1 MUST charge exactly 250,000 gas for account creation.
  3. Existing State Invariant: SSTORE operations that modify existing non-zero state (non-zero to non-zero) MUST continue to charge 5,000 gas and MUST NOT be affected by this change.
  4. Storage Clearing Invariant: SSTORE operations that clear storage (non-zero to zero) MUST continue to provide a 15,000 gas refund and MUST NOT be affected by this change.
  5. Gas Accounting Invariant: The total gas charged for a transaction creating N new state elements and M new accounts (where M is the number of accounts whose nonce transitions from 0 to 1 in this transaction) MUST equal: base_transaction_gas + operation_gas + (N × 250,000) + (M × 250,000). Note: Transferring tokens TO a new address does not create the account (nonce remains 0), so M = 0 in that case.
  6. Contract Creation Cost Invariant: Contract creation (CREATE/CREATE2) MUST charge exactly (code_size × 1,000) + 500,000 gas for code storage, replacing the existing EVM per-byte cost. This includes: 1,000 gas per byte of contract code (linear pricing) and 500,000 gas (2 × 250,000) for keccak hash and codesize fields. The account creation cost (250,000 gas) is charged separately.
  7. Economic Deterrent Invariant: The cost to create 1 TB of state MUST be at least 50million,andthecosttocreate10TBofstateMUSTbeatleast50 million, and the cost to create 10 TB of state MUST be at least 500 million, based on the assumed gas price of 1 cent per 500,000 gas.