Ethereum On-chain Data

A review of Ethereum data structures

On-chain data in Ethereum is stored in four different mappings, each of which are encoded in a Merkle-Patricia triearrow-up-right. 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 triearrow-up-right: This is a mapping between keccak(address) and rlp(acct), where rlp denotes the RLParrow-up-right serialization and acct is the array [nonce, balance, storageRoot, codeHash] of information associated to each Ethereum account.

  • Storage triearrow-up-right: 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 triearrow-up-right: Each block also commits to the transactions in that block via a mapping between the encoded transaction index rlp(txIndex) and the serialization TransactionType . TransactionPayload or LegacyTransaction. The serialization of a transaction is specified in the EIP 2718arrow-up-right documentation.

  • Receipt triearrow-up-right: Finally, the receipts trie commits to a mapping between the encoded receipt index rlp(receiptIndex) and the serialization TransactionType . ReceiptPayload or LegacyReceipt. The serialization of a receipt is specified in the EIP 2718arrow-up-right documentation.

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.

Last updated