TIP-1000: State Creation Cost Increase
Protocol Version: T1
Status: Mainnet
Authors: Dankrad Feist @dankrad
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 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
- Storage rent: Implementing a periodic fee for holding state. This was rejected due to complexity and poor user experience.
- State expiry: Automatically removing unused state after a time period. This was rejected due to technical complexity and breaking changes to existing applications.
- 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
Specification
Gas Cost Changes
New State Element Creation
Current Behavior:- Writing a new state element (SSTORE to a zero slot) costs 20,000 gas
- Writing a new state element (SSTORE to a zero slot) costs 250,000 gas
- 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
- 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
- The charge is applied when
account.noncetransitions 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
- 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)
- 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,000gas - 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 == 0require an additional 250,000 gas - Tempo transactions with any
nonce_keyandnonce == 0require an additional 250,000 gas - Changes to EIP-7702 authorization lists:
- EIP-7702 authorisation list entries with
auth_list.nonce == 0require 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
- EIP-7702 authorisation list entries with
- 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
| Operation | Current Gas Cost | Proposed Gas Cost | Change |
|---|---|---|---|
| New state element (SSTORE zero → non-zero) | 20,000 | 250,000 | +230,000 |
| Account creation (first nonce write) | 0 | 250,000 | +250,000 |
| Contract creation (per byte) | 200 | 1,000 | +800 |
| Contract creation (keccak + codesize fields) | Included in base | 500,000 | +500,000 |
| Existing state element (SSTORE non-zero → non-zero) | 5,000 | 5,000 | No 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)
- Gas cost: 250,000 gas
- Dollar cost: 250,000 / 500,000 = 0.5 cents (5,000 microdollars) per state element
- Gas cost: 250,000 gas
- Dollar cost: 250,000 / 500,000 = 0.5 cents (5,000 microdollars) per account
- 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
- 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
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
- 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
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
- 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
Transfer to Existing Address
Current Cost:- TIP-20 transfer (base + operation + state update): 50,000 gas
- Total: 50,000 gas ≈ 0.1 cents
- TIP-20 transfer (base + operation + state update): 50,000 gas
- Total: 50,000 gas ≈ 0.1 cents
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
- 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
Invariants
The following invariants must always hold:- 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).
- 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.
- 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.
- 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.
- 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.
-
Contract Creation Cost Invariant: Contract creation (CREATE/CREATE2) MUST charge exactly
(code_size × 1,000) + 500,000gas 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. - Economic Deterrent Invariant: The cost to create 1 TB of state MUST be at least 500 million, based on the assumed gas price of 1 cent per 500,000 gas.