Motivation

In the long term, Ethereum Classic aims to ensure that backward compatibility for smart contracts is fully preserved. If a contract written today works, then it should continue to work after 100 years, if the Ethereum Classic blockchain still exists at that time. This promise provides good insurance for developers and users on the blockchain. However, it is currently only a social promise, meaning if the community’s opinion changes, the rule about backward compatibility might change as well. This specification provides a way to enforce backward compatibility rules at protocol level.

Specification

Define each hard fork with a version number. For example, we define Constantinople as version 5, and Istanbul as version 6.

Add a new field, backward_compatibility_slashing for block, with the following structure:

{
  version_1: U256,
  transaction_1: Transaction,
  version_2: U256,
  transaction_2: Transaction,
}

At the beginning of state transaction, check that if backward_compatibility_slashing is empty. If not, do the following additional check:

  • Check that the target address given by transaction_1 and transaction_2 can be executed under hard fork version_1 and hard fork version_2. If not, mark the block as invalid.
  • Attempt to execute transaction_1 and transaction_2 under current block, with rules given by version_1 and version_2 respectively. If it returns different results, slash all accounts ever existed on Ethereum Classic, and delete the whole state.