Topic lesson Mon, Aug 17, 2026 · 8 min read
Accounts, Transactions, and What EIP-7702 Broke
The four fields every account has, why the nonce controls ordering, and why an EOA can now carry code.
Where this sits
- The previous lesson covered how a block gets proposed and finalized, and stopped at the block's edge. This one opens it.
- A block is an ordered list of transactions. A transaction is an instruction to change accounts. So accounts come first.
Two kinds of account, one shape
Every address on Ethereum holds the same four fields, whether a person or a contract sits behind it.
| Field | What it holds |
|---|---|
nonce | Transactions sent from this account, or contracts it has created |
balance | Wei owned. 1 ETH = 1018 wei |
codeHash | Hash of the account's EVM code |
storageRoot | Root of a Merkle Patricia trie holding the account's persistent storage |
The difference between the two account types is what those last two fields contain:
- Externally owned account (EOA) — controlled by a private key.
codeHashis the hash of the empty string, storage is empty. Can start a transaction. - Contract account — controlled by its code. Has a real
codeHashand usually real storage. Cannot start a transaction; it only ever runs because something called it.
Where addresses come from
- EOA: the last 20 bytes of the Keccak-256 hash of the public key. No registration step — every private key already has an address, funded or not.
CREATE: derived from the creator's address and its nonce. Deploy from the same account twice and the second contract lands somewhere else.CREATE2: derived from the creator's address, a chosen salt, and a hash of the creation code. Same three inputs, same address, on any chain, forever. That is what makes an address computable before anything is deployed to it.
What a transaction is
A signed instruction from an EOA. The signature is the authorisation; there is no separate login.
to— the recipient. An EOA to move ETH, a contract to run code, or empty to deploy a contract.value— wei to transfer.data— the calldata: the bytes handed to the recipient's code. For a contract call, a 4-byte function selector followed by encoded arguments.nonce— must equal the sender account's current nonce.gasLimitand fees — the ceiling on work, and the price paid for it.
The nonce does more than it looks
- Replay protection. A signed transaction is valid at exactly one nonce. Once used, resubmitting it does nothing.
- Ordering. Transactions from one account execute in nonce order, always. Nonce 6 cannot execute before nonce 5, even if it pays far more.
- Head-of-line blocking. A stuck transaction at nonce 5 stalls every later one from that account. The fix is to replace nonce 5 with a higher fee, not to send nonce 6 again.
- The chain ID is signed too, so a transaction for mainnet is invalid on other chains.
What the fee pays for
- Every unit of work costs gas. Gas is not a currency — it is a unit of work, priced in ETH at execution time.
- Since EIP-1559, a transaction pays a base fee set by the protocol from how full recent blocks were, plus a priority fee to the proposer.
- The base fee is burned. It goes to nobody, which removes the incentive for a proposer to fake congestion.
- Unused gas is refunded. An out-of-gas failure is not: the work was done, so it is paid for, and the state changes are thrown away.
EOAs can now hold code
EIP-7702 (Final) is the most recent change to this model, and it breaks the clean split above.
- A type
0x04transaction carries an authorization list of[chain_id, address, nonce, y_parity, r, s]tuples, each signed by the EOA it applies to. - For each valid authorization, the EOA's code is set to a 23-byte delegation indicator:
0xef0100 || address. The0xefprefix is a banned opcode, so the value can never be mistaken for real code. - Calls to that EOA now execute the delegate's code, in the EOA's own storage. Authorizing the zero address clears it again.
Three invariants that held for a decade no longer do. A delegated EOA's balance can fall because of a call into it, not only because it sent something. Its nonce can increment more than once inside a single transaction. And it can make several calls per transaction, so tx.origin == msg.sender is no longer a reliable test that the caller is a plain EOA. Code written before 2025 that relies on any of these is now wrong rather than merely old.
Why it matters
- "Is this address a contract?" has no stable answer. Checking for empty code was always a weak test — it is false during a constructor — and EIP-7702 makes it false for ordinary wallets too.
- Anything precomputing addresses depends on which derivation it used.
CREATE2addresses are stable across chains;CREATEaddresses depend on a nonce that any other deployment moves. - Nonce ordering shapes everything that sends transactions. Relayers, bots and batch jobs sending from one key are serialised by protocol rule; scaling that out means more keys, not more gas.
- Fee behaviour follows from the burn. The base fee is not negotiable and not payable to anyone, so bidding higher only competes for position within a block, never for inclusion in a cheaper one.
Where to go deeper
- ethereum.org on accounts — the four fields, address derivation, and the EOA/contract split in more detail.
- EIP-7702, specifically its backwards-compatibility section, which enumerates what delegation breaks.
- Any transaction on a block explorer: read its nonce, its input data, its gas used against its gas limit, and the split between burned base fee and proposer tip.
Threads left open
- What actually executes when a call reaches contract code
- Storage layout — how the storageRoot gets its contents
- ERC-4337 and how it relates to EIP-7702 delegation
The next topic lesson picks these up.