---
title: "EVM Address Format Explained: Structure &amp; Usage"
url: "https://bip39-phrase.com/format-evm-addresses/"
language: "en"
published: "2024-04-30T00:00:00+00:00"
updated: "2026-10-15T00:00:00+00:00"
---

[ Keys & Addresses ](/topics/keys-and-addresses/) Published April 30, 2024 Updated October 15, 2026 

# EVM Address Format Explained: Structure & Usage

![EVM Address Format Explained: Structure & Usage](/images/blog/format-evm-addresses-hero.webp) 

An EVM address is the public identifier of an account on Ethereum and on every network that runs the Ethereum Virtual Machine: BNB Smart Chain, Polygon, Arbitrum, Optimism, Avalanche C-Chain and others. It is always `0x` followed by 40 hexadecimal characters, for example `0x9858EfFD232B4033E47d90003D41EC34EcaEda94`. Those 40 characters encode 20 bytes, and every one of them is derived from a private key in a fixed, one-way sequence.

## From private key to address

An ordinary account (an externally owned account, EOA) is created in four steps:

1. **Private key.** 32 random bytes, written as 64 hexadecimal characters. Mathematically it is a number between 1 and n − 1, where n is the order of the secp256k1 elliptic curve. This is the only secret in the chain.
2. **Public key.** The private key is multiplied by the curve’s generator point G. The result is a point with two 32-byte coordinates, x and y: 64 bytes, or 65 bytes when written with the `04` prefix that marks an uncompressed key.
3. **Hash.** The 64 bytes of the public key (without the `04` prefix) are hashed with Keccak-256.
4. **Address.** The last 20 bytes of the 32-byte hash, prefixed with `0x`, are the address.

Each step is easy to compute forward and infeasible to reverse: the address does not reveal the public key, and the public key does not reveal the private key. Our [private key generator](/private-key-generator/) runs these steps in your browser and shows a new random key together with its checksummed Ethereum address.

### Worked example

The private key `0x0000…0001` (the number 1) is a well-known test value. Never use it: anyone can sign with it.

| Step                            | Value                                                                                                                              |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| Private key                     | 0000000000000000000000000000000000000000000000000000000000000001                                                                   |
| Public key (uncompressed)       | 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 |
| Keccak-256 of x‖y               | c0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf                                                                   |
| Address (last 20 bytes, EIP-55) | 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf                                                                                         |

## The EIP-55 checksum

Hexadecimal is case-insensitive, so `0x7e5f…` and `0x7E5F…` point to the same account. [EIP-55](https://eips.ethereum.org/EIPS/eip-55) uses the letter case to carry a checksum: the lowercase address is hashed with Keccak-256, and each letter is capitalized when the matching hex digit of that hash is 8 or higher.

Wallets reject a mixed-case address whose capitalization does not match, which catches most typos. An all-lowercase address has no checksum at all, so a mistyped character in it goes undetected. Copy addresses in their mixed-case form whenever possible.

## Private key, public key and address compared

|            | Private key          | Public key                                                    | Address                                  |
| ---------- | -------------------- | ------------------------------------------------------------- | ---------------------------------------- |
| Size       | 32 bytes             | 64 bytes (65 with 04), or 33 bytes compressed                 | 20 bytes                                 |
| Written as | 64 hex characters    | 128 hex characters; 66 when compressed (starts with 02 or 03) | 0x \+ 40 hex characters                  |
| Secret     | Yes                  | No                                                            | No                                       |
| Used for   | Signing transactions | Verifying signatures                                          | Receiving funds, identifying the account |

A 66-character hex string starting with `02` or `03` is a compressed public key, not a private key. Ethereum rarely displays public keys at all: a transaction has no sender field, so nodes recover the sender’s public key from the signature and hash it to get the address.

## One address on every EVM chain

The address does not contain a network identifier. Instead, each signed transaction includes a chain ID ([EIP-155](https://eips.ethereum.org/EIPS/eip-155)), so a signature made for one network cannot be replayed on another. For an ordinary account, the same private key controls the same address on Ethereum, Polygon, BNB Smart Chain and every other EVM network. Tokens sent to your address on a network you did not expect are still under your key; you only have to add that network to your wallet.

Smart-contract wallets are different. A multisig deployed on one chain does not automatically exist at the same address on another, so funds sent there may be unreachable.

## Contract addresses

[Smart contracts](/smart-contract-evm-what-it-is-and-how-it-works/) have addresses in the same format but no private key. A contract created with `CREATE` gets an address computed from the deployer’s address and nonce; one created with `CREATE2` gets an address computed from the deployer’s address, a salt and the hash of the contract’s creation code. Nobody can sign transactions for a contract address: only the contract’s code decides what it does.

## Addresses from a seed phrase

Wallets such as MetaMask [do not store a single private key](/seed-phrase-vs-private-key/). They derive keys from a BIP39 seed phrase along the [BIP44](/bip-44-multi-account-hierarchy-for-deterministic-wallets/) path `m/44'/60'/0'/0/i`, where `60` is Ethereum’s coin type and `i` numbers the accounts. For the public test phrase `abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about`, account 0 has the private key `1ab42cc412b618bdea3a599e3c9bae199ebf030895b039e9db1e30dafb12b727` and the address `0x9858EfFD232B4033E47d90003D41EC34EcaEda94`. You can reproduce this in the [seed phrase to private key converter](/seed-phrase-to-private-key-converter/) or read how the derivation works in [BIP39 vs BIP32 vs BIP44](/crypto-seed-standards-bip39-vs-bip32-vs-bip44/).

## Keeping the private key safe

Anyone who has the private key, or the seed phrase it was derived from, controls the address on every EVM network at once. Never paste either into a website, a chat or a cloud document, and treat the example values on this page as public: they are test keys that anyone can use. If a single key has to be kept as a file, the standard format is an [encrypted JSON keystore](/json-wallets-explained/), not plain text.

[ Back to Blog ](/blog/)
