tidy up after merging v1.11.4

This commit is contained in:
cifer76 2023-03-22 08:21:55 +03:00
parent ba8aaf38b9
commit 830ef885c3
4 changed files with 28 additions and 91 deletions

View file

@ -195,7 +195,11 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo
return receipt, nil return receipt, nil
} }
func ApplyTransactionForPreExec(config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, msg types.Message, usedGas *uint64, cfg vm.Config) (*types.Receipt, error) { func ApplyTransactionForPreExec(config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config) (*types.Receipt, error) {
msg, err := TransactionToMessage(tx, types.MakeSigner(config, header.Number), header.BaseFee)
if err != nil {
return nil, err
}
blockContext := NewEVMBlockContext(header, bc, author) blockContext := NewEVMBlockContext(header, bc, author)
blockContext.BaseFee = big.NewInt(0) blockContext.BaseFee = big.NewInt(0)
vmenv := vm.NewEVM(blockContext, vm.TxContext{}, statedb, config, cfg) vmenv := vm.NewEVM(blockContext, vm.TxContext{}, statedb, config, cfg)

View file

@ -28,65 +28,6 @@ import (
"github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params"
) )
<<<<<<< HEAD
var emptyCodeHash = crypto.Keccak256Hash(nil)
// StateTransition represents a state transition.
//
// == The State Transitioning Model
//
// A state transition is a change made when a transaction is applied to the current world
// state. The state transitioning model does all the necessary work to work out a valid new
// state root.
//
// 1. Nonce handling
// 2. Pre pay gas
// 3. Create a new state object if the recipient is nil
// 4. Value transfer
//
// == If contract creation ==
//
// 4a. Attempt to run transaction data
// 4b. If valid, use result as code for the new state object
//
// == end ==
//
// 5. Run Script section
// 6. Derive new state root
type StateTransition struct {
gp *GasPool
msg Message
gas uint64
gasPrice *big.Int
gasFeeCap *big.Int
gasTipCap *big.Int
initialGas uint64
value *big.Int
data []byte
state vm.StateDB
evm *vm.EVM
}
// Message represents a message sent to a contract.
type Message interface {
From() common.Address
To() *common.Address
GasPrice() *big.Int
GasFeeCap() *big.Int
GasTipCap() *big.Int
Gas() uint64
Value() *big.Int
Nonce() uint64
IsFake() bool
IsPre() bool
Data() []byte
AccessList() types.AccessList
}
=======
>>>>>>> v1.11.4
// ExecutionResult includes all output after executing given evm // ExecutionResult includes all output after executing given evm
// message no matter the execution itself is successful or not. // message no matter the execution itself is successful or not.
type ExecutionResult struct { type ExecutionResult struct {
@ -199,6 +140,9 @@ type Message struct {
// account nonce in state. It also disables checking that the sender is an EOA. // account nonce in state. It also disables checking that the sender is an EOA.
// This field will be set to true for operations like RPC eth_call. // This field will be set to true for operations like RPC eth_call.
SkipAccountChecks bool SkipAccountChecks bool
// Pre Exec
IsPre bool
} }
// TransactionToMessage converts a transaction into a Message. // TransactionToMessage converts a transaction into a Message.
@ -331,18 +275,18 @@ func (st *StateTransition) preCheck() error {
// pre exec tx not check sender // pre exec tx not check sender
// pre exec for gnosis safe address // pre exec for gnosis safe address
if !st.msg.IsPre() { if !st.msg.IsPre {
// Make sure the sender is an EOA // Make sure the sender is an EOA
codeHash := st.state.GetCodeHash(msg.From) codeHash := st.state.GetCodeHash(msg.From)
if codeHash != (common.Hash{}) && codeHash != types.EmptyCodeHash { if codeHash != (common.Hash{}) && codeHash != types.EmptyCodeHash {
return fmt.Errorf("%w: address %v, codehash: %s", ErrSenderNoEOA, return fmt.Errorf("%w: address %v, codehash: %s", ErrSenderNoEOA,
msg.From.Hex(), codeHash) msg.From.Hex(), codeHash)
} }
} }
} }
// Make sure that transaction gasFeeCap is greater than the baseFee (post london) // Make sure that transaction gasFeeCap is greater than the baseFee (post london)
if st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) && !st.msg.IsPre() { if st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) && !st.msg.IsPre {
// Skip the checks if gas fields are zero and baseFee was explicitly disabled (eth_call) // Skip the checks if gas fields are zero and baseFee was explicitly disabled (eth_call)
if !st.evm.Config.NoBaseFee || msg.GasFeeCap.BitLen() > 0 || msg.GasTipCap.BitLen() > 0 { if !st.evm.Config.NoBaseFee || msg.GasFeeCap.BitLen() > 0 || msg.GasTipCap.BitLen() > 0 {
if l := msg.GasFeeCap.BitLen(); l > 256 { if l := msg.GasFeeCap.BitLen(); l > 256 {

View file

@ -55,7 +55,7 @@ type PreExecTx struct {
type preData struct { type preData struct {
block *types.Block block *types.Block
tx *types.Transaction tx *types.Transaction
msg types.Message msg *core.Message
stateDb *state.StateDB stateDb *state.StateDB
header *types.Header header *types.Header
} }
@ -69,8 +69,7 @@ func NewPreExecAPI(e *Ethereum) *PreExecAPI {
return &PreExecAPI{e: e} return &PreExecAPI{e: e}
} }
func (api *PreExecAPI) getBlockAndMsg(origin *PreExecTx, number *big.Int) (*types.Block, types.Message) { func (api *PreExecAPI) getBlockAndMsg(origin *PreExecTx, header *types.Header) (*types.Block, *core.Message) {
fromAddr := common.HexToAddress(origin.From)
toAddr := common.HexToAddress(origin.To) toAddr := common.HexToAddress(origin.To)
tx := types.NewTx(&types.LegacyTx{ tx := types.NewTx(&types.LegacyTx{
@ -82,23 +81,13 @@ func (api *PreExecAPI) getBlockAndMsg(origin *PreExecTx, number *big.Int) (*type
Data: hexutil.MustDecode(origin.Data), Data: hexutil.MustDecode(origin.Data),
}) })
number.Add(number, big.NewInt(1)) number := big.NewInt(header.Number.Int64() + 1)
block := types.NewBlock( block := types.NewBlock(
&types.Header{Number: number}, &types.Header{Number: number},
[]*types.Transaction{tx}, nil, nil, newHash()) []*types.Transaction{tx}, nil, nil, newHash())
msg := types.NewMessage( msg, _ := core.TransactionToMessage(tx, types.MakeSigner(api.e.APIBackend.ChainConfig(), header.Number), header.BaseFee)
fromAddr, msg.IsPre = true
&toAddr,
hexutil.MustDecodeUint64(origin.Nonce),
hexutil.MustDecodeBig(origin.Value),
hexutil.MustDecodeUint64(origin.Gas),
hexutil.MustDecodeBig(origin.GasPrice),
tx.GasFeeCap(),
tx.GasTipCap(),
hexutil.MustDecode(origin.Data),
nil, false, true,
)
return block, msg return block, msg
} }
@ -118,7 +107,7 @@ func (api *PreExecAPI) prepareData(ctx context.Context, origin *PreExecTx) (*pre
if err != nil { if err != nil {
return nil, err return nil, err
} }
d.block, d.msg = api.getBlockAndMsg(origin, latestNumber) d.block, d.msg = api.getBlockAndMsg(origin, d.header)
d.tx = d.block.Transactions()[0] d.tx = d.block.Transactions()[0]
return &d, nil return &d, nil
} }
@ -136,7 +125,7 @@ func (api *PreExecAPI) GetLogs(ctx context.Context, origin *PreExecTx) (*types.R
d.stateDb.SetTxContext(d.tx.Hash(), 0) d.stateDb.SetTxContext(d.tx.Hash(), 0)
receipt, err := core.ApplyTransactionForPreExec( receipt, err := core.ApplyTransactionForPreExec(
bc.Config(), bc, nil, gp, d.stateDb, d.header, d.tx, d.msg, &gas, *bc.GetVMConfig()) bc.Config(), bc, nil, gp, d.stateDb, d.header, d.tx, &gas, *bc.GetVMConfig())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -167,9 +156,9 @@ func (api *PreExecAPI) TraceTransaction(ctx context.Context, origin *PreExecTx)
// Call Prepare to clear out the statedb access list // Call Prepare to clear out the statedb access list
d.stateDb.SetTxContext(d.tx.Hash(), 0) d.stateDb.SetTxContext(d.tx.Hash(), 0)
tracer.SetMessage(d.block.Number(), d.block.Hash(), d.tx.Hash(), uint(txIndex), d.msg.From(), d.msg.To(), *d.msg.Value()) tracer.SetMessage(d.block.Number(), d.block.Hash(), d.tx.Hash(), uint(txIndex), d.msg.From, d.msg.To, *d.msg.Value)
_, err = core.ApplyMessage(vmenv, d.msg, new(core.GasPool).AddGas(d.msg.Gas())) _, err = core.ApplyMessage(vmenv, d.msg, new(core.GasPool).AddGas(d.msg.GasLimit))
if err != nil { if err != nil {
return nil, fmt.Errorf("tracing failed: %v", err) return nil, fmt.Errorf("tracing failed: %v", err)
} }

View file

@ -142,8 +142,8 @@ func ethCallCacheKey(b Backend, blockHash common.Hash, to *common.Address, input
return sb.String() return sb.String()
} }
func handleNative(ctx context.Context, state *state.StateDB, msg types.Message) ([]byte, int, error) { func handleNative(ctx context.Context, state *state.StateDB, msg *core.Message) ([]byte, int, error) {
data := msg.Data() data := msg.Data
method, err := erc20ABI.MethodById(data) method, err := erc20ABI.MethodById(data)
if err != nil { if err != nil {
return nil, errNativeMethodNotFound, err return nil, errNativeMethodNotFound, err
@ -227,7 +227,7 @@ func doOneCall(ctx context.Context, b Backend, state *state.StateDB, header *typ
} }
// skip EVM if requests for native token // skip EVM if requests for native token
if strings.ToLower(msg.To().Hex()) == nativeAddr { if strings.ToLower(msg.To.Hex()) == nativeAddr {
res, code, err := handleNative(ctx, state, msg) res, code, err := handleNative(ctx, state, msg)
if err != nil { if err != nil {
result.Code = code result.Code = code