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

SET_INDESTRUCTIBLE opcode #2937

Merged
merged 8 commits into from Sep 10, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 48 additions & 0 deletions EIPS/eip-2937.md
@@ -0,0 +1,48 @@
---
eip: 2937
title: SET_INDESTRUCTIBLE opcode
author: Vitalik Buterin (@vbuterin)
discussions-to: https://ethereum-magicians.org/t/eip-2937-set-indestructible/4571
status: Draft
type: Standards Track
category: Core
created: 2020-09-04
---

## Simple Summary

Add a `SET_INDESTRUCTIBLE (0xA8)` opcode that prevents the contract from calling `SELFDESTRUCT (0xFF)`.

## Abstract

## Motivation
vbuterin marked this conversation as resolved.
Show resolved Hide resolved

The intended use case would be for contracts to make their first byte of code be the `SET_INDESTRUCTIBLE` opcode if they wish to serve as libraries that guarantee to users that their code will exist unmodified forever. This is useful in account abstraction as well as other contexts.

Unlike EIPs that disable the `SELFDESTRUCT` opcode entirely, this EIP does not modify behavior of any existing contracts.

## Specification

Add a transaction-wide global variable `globals.indestructible: Set[Address]` (i.e. a variable that operates the same way as the selfdestructs set), initialized to the empty set.

Add a `SET_INDESTRUCTIBLE` opcode at `0xA8`, with gas cost `G_base`, that adds the current `callee` to the `globals.indestructible` set. If in the current execution context the `callee` is in `globals.indestructible`, the `SELFDESTRUCT` opcode throws an exception.

## Rationale

Alternative proposals to this include:

* Simply banning `SELFDESTRUCT` outright. This would be ideal, but has larger backwards compatibility issues.
* Using a local variable instead of a global variable. This is problematic because it would be broken by `DELEGATECALL`.

## Backwards Compatibility

TBD

## Security Considerations

This breaks forward compatibility with _some_ forms of state rent, which would simply delete contracts that get too old without paying some maintenance fee. However, this is not the case with all state size control schemes; for example this is not an issue if we use [ReGenesis](https://ledgerwatch.github.io/regenesis_plan.html).

If `SELFDESTRUCT` is ever removed in the future, this EIP would simply become a no-op.
Comment on lines +43 to +45
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not personally a fan of forward compatibility stuff in an EIP. This feels like something much more appropriate in the discussion-to link, or in the HF inclusion discussions. If you imagine reading this EIP 5 years in the future after it has been implemented, this section won't really provide any significant value to those readers.


## Copyright
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).