mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-18 02:40:45 +00:00
feat!: vm.Hooks.OverrideEVMResetArgs() receives params.Rules (#38)
* feat!: `vm.Hooks.OverrideEVMResetArgs()` receives `params.Rules` * test: propagation of `params.Rules`
This commit is contained in:
parent
53ef0712af
commit
99a755f040
3 changed files with 23 additions and 15 deletions
|
|
@ -159,7 +159,7 @@ func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig
|
||||||
// Reset resets the EVM with a new transaction context.Reset
|
// Reset resets the EVM with a new transaction context.Reset
|
||||||
// This is not threadsafe and should only be done very cautiously.
|
// This is not threadsafe and should only be done very cautiously.
|
||||||
func (evm *EVM) Reset(txCtx TxContext, statedb StateDB) {
|
func (evm *EVM) Reset(txCtx TxContext, statedb StateDB) {
|
||||||
evm.TxContext, evm.StateDB = overrideEVMResetArgs(txCtx, statedb)
|
evm.TxContext, evm.StateDB = evm.overrideEVMResetArgs(txCtx, statedb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cancel cancels any running EVM operation. This may be called concurrently and
|
// Cancel cancels any running EVM operation. This may be called concurrently and
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
|
@ -27,23 +28,25 @@ import (
|
||||||
type evmArgOverrider struct {
|
type evmArgOverrider struct {
|
||||||
newEVMchainID int64
|
newEVMchainID int64
|
||||||
|
|
||||||
resetTxCtx TxContext
|
gotResetChainID *big.Int
|
||||||
resetStateDB StateDB
|
resetTxContextTo TxContext
|
||||||
|
resetStateDBTo StateDB
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o evmArgOverrider) OverrideNewEVMArgs(args *NewEVMArgs) *NewEVMArgs {
|
func (o *evmArgOverrider) OverrideNewEVMArgs(args *NewEVMArgs) *NewEVMArgs {
|
||||||
args.ChainConfig = ¶ms.ChainConfig{ChainID: big.NewInt(o.newEVMchainID)}
|
args.ChainConfig = ¶ms.ChainConfig{ChainID: big.NewInt(o.newEVMchainID)}
|
||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o evmArgOverrider) OverrideEVMResetArgs(*EVMResetArgs) *EVMResetArgs {
|
func (o *evmArgOverrider) OverrideEVMResetArgs(r params.Rules, _ *EVMResetArgs) *EVMResetArgs {
|
||||||
|
o.gotResetChainID = r.ChainID
|
||||||
return &EVMResetArgs{
|
return &EVMResetArgs{
|
||||||
TxContext: o.resetTxCtx,
|
TxContext: o.resetTxContextTo,
|
||||||
StateDB: o.resetStateDB,
|
StateDB: o.resetStateDBTo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o evmArgOverrider) register(t *testing.T) {
|
func (o *evmArgOverrider) register(t *testing.T) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
libevmHooks = nil
|
libevmHooks = nil
|
||||||
RegisterHooks(o)
|
RegisterHooks(o)
|
||||||
|
|
@ -71,9 +74,13 @@ func TestOverrideEVMResetArgs(t *testing.T) {
|
||||||
// Equivalent to rationale for TestOverrideNewEVMArgs above.
|
// Equivalent to rationale for TestOverrideNewEVMArgs above.
|
||||||
var _ func(TxContext, StateDB) = (*EVM)(nil).Reset
|
var _ func(TxContext, StateDB) = (*EVM)(nil).Reset
|
||||||
|
|
||||||
const gasPrice = 1357924680
|
const (
|
||||||
hooks := evmArgOverrider{
|
chainID = 0xc0ffee
|
||||||
resetTxCtx: TxContext{
|
gasPrice = 1357924680
|
||||||
|
)
|
||||||
|
hooks := &evmArgOverrider{
|
||||||
|
newEVMchainID: chainID,
|
||||||
|
resetTxContextTo: TxContext{
|
||||||
GasPrice: big.NewInt(gasPrice),
|
GasPrice: big.NewInt(gasPrice),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -81,5 +88,6 @@ func TestOverrideEVMResetArgs(t *testing.T) {
|
||||||
|
|
||||||
evm := NewEVM(BlockContext{}, TxContext{}, nil, nil, Config{})
|
evm := NewEVM(BlockContext{}, TxContext{}, nil, nil, Config{})
|
||||||
evm.Reset(TxContext{}, nil)
|
evm.Reset(TxContext{}, nil)
|
||||||
require.Equalf(t, big.NewInt(gasPrice), evm.GasPrice, "%T.GasPrice set by Reset() hook", evm)
|
assert.Equalf(t, big.NewInt(chainID), hooks.gotResetChainID, "%T.ChainID passed to Reset() hook", params.Rules{})
|
||||||
|
assert.Equalf(t, big.NewInt(gasPrice), evm.GasPrice, "%T.GasPrice set by Reset() hook", evm)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ var libevmHooks Hooks
|
||||||
// See [RegisterHooks].
|
// See [RegisterHooks].
|
||||||
type Hooks interface {
|
type Hooks interface {
|
||||||
OverrideNewEVMArgs(*NewEVMArgs) *NewEVMArgs
|
OverrideNewEVMArgs(*NewEVMArgs) *NewEVMArgs
|
||||||
OverrideEVMResetArgs(*EVMResetArgs) *EVMResetArgs
|
OverrideEVMResetArgs(params.Rules, *EVMResetArgs) *EVMResetArgs
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEVMArgs are the arguments received by [NewEVM], available for override
|
// NewEVMArgs are the arguments received by [NewEVM], available for override
|
||||||
|
|
@ -67,10 +67,10 @@ func overrideNewEVMArgs(
|
||||||
return args.BlockContext, args.TxContext, args.StateDB, args.ChainConfig, args.Config
|
return args.BlockContext, args.TxContext, args.StateDB, args.ChainConfig, args.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func overrideEVMResetArgs(txCtx TxContext, statedb StateDB) (TxContext, StateDB) {
|
func (evm *EVM) overrideEVMResetArgs(txCtx TxContext, statedb StateDB) (TxContext, StateDB) {
|
||||||
if libevmHooks == nil {
|
if libevmHooks == nil {
|
||||||
return txCtx, statedb
|
return txCtx, statedb
|
||||||
}
|
}
|
||||||
args := libevmHooks.OverrideEVMResetArgs(&EVMResetArgs{txCtx, statedb})
|
args := libevmHooks.OverrideEVMResetArgs(evm.chainRules, &EVMResetArgs{txCtx, statedb})
|
||||||
return args.TxContext, args.StateDB
|
return args.TxContext, args.StateDB
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue