# Calldata: the bytes sent to an Ethereum contract

Calldata is the input data supplied to an Ethereum call. For a conventional ABI-encoded function call, it begins with a four-byte selector followed by encoded arguments. The bytes can request powerful actions even when the transaction transfers zero ETH. Decoding requires the correct interface and execution context.

Evidence: [Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html); [Ethereum transactions](https://ethereum.org/en/developers/docs/transactions/)

Canonical: https://degreesofsatoshi.com/encyclopedia/ethereum-calldata/
Published: 2026-10-02
Substantively modified: 2026-10-02
Independently verified by an automated reviewer: 2026-10-02T18:12:41.505Z
Data current through: 2026-10-02

AI-assisted research and drafting with a separate automated source-verification pass; no external expert or named human review is implied.

## Key facts

- **Selector:** The first four bytes of a conventional ABI function call identify a function signature. ([Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html))
- **Arguments:** Arguments follow the selector using ABI encoding rules. ([Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html))
- **Value:** The transaction’s ETH value and input data are distinct fields. ([Ethereum transactions](https://ethereum.org/en/developers/docs/transactions/))

## A zero-value transaction can still change assets

Calling approve can authorize a spender without sending ETH as transaction value. Calling a token’s transfer function expresses its recipient and amount in arguments rather than in the transaction’s ETH-value field.

A wallet summary that shows “0 ETH” therefore does not fully describe the requested action. Read the destination contract, function and arguments.

Evidence: [ERC-20 Token Standard](https://eips.ethereum.org/EIPS/eip-20); [Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html)

## An ABI is a decoding schema, not a safety certificate

Static and dynamic argument types use different encoding rules. Strings and arrays involve lengths and offsets; arbitrary bytes cannot be reliably interpreted by guessing where an address appears.

A four-byte selector can collide across different signatures. A plausible decoded label is stronger when paired with the correct verified implementation and ABI.

Evidence: [Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html)

## Input is different from contract storage

Call input supplies data for execution. A contract may use it to update persistent state, but simply placing bytes in calldata is not the same as writing a named state variable.

Transaction input included in a public chain can be inspected by others. It should not be treated as a private message to the contract.

Evidence: [Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html); [Layout of State Variables in Storage and Transient Storage](https://docs.soliditylang.org/en/v0.8.30/internals/layout_in_storage.html); [Ethereum JSON-RPC](https://ethereum.org/en/developers/docs/apis/json-rpc/)

## Questions

### Can I understand any transaction just from its selector?

No. You need the arguments, destination code and relevant state, and a selector is not globally unique. Nested calls and proxy execution can add further context.

Evidence: [Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html); [Proxy contracts](https://docs.openzeppelin.com/contracts/5.x/api/proxy)

## Claims and scope

### ethereum-calldata-quick-answer

Calldata is the input data supplied to an Ethereum call. For a conventional ABI-encoded function call, it begins with a four-byte selector followed by encoded arguments. The bytes can request powerful actions even when the transaction transfers zero ETH. Decoding requires the correct interface and execution context.

Scope: {"collection":"ethereum","dataAsOf":"2026-10-02","blockHeight":null}

### ethereum-calldata-fact-selector

Selector: The first four bytes of a conventional ABI function call identify a function signature.

Scope: {"collection":"ethereum","dataAsOf":"2026-10-02","blockHeight":null}

### ethereum-calldata-fact-arguments

Arguments: Arguments follow the selector using ABI encoding rules.

Scope: {"collection":"ethereum","dataAsOf":"2026-10-02","blockHeight":null}

### ethereum-calldata-fact-value

Value: The transaction’s ETH value and input data are distinct fields.

Scope: {"collection":"ethereum","dataAsOf":"2026-10-02","blockHeight":null}

## Sources

- [Contract ABI Specification](https://docs.soliditylang.org/en/v0.8.30/abi-spec.html) — Solidity contributors. ABI encoding, selectors, event topics and event data. Locator: Function Selector; Argument Encoding; Events; Errors; JSON. Retrieved: 2026-10-02T17:03:42.824Z.
- [Ethereum transactions](https://ethereum.org/en/developers/docs/transactions/) — ethereum.org contributors. Signed transaction fields, nonces, propagation, inclusion and transaction types. Locator: The transaction lifecycle; Typed transaction envelope. Retrieved: 2026-10-02T17:03:41.854Z.
- [ERC-20 Token Standard](https://eips.ethereum.org/EIPS/eip-20) — Ethereum Improvement Proposals. Token supply, displayed units and balance accounting. Locator: totalSupply; balanceOf; transfer; decimals; approve; allowance; transferFrom; Transfer. Retrieved: 2026-10-02T17:03:45.826Z.
- [Layout of State Variables in Storage and Transient Storage](https://docs.soliditylang.org/en/v0.8.30/internals/layout_in_storage.html) — Solidity contributors. Persistent storage slots, packing and mappings. Locator: Layout of State Variables; Mappings and Dynamic Arrays. Retrieved: 2026-10-02T17:03:42.820Z.
- [Ethereum JSON-RPC](https://ethereum.org/en/developers/docs/apis/json-rpc/) — ethereum.org contributors. RPC response fields, transaction receipts, call simulation and log filtering. Locator: eth_getTransactionByHash; eth_getTransactionReceipt; eth_call; eth_getLogs; eth_getCode; eth_estimateGas; eth_getBalance; eth_getStorageAt; eth_getTransactionCount; default block parameter. Retrieved: 2026-10-02T17:03:42.060Z.
- [Proxy contracts](https://docs.openzeppelin.com/contracts/5.x/api/proxy) — OpenZeppelin. Proxy implementation slots, delegated execution and upgrade authority. Locator: TransparentUpgradeableProxy; UUPSUpgradeable; ERC1967Proxy. Retrieved: 2026-10-02T17:03:43.024Z.

## Revision history

- 2026-10-02: First publication after primary-source research and independent automated verification.

## Cite this entry

Degrees of Satoshi editorial project. “Calldata: the bytes sent to an Ethereum contract.” Published 2026-10-02; updated 2026-10-02. https://degreesofsatoshi.com/encyclopedia/ethereum-calldata/
