Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add EIP: Revert creation in case of collision #6733

Merged
merged 11 commits into from
Mar 27, 2023
55 changes: 55 additions & 0 deletions EIPS/eip-684.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
eip: 684
title: Revert creation in case of collision
description: Revert contract creation if address already has code
author: Vitalik Buterin (@vbuterin), Renan Rodrigues de Souza (@RenanSouza2)
discussions-to: https://ethereum-magicians.org/t/eip-revert-on-address-collision/13442
status: Final
type: Standards Track
category: Core
created: 2023-03-20
---

## Abstract

This EIP causes contract creation to throw an error when attemted at an address with pre-existing code. This prevents an attack consisting of deploying contract code and later changing the code arbitrarily by "creating" an account at that existing address.

## Specification

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174.

If a contract creation is attempted due to a creation transaction, the `CREATE` opcode, the `CREATE2` opcode, or any other reason, and the destination address already has either a nonzero nonce, or a nonzero code length, then the creation MUST throw as if the first byte in the init code were an invalid opcode. This change MUST apply retroactively for all existing blocks.

## Rationale

One of the core tenants of smart contracts is that its code will not change. However with sufficient computing power an attacker can change the code stored in an address to any other code, steal funds or execute other malicious activity.

## Backwards Compatibility

This is an execution layer upgrade, and so it requires a hard fork.

## Test Cases

Given a genesis allocation of

```
Address : 0xd0bBEc6D2c628b7e2E6D5556daA14a5181b604C5,
Balance : 1000000000000000000, // 1 ether
Nonce : 0,
code : "",

Address : 0x7658771dc6Af74a3d2F8499D349FF9c1a0DF8826,
Balance : 0,
Nonce : 1,
Code : "0xB0B0FACE",
```

A contract created in the first transaction from EOA `0xd0bBEc6...` (`227bcc6959669226360814723ed739f1214201584b6a27409dfb8228b8be5f59`), with no salt, should revert.

## Security Considerations

This EIP is a security upgrade: it enforces the imutability of deployed code.

## Copyright

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