Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 87 additions & 27 deletions content/evm/differences-with-ethereum.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,85 @@ import { Callout } from 'nextra/components';
While Sei features full EVM compatibility, there are some distinctions between
Sei's EVM and Ethereum itself:

| | Sei | Ethereum Mainnet |
| --------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Gas per Second | ~ 25 MegaGas/s | ~ 3 MegaGas/s |
| TPS | ~ 12,500 | ~ 11 |
| Block time | 400 ms | 12 s |
| Finality | Instant | Various commitment levels (i.e., safe, latest, justified, finalized) |
| EVM Version | Shanghai | Cancun |
| Gas Limit | 10 M | 36 M |
| Byte Size Limit | 21 MB | No byte-denominated limits |
| Execution environment | EVM and CosmWasm | EVM |
| Address space | Dual ECDSA-derived addresses; sei-native Bech32 (sei…) + EVM-compatible address (0x…) | ECDSA-derived address (0x…) |

- Sei uses the [Shanghai](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md) version of EVM. This means features rolled out on Ethereum mainnet via the [Cancun](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/cancun.md) upgrade (i.e., EIP-4844 or blob transactions) are not supported on Sei
- Sei’s gas limit is 10M as opposed to Ethereum’s 30M. Sei also has a byte size limit of 21MB.
- Sei has instant finality. This means the various commitment levels typical for Ethereum (i.e., safe, latest, justified) do not apply on Sei.
<div className="overflow-x-auto max-w-full">
<table className="w-full divide-y divide-neutral-200 dark:divide-neutral-800">
<thead>
<tr>
<th className="px-4 py-3 text-left text-sm font-medium text-neutral-500 dark:text-neutral-400">Feature</th>
<th className="px-4 py-3 text-left text-sm font-medium text-neutral-500 dark:text-neutral-400">Sei EVM</th>
<th className="px-4 py-3 text-left text-sm font-medium text-neutral-500 dark:text-neutral-400">Ethereum</th>
</tr>
</thead>
<tbody className="divide-y divide-neutral-200 dark:divide-neutral-800">
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Blocktime</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">380 ms</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">12 s</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Transaction Throughput</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap font-medium">~ 12,500 TPS</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">~ 11 TPS</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Gas per Second</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">~ 25 MegaGas/s</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">~ 3 MegaGas/s</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Finality</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400">Instant</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400">Various commitment levels (safe, latest, justified, finalized)</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Parallelized Execution</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">Yes</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">No</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Ethereum Tooling Compatibility</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">100%</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">100%</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">EVM Version</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">Cancun (w/o blobs)</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">Cancun</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Gas Limit</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">10 M</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">36 M</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Byte Size Limit</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">21 MB</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">No byte-denominated limits</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Execution Environment</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400">EVM and CosmWasm</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400">EVM</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">Address Space</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400">Dual ECDSA-derived addresses; sei-native Bech32 (sei…) + EVM-compatible address (0x…)</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400">ECDSA-derived address (0x…)</td>
</tr>
<tr>
<td className="px-4 py-3 text-sm text-neutral-900 dark:text-neutral-100 whitespace-nowrap font-medium">State Storage</td>
<td className="px-4 py-3 text-sm text-green-600 dark:text-green-400 whitespace-nowrap">AVL-tree (global root)</td>
<td className="px-4 py-3 text-sm text-neutral-600 dark:text-neutral-400 whitespace-nowrap">Merkle Patricia Trie (MPT)</td>
</tr>
</tbody>
</table>
</div>

- Sei uses the [Cancun](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/cancun.md) version of EVM, excluding the blob transactions. - Sei's gas limit is 10 M as opposed to Ethereum's 36 M. Sei also has a byte size limit of 21MB. - Sei has instant finality. This means the various commitment levels typical for Ethereum (i.e., safe, latest, justified) do not apply on Sei.

- **Sei is a dual-execution environment (EVM and CosmWasm).** This means:
- Non-EVM transactions can update EVM-accessible state.
- For example, an accounts SEI balance can be affected by both Cosmos (bank send, wasm execute) transactions as well as EVM send transactions
- For example, an account's SEI balance can be affected by both Cosmos (bank send, wasm execute) transactions as well as EVM send transactions
- Sei assets can not only exist as EVM (i.e., ERC20/721/1155), but also as CW (i.e., CW20, CW721) or as native (Sei, IBC, Tokenfactory).
- User accounts on Sei have [two addresses](https://www.docs.sei.io/learn/account-structure) derived from the same public key (sei-native Bech32 and EVM-compatible 0x…)

Expand All @@ -33,11 +93,11 @@ Sei's EVM and Ethereum itself:

### PREVRANDAO

Since Sei doesnt rely on the same pseudo-randomness way of determining the next
validator like Proof of Stake (PoS) Ethereum does, it doesnt really have the
Since Sei doesn't rely on the same pseudo-randomness way of determining the next
validator like Proof of Stake (PoS) Ethereum does, it doesn't really have the
`RANDOM` artifact that can be set as `PREVRANDO`'s return value. In Sei
`PREVRANDAO` is set to return the hash of the current block time. For strong
randomness guarantee needs in contracts logic, its advised to use external
randomness guarantee needs in contracts logic, it's advised to use external
verifiable oracles (as is advised on Ethereum itself).

### COINBASE
Expand All @@ -48,14 +108,14 @@ collector.
## State Root

Since Sei uses AVL-tree instead of Merkle Patricia Trie (MPT) for data storage,
Sei doesnt have per-account state root. The global state root is the AVL-tree
root which is also not equivalent to Ethereums overall state root (which is a
Sei doesn't have per-account state root. The global state root is the AVL-tree
root which is also not equivalent to Ethereum's overall state root (which is a
MPT root)

## Block Hash

The block hash on Sei is computed based on the block header in Tendermint data
format, and is different from Ethereums block Hash as a result.
format, and is different from Ethereum's block Hash as a result.

## Base Fee & Tips

Expand Down Expand Up @@ -88,16 +148,16 @@ may find certain state changes unattributable to any EVM transaction.

## Finality

Sei has instant finality, meaning that commitment levels of safe”, “latest,
justified, and finalized on Ethereum are all the same thing on Sei.
Sei has instant finality, meaning that commitment levels of "safe", "latest",
"justified", and "finalized" on Ethereum are all the same thing on Sei.

## Pending State

On Ethereum the block proposer would execute its proposed block first (and
update its local state) before broadcasting the proposal to others (the updated
state would be marked pending until the node is accepted by other nodes).
state would be marked "pending" until the node is accepted by other nodes).

However, on Sei, the block proposer would broadcast first and only execute the
proposal if its accepted (i.e. every node would execute the block at roughly
the same time), so Sei does not really have a window when pending state
proposal if it's accepted (i.e. every node would execute the block at roughly
the same time), so Sei does not really have a window when "pending state"
exists.
Loading