---
description: A review of Ethereum data structures
---

# Ethereum on-chain data

On-chain data in Ethereum is stored in four different mappings, each of which are encoded in a [Merkle-Patricia trie](https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/). Each **block header** contains commitments to these four tries, thereby committing to all of the current Ethereum state. The types of data this comprises are:

* **State trie**: This is a mapping between `keccak(address)` and `rlp(acct)`, where `rlp` denotes the [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) serialization and `acct` is the array `[nonce, balance, storageRoot, codeHash]` of information associated to each Ethereum account.
* **Storage trie**: Each account has a storage trie which is a mapping between `keccak(slot)` and `rlp(slotValue)` which encodes the storage of each account, which is a mapping between the `uint256` slot and `uint256` slot value.
* **Transaction trie**: Each block also commits to the transactions in that block via a mapping between the encoded transaction index `rlp(txIndex)` and the serialization `rlp(tx)`.
* **Receipt trie**: Finally, the receipts trie commits to a mapping between the encoded receipt index `rlp(receiptIndex)` and the serialization `rlp(receipt)`.

The block header of each block contains the roots `stateRoot`, `transactionsRoot`, and `receiptsRoot`, which together commit to each of these tries and thus all of the Ethereum on-chain data.
