Skip to content
This repository has been archived by the owner on Nov 30, 2021. It is now read-only.

evm: extra eips param #643

Merged
merged 3 commits into from
Dec 8, 2020
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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ Ref: https://keepachangelog.com/en/1.0.0/

## Unreleased

### Improvements

* (evm) [\#627](https://github.com/cosmos/ethermint/issues/627) Add extra EIPs parameter to apply custom EVM jump tables.

### Bug Fixes

* (evm) [\#621](https://github.com/cosmos/ethermint/issues/621) EVM `GenesisAccount` fields now share the same format as the auth module `Account`.
Expand Down
31 changes: 29 additions & 2 deletions x/evm/types/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/params"

"github.com/ethereum/go-ethereum/core/vm"

ethermint "github.com/cosmos/ethermint/types"
)

Expand All @@ -21,6 +23,7 @@ var (
ParamStoreKeyEVMDenom = []byte("EVMDenom")
ParamStoreKeyEnableCreate = []byte("EnableCreate")
ParamStoreKeyEnableCall = []byte("EnableCall")
ParamStoreKeyExtraEIPs = []byte("EnableExtraEIPs")
)

// ParamKeyTable returns the parameter key table.
Expand All @@ -37,14 +40,17 @@ type Params struct {
EnableCreate bool `json:"enable_create" yaml:"enable_create"`
// EnableCall toggles state transitions that use the vm.Call function
EnableCall bool `json:"enable_call" yaml:"enable_call"`
// ExtraEIPs defines the additional EIPs for the vm.Config
ExtraEIPs []int `json:"extra_eips" yaml:"extra_eips"`
}

// NewParams creates a new Params instance
func NewParams(evmDenom string, enableCreate, enableCall bool) Params {
func NewParams(evmDenom string, enableCreate, enableCall bool, extraEIPs ...int) Params {
return Params{
EvmDenom: evmDenom,
EnableCreate: enableCreate,
EnableCall: enableCall,
ExtraEIPs: extraEIPs,
}
}

Expand All @@ -54,6 +60,7 @@ func DefaultParams() Params {
EvmDenom: ethermint.AttoPhoton,
EnableCreate: true,
EnableCall: true,
ExtraEIPs: []int(nil), // TODO: define default values
Copy link

@KamiD KamiD Dec 8, 2020

Choose a reason for hiding this comment

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

enable EIP1344 will make uniswapV2 runnable, EIP1344 was adding opcode of CHAINID to support users getting chain-id in contract

Copy link
Contributor Author

Choose a reason for hiding this comment

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

this PR is only for adding support for extra eips. The default values will be discussed separately on #633

}
}

Expand All @@ -69,12 +76,17 @@ func (p *Params) ParamSetPairs() params.ParamSetPairs {
params.NewParamSetPair(ParamStoreKeyEVMDenom, &p.EvmDenom, validateEVMDenom),
params.NewParamSetPair(ParamStoreKeyEnableCreate, &p.EnableCreate, validateBool),
params.NewParamSetPair(ParamStoreKeyEnableCall, &p.EnableCall, validateBool),
params.NewParamSetPair(ParamStoreKeyExtraEIPs, &p.ExtraEIPs, validateEIPs),
}
}

// Validate performs basic validation on evm parameters.
func (p Params) Validate() error {
return sdk.ValidateDenom(p.EvmDenom)
if err := sdk.ValidateDenom(p.EvmDenom); err != nil {
return err
}

return validateEIPs(p.ExtraEIPs)
}

func validateEVMDenom(i interface{}) error {
Expand All @@ -93,3 +105,18 @@ func validateBool(i interface{}) error {
}
return nil
}

func validateEIPs(i interface{}) error {
eips, ok := i.([]int)
if !ok {
return fmt.Errorf("invalid EIP slice type: %T", i)
}

for _, eip := range eips {
if !vm.ValidEip(eip) {
return fmt.Errorf("EIP %d is not activateable", eip)
}
}

return nil
}
14 changes: 12 additions & 2 deletions x/evm/types/params_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func TestParamsValidate(t *testing.T) {
{"default", DefaultParams(), false},
{
"valid",
NewParams("ara", true, true),
NewParams("ara", true, true, 2929, 1884, 1344),
false,
},
{
Expand All @@ -30,6 +30,14 @@ func TestParamsValidate(t *testing.T) {
},
true,
},
{
"invalid eip",
Params{
EvmDenom: "stake",
ExtraEIPs: []int{1},
},
true,
},
}

for _, tc := range testCases {
Expand All @@ -48,8 +56,10 @@ func TestParamsValidatePriv(t *testing.T) {
require.NoError(t, validateEVMDenom("aphoton"))
require.Error(t, validateBool(""))
require.NoError(t, validateBool(true))
require.Error(t, validateEIPs(""))
require.NoError(t, validateEIPs([]int{1884}))
}

func TestParams_String(t *testing.T) {
require.Equal(t, "evm_denom: aphoton\nenable_create: true\nenable_call: true\n", DefaultParams().String())
require.Equal(t, "evm_denom: aphoton\nenable_create: true\nenable_call: true\nextra_eips: []\n", DefaultParams().String())
}
9 changes: 7 additions & 2 deletions x/evm/types/state_transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ func (st StateTransition) newEVM(
gasLimit uint64,
gasPrice *big.Int,
config ChainConfig,
extraEIPs []int,
) *vm.EVM {
// Create context for evm
context := vm.Context{
Expand All @@ -92,7 +93,11 @@ func (st StateTransition) newEVM(
GasPrice: gasPrice,
}

return vm.NewEVM(context, csdb, config.EthereumConfig(st.ChainID), vm.Config{})
vmConfig := vm.Config{
ExtraEips: extraEIPs,
}

return vm.NewEVM(context, csdb, config.EthereumConfig(st.ChainID), vmConfig)
}

// TransitionDb will transition the state by applying the current transaction and
Expand Down Expand Up @@ -139,7 +144,7 @@ func (st StateTransition) TransitionDb(ctx sdk.Context, config ChainConfig) (*Ex
return nil, errors.New("gas price cannot be nil")
}

evm := st.newEVM(ctx, csdb, gasLimit, gasPrice.Int, config)
evm := st.newEVM(ctx, csdb, gasLimit, gasPrice.Int, config, params.ExtraEIPs)

var (
ret []byte
Expand Down