mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-17 10:20:44 +00:00
feat: override EVM.Reset() args (#36)
This commit is contained in:
parent
dc619990f5
commit
53ef0712af
5 changed files with 68 additions and 12 deletions
|
|
@ -13,6 +13,7 @@
|
||||||
// You should have received a copy of the GNU Lesser General Public License
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
// along with the go-ethereum library. If not, see
|
// along with the go-ethereum library. If not, see
|
||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package vm
|
package vm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -159,8 +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 = txCtx
|
evm.TxContext, evm.StateDB = overrideEVMResetArgs(txCtx, statedb)
|
||||||
evm.StateDB = 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
|
||||||
|
|
|
||||||
|
|
@ -24,15 +24,34 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
type chainIDOverrider struct {
|
type evmArgOverrider struct {
|
||||||
chainID int64
|
newEVMchainID int64
|
||||||
|
|
||||||
|
resetTxCtx TxContext
|
||||||
|
resetStateDB StateDB
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o chainIDOverrider) OverrideNewEVMArgs(args *NewEVMArgs) *NewEVMArgs {
|
func (o evmArgOverrider) OverrideNewEVMArgs(args *NewEVMArgs) *NewEVMArgs {
|
||||||
args.ChainConfig = ¶ms.ChainConfig{ChainID: big.NewInt(o.chainID)}
|
args.ChainConfig = ¶ms.ChainConfig{ChainID: big.NewInt(o.newEVMchainID)}
|
||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o evmArgOverrider) OverrideEVMResetArgs(*EVMResetArgs) *EVMResetArgs {
|
||||||
|
return &EVMResetArgs{
|
||||||
|
TxContext: o.resetTxCtx,
|
||||||
|
StateDB: o.resetStateDB,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o evmArgOverrider) register(t *testing.T) {
|
||||||
|
t.Helper()
|
||||||
|
libevmHooks = nil
|
||||||
|
RegisterHooks(o)
|
||||||
|
t.Cleanup(func() {
|
||||||
|
libevmHooks = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestOverrideNewEVMArgs(t *testing.T) {
|
func TestOverrideNewEVMArgs(t *testing.T) {
|
||||||
// The overrideNewEVMArgs function accepts and returns all arguments to
|
// The overrideNewEVMArgs function accepts and returns all arguments to
|
||||||
// NewEVM(), in order. Here we lock in our assumption of that order. If this
|
// NewEVM(), in order. Here we lock in our assumption of that order. If this
|
||||||
|
|
@ -40,10 +59,27 @@ func TestOverrideNewEVMArgs(t *testing.T) {
|
||||||
var _ func(BlockContext, TxContext, StateDB, *params.ChainConfig, Config) *EVM = NewEVM
|
var _ func(BlockContext, TxContext, StateDB, *params.ChainConfig, Config) *EVM = NewEVM
|
||||||
|
|
||||||
const chainID = 13579
|
const chainID = 13579
|
||||||
libevmHooks = nil
|
hooks := evmArgOverrider{newEVMchainID: chainID}
|
||||||
RegisterHooks(chainIDOverrider{chainID: chainID})
|
hooks.register(t)
|
||||||
defer func() { libevmHooks = nil }()
|
|
||||||
|
|
||||||
got := NewEVM(BlockContext{}, TxContext{}, nil, nil, Config{}).ChainConfig().ChainID
|
evm := NewEVM(BlockContext{}, TxContext{}, nil, nil, Config{})
|
||||||
require.Equal(t, big.NewInt(chainID), got)
|
got := evm.ChainConfig().ChainID
|
||||||
|
require.Equalf(t, big.NewInt(chainID), got, "%T.ChainConfig().ChainID set by NewEVM() hook", evm)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOverrideEVMResetArgs(t *testing.T) {
|
||||||
|
// Equivalent to rationale for TestOverrideNewEVMArgs above.
|
||||||
|
var _ func(TxContext, StateDB) = (*EVM)(nil).Reset
|
||||||
|
|
||||||
|
const gasPrice = 1357924680
|
||||||
|
hooks := evmArgOverrider{
|
||||||
|
resetTxCtx: TxContext{
|
||||||
|
GasPrice: big.NewInt(gasPrice),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
hooks.register(t)
|
||||||
|
|
||||||
|
evm := NewEVM(BlockContext{}, TxContext{}, nil, nil, Config{})
|
||||||
|
evm.Reset(TxContext{}, nil)
|
||||||
|
require.Equalf(t, big.NewInt(gasPrice), evm.GasPrice, "%T.GasPrice set by Reset() hook", evm)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
// You should have received a copy of the GNU Lesser General Public License
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
// along with the go-ethereum library. If not, see
|
// along with the go-ethereum library. If not, see
|
||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package vm
|
package vm
|
||||||
|
|
||||||
import "github.com/ethereum/go-ethereum/params"
|
import "github.com/ethereum/go-ethereum/params"
|
||||||
|
|
@ -29,11 +30,14 @@ func RegisterHooks(h Hooks) {
|
||||||
var libevmHooks Hooks
|
var libevmHooks Hooks
|
||||||
|
|
||||||
// Hooks are arbitrary configuration functions to modify default VM behaviour.
|
// Hooks are arbitrary configuration functions to modify default VM behaviour.
|
||||||
|
// See [RegisterHooks].
|
||||||
type Hooks interface {
|
type Hooks interface {
|
||||||
OverrideNewEVMArgs(*NewEVMArgs) *NewEVMArgs
|
OverrideNewEVMArgs(*NewEVMArgs) *NewEVMArgs
|
||||||
|
OverrideEVMResetArgs(*EVMResetArgs) *EVMResetArgs
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEVMArgs are the arguments received by [NewEVM], available for override.
|
// NewEVMArgs are the arguments received by [NewEVM], available for override
|
||||||
|
// via [Hooks].
|
||||||
type NewEVMArgs struct {
|
type NewEVMArgs struct {
|
||||||
BlockContext BlockContext
|
BlockContext BlockContext
|
||||||
TxContext TxContext
|
TxContext TxContext
|
||||||
|
|
@ -42,6 +46,13 @@ type NewEVMArgs struct {
|
||||||
Config Config
|
Config Config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EVMResetArgs are the arguments received by [EVM.Reset], available for
|
||||||
|
// override via [Hooks].
|
||||||
|
type EVMResetArgs struct {
|
||||||
|
TxContext TxContext
|
||||||
|
StateDB StateDB
|
||||||
|
}
|
||||||
|
|
||||||
func overrideNewEVMArgs(
|
func overrideNewEVMArgs(
|
||||||
blockCtx BlockContext,
|
blockCtx BlockContext,
|
||||||
txCtx TxContext,
|
txCtx TxContext,
|
||||||
|
|
@ -55,3 +66,11 @@ func overrideNewEVMArgs(
|
||||||
args := libevmHooks.OverrideNewEVMArgs(&NewEVMArgs{blockCtx, txCtx, statedb, chainConfig, config})
|
args := libevmHooks.OverrideNewEVMArgs(&NewEVMArgs{blockCtx, txCtx, statedb, chainConfig, config})
|
||||||
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) {
|
||||||
|
if libevmHooks == nil {
|
||||||
|
return txCtx, statedb
|
||||||
|
}
|
||||||
|
args := libevmHooks.OverrideEVMResetArgs(&EVMResetArgs{txCtx, statedb})
|
||||||
|
return args.TxContext, args.StateDB
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
// You should have received a copy of the GNU Lesser General Public License
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
// along with the go-ethereum library. If not, see
|
// along with the go-ethereum library. If not, see
|
||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package vm
|
package vm
|
||||||
|
|
||||||
import "github.com/holiman/uint256"
|
import "github.com/holiman/uint256"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue