---
eip: 3788
title: Strict enforcement of chainId
description: Reject transactions that do not explicitly have the same chainId as the node's configuration.
author: Gregory Markou (@GregTheGreek)
discussions-to: https://ethereum-magicians.org/t/discussion-to-eip-3788-strict-enforcement-of-chainid/7001
status: Stagnant
type: Standards Track
category: Core
created: 2021-09-2
requires: 155
---

## Abstract

Reject transactions that do not explicitly have the same chainId as the node's configuration.

## Motivation

Per [EIP-155](./eip-155.md) a transaction with a `chainId = 0` is considered to be a valid 
transaction. This was a feature to offer developers the ability to sumbit replayable transactions 
across different chains. With the rise of evm compatible chains, many of which use forks, or packages
from popular Ethereum clients, we are putting user funds at risk. This is because most wallet
interfaces do not expose the chainId to the user, meaning they typically do not have insight
into what chainId they are signing. Should a malicious actor (or accidental) choose to, they
can easily have users submit transactions with a `chainId = 0` on a non-mainnet network, allowing
the malicious actor to replay the transaction on ethereum mainnet (or other networks for that matter)
as a grief or sophisticated attack.

## Specification

As of the fork block `N`, consider transactions with a `chaindId = 0` to be invalid. Such that 
transactions are verified based on the nodes configuration. Eg:
```
if (node.cfg.chainId != tx.chainId) {
    // Reject transaction
}
```

## Rationale

The configuration set by the node is the main source of truth, and thus should be explicitly used
when deciding how to filter out a transaction. This check should exist in two places, as a filter
on the JSON-RPC (eg: `eth_sendTransaction`), and strictly enforced on the EVM during transaction 
validation.

This ensures that users will not have transactions pending that will be guaranteed to fail, and
prevents the transaction from being included in a block.

## Backwards Compatibility
This breaks all applications or tooling that submit transactions with a `chainId == 0` after block number `N`.

## Test Cases
TBD

## Security Considerations
It should be noted this will not prevent a malicious actor from deploying a network with `chainId = 1`, or copying any other networks chainId.

## Copyright
Copyright and related rights waived via [CC0](../LICENSE.md).
