# What is the difference between Polygon zkEVM and Ethereum?

> Learn about the differences between Polygon zkEVM and Ethereum

> For the complete documentation index, see [llms.txt](/docs/llms.txt).

This document provides a comprehensive list of differences between the Ethereum and Polygon zkEVM. The list includes supported EIPs, opcodes, JSON-RPC differences and additional changes made to build the zkEVM.

## JSON RPC Method Differences

The following JSON RPC methods have differences in zkEVM as compared to EVM. The methods and their differences in zkEVM are as follows:

* [`eth_call`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/eth-call) → doesn't support state override at the moment and pending block.
* [`eth_estimateGas`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/eth-estimate-gas) → if the block number is set to `pending` it is assumed to be `latest`
* [`eth_getBalance`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/eth-get-balance) → if the block number is set to `pending` it is assumed to be `latest`
* [`eth_getCode`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/eth-get-code) → if the block number is set to `pending` it is assumed to be `latest`
* [`eth_getStorageAt`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/eth-get-storage-at) → if the block number is set to `pending` it is assumed to be `latest`
* [`eth_getTransactionByBlockNumberAndIndex`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/eth-get-transaction-by-block-number-and-index) → if the block number is set to `pending` it is assumed to be `latest`
* [`eth_sendRawTransaction`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/eth-send-raw-transaction) → can relay TXs to another node

## Additional `zkEVM_*` methods

The zkEVM includes additional JSON-RPC methods which are listed below:

* [`zkevm_consolidatedBlockNumber`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-consolidated-block-number)
* [`zkevm_isBlockConsolidated`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-is-block-consolidated)
* [`zkevm_isBlockVirtualized`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-is-block-virtualized)
* [`zkevm_batchNumberByBlockNumber`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-batch-number-by-block-number)
* [`zkevm_batchNumber`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-batch-number)
* [`zkevm_virtualBatchNumber`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-virtual-batch-number)
* [`zkevm_verifiedBatchNumber`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-verified-batch-number)
* [`zkevm_getBatchByNumber`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-get-batch-by-number)
* [`zkevm_getBroadcastURI`](/docs/chains/polygon-zkevm/polygon-zk-evm-api-endpoints/zkevm-get-broadcast-uri)

## Opcodes

This section lists out the changes with Opcodes in zKEVM as compared to the EVM.

* **SELFDESTRUCT** → removed and replaced by **SENDALL**.
* **EXTCODEHASH** → returns the hash of the contract bytecode from the zkEVM state tree without checking if the account is empty.
* **DIFFICULTY** → returns "0" instead of a random number as in the EVM.
* **BLOCKCHASH** → returns all previous block hashes instead of just the last 256 blocks.

> **BLOCKCHASH** is the state root at the end of a processable transaction and is stored on the system smart contract.

* **NUMBER** → returns the number of processable transactions.

Other precompiled contracts have no effect on the zkEVM state tree and are treated as a `revert`, returning all gas to the previous context and setting the `success` flag to "0".

## Additions

**zk-counters** → batch resources are available, linked to state-machine components, as a supplementary addition to gas computation.

## Other Minor Differences

* zkEVM doesn't clean storage when a contract is deployed at an address due to the zkEVM state tree specification.
* **JUMPDEST** opcode is allowed in push bytes to avoid runtime bytecode analysis.
* The zkEVM implements [EIP-3541](https://eips.ethereum.org/EIPS/eip-3541) from the [London hardfork](https://ethereum.org/en/history/#london).
* [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) which defines **Typed Transaction Envelope**, is not supported.
* [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930), which defines the **Optional Access Lists** transaction type, is not supported.

To start deploying on the zkEVM, check out the [Polygon zkEVM Quickstart Guide](/docs/reference/polygon-zkevm-api-quickstart).