From e528765aab028cb6104889844c6a7133828136f5 Mon Sep 17 00:00:00 2001 From: Alex Sharov Date: Mon, 23 Sep 2024 14:50:05 +0700 Subject: [PATCH] e3: fix eth_getLogs `data` field (#12047) for https://github.com/erigontech/erigon/issues/12045 --- cmd/state/exec3/historical_trace_worker.go | 16 +++++++++------- cmd/state/exec3/state.go | 5 ++--- cmd/state/exec3/state_recon.go | 14 ++++++++------ cmd/state/exec3/trace_worker.go | 14 +++++++++++--- turbo/jsonrpc/eth_callMany.go | 2 +- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/cmd/state/exec3/historical_trace_worker.go b/cmd/state/exec3/historical_trace_worker.go index c5407b11cd6..902d9f085b5 100644 --- a/cmd/state/exec3/historical_trace_worker.go +++ b/cmd/state/exec3/historical_trace_worker.go @@ -106,13 +106,13 @@ func NewHistoricalTraceWorker( logger: logger, taskGasPool: new(core.GasPool), } - ie.taskGasPool.AddBlobGas(execArgs.ChainConfig.GetMaxBlobGasPerBlock()) ie.ibs = state.New(ie.stateReader) return ie } func (rw *HistoricalTraceWorker) Run() error { + defer rw.evm.JumpDestCache.LogStats() for txTask, ok := rw.in.Next(rw.ctx); ok; txTask, ok = rw.in.Next(rw.ctx) { rw.RunTxTask(txTask) if err := rw.out.Add(rw.ctx, txTask); err != nil { @@ -133,9 +133,7 @@ func (rw *HistoricalTraceWorker) RunTxTask(txTask *state.TxTask) { } rw.stateReader.SetTxNum(txTask.TxNum) - //rw.stateWriter.SetTxNum(rw.ctx, txTask.TxNum) rw.stateReader.ResetReadSet() - //rw.stateWriter.ResetWriteSet() rw.stateWriter = state.NewNoopWriter() rw.ibs.Reset() @@ -179,7 +177,7 @@ func (rw *HistoricalTraceWorker) RunTxTask(txTask *state.TxTask) { txTask.Error = err } default: - rw.taskGasPool.Reset(txTask.Tx.GetGas(), rw.execArgs.ChainConfig.GetMaxBlobGasPerBlock()) + rw.taskGasPool.Reset(txTask.Tx.GetGas(), txTask.Tx.GetBlobGas()) if tracer := rw.consumer.NewTracer(); tracer != nil { rw.vmConfig.Debug = true rw.vmConfig.Tracer = tracer @@ -187,9 +185,7 @@ func (rw *HistoricalTraceWorker) RunTxTask(txTask *state.TxTask) { rw.vmConfig.SkipAnalysis = txTask.SkipAnalysis ibs.SetTxContext(txTask.TxIndex) msg := txTask.TxAsMessage - - rw.evm.ResetBetweenBlocks(txTask.EvmBlockContext, core.NewEVMTxContext(msg), ibs, *rw.vmConfig, rules) - + msg.SetCheckNonce(!rw.vmConfig.StatelessExec) if msg.FeeCap().IsZero() { // Only zero-gas transactions may be service ones syscall := func(contract common.Address, data []byte) ([]byte, error) { @@ -198,6 +194,12 @@ func (rw *HistoricalTraceWorker) RunTxTask(txTask *state.TxTask) { msg.SetIsFree(rw.execArgs.Engine.IsServiceTransaction(msg.From(), syscall)) } + txContext := core.NewEVMTxContext(msg) + if rw.vmConfig.TraceJumpDest { + txContext.TxHash = txTask.Tx.Hash() + } + rw.evm.ResetBetweenBlocks(txTask.EvmBlockContext, txContext, ibs, *rw.vmConfig, rules) + // MA applytx applyRes, err := core.ApplyMessage(rw.evm, msg, rw.taskGasPool, true /* refunds */, false /* gasBailout */) if err != nil { diff --git a/cmd/state/exec3/state.go b/cmd/state/exec3/state.go index f121382a58c..1db17933b05 100644 --- a/cmd/state/exec3/state.go +++ b/cmd/state/exec3/state.go @@ -258,9 +258,6 @@ func (rw *Worker) RunTxTaskNoLock(txTask *state.TxTask, mode stages.Mode) { rw.vmCfg.SkipAnalysis = txTask.SkipAnalysis ibs.SetTxContext(txTask.TxIndex) msg := txTask.TxAsMessage - - rw.evm.ResetBetweenBlocks(txTask.EvmBlockContext, core.NewEVMTxContext(msg), ibs, rw.vmCfg, rules) - if msg.FeeCap().IsZero() && rw.engine != nil { // Only zero-gas transactions may be service ones syscall := func(contract libcommon.Address, data []byte) ([]byte, error) { @@ -269,6 +266,8 @@ func (rw *Worker) RunTxTaskNoLock(txTask *state.TxTask, mode stages.Mode) { msg.SetIsFree(rw.engine.IsServiceTransaction(msg.From(), syscall)) } + rw.evm.ResetBetweenBlocks(txTask.EvmBlockContext, core.NewEVMTxContext(msg), ibs, rw.vmCfg, rules) + // MA applytx applyRes, err := core.ApplyMessage(rw.evm, msg, rw.taskGasPool, true /* refunds */, false /* gasBailout */) if err != nil { diff --git a/cmd/state/exec3/state_recon.go b/cmd/state/exec3/state_recon.go index a0f3f50822d..70de77d1290 100644 --- a/cmd/state/exec3/state_recon.go +++ b/cmd/state/exec3/state_recon.go @@ -355,10 +355,8 @@ func (rw *ReconWorker) runTxTask(txTask *state.TxTask) error { vmConfig := vm.Config{NoReceipts: true, SkipAnalysis: txTask.SkipAnalysis} ibs.SetTxContext(txTask.TxIndex) msg := txTask.TxAsMessage - - rw.evm.ResetBetweenBlocks(txTask.EvmBlockContext, core.NewEVMTxContext(msg), ibs, vmConfig, txTask.Rules) - vmenv := rw.evm - if msg.FeeCap().IsZero() && rw.engine != nil { + msg.SetCheckNonce(!vmConfig.StatelessExec) + if msg.FeeCap().IsZero() { // Only zero-gas transactions may be service ones syscall := func(contract libcommon.Address, data []byte) ([]byte, error) { return core.SysCallContract(contract, data, rw.chainConfig, ibs, header, rw.engine, true /* constCall */) @@ -366,8 +364,12 @@ func (rw *ReconWorker) runTxTask(txTask *state.TxTask) error { msg.SetIsFree(rw.engine.IsServiceTransaction(msg.From(), syscall)) } - //fmt.Printf("txNum=%d, blockNum=%d, txIndex=%d\n", txTask.TxNum, txTask.BlockNum, txTask.TxIndex) - _, err = core.ApplyMessage(vmenv, msg, gp, true /* refunds */, false /* gasBailout */) + txContext := core.NewEVMTxContext(msg) + if vmConfig.TraceJumpDest { + txContext.TxHash = txTask.Tx.Hash() + } + rw.evm.ResetBetweenBlocks(txTask.EvmBlockContext, txContext, ibs, vmConfig, txTask.Rules) + _, err = core.ApplyMessage(rw.evm, msg, gp, true /* refunds */, false /* gasBailout */) if err != nil { if _, readError := rw.stateReader.ReadError(); !readError { return fmt.Errorf("could not apply blockNum=%d, txIdx=%d txNum=%d [%x] failed: %w", txTask.BlockNum, txTask.TxIndex, txTask.TxNum, txTask.Tx.Hash(), err) diff --git a/cmd/state/exec3/trace_worker.go b/cmd/state/exec3/trace_worker.go index 02c8588ecec..3f7f526848b 100644 --- a/cmd/state/exec3/trace_worker.go +++ b/cmd/state/exec3/trace_worker.go @@ -22,7 +22,6 @@ import ( "github.com/erigontech/erigon-lib/chain" "github.com/erigontech/erigon-lib/common" "github.com/erigontech/erigon-lib/kv" - "github.com/erigontech/erigon/consensus" "github.com/erigontech/erigon/core" "github.com/erigontech/erigon/core/state" @@ -108,12 +107,12 @@ func (e *TraceWorker) ExecTxn(txNum uint64, txIndex int, txn types.Transaction) e.stateReader.SetTxNum(txNum) e.ibs.Reset() e.ibs.SetTxContext(txIndex) - gp := new(core.GasPool).AddGas(txn.GetGas()).AddBlobGas(txn.GetBlobGas()) + msg, err := txn.AsMessage(*e.signer, e.header.BaseFee, e.rules) if err != nil { return nil, err } - e.evm.ResetBetweenBlocks(*e.blockCtx, core.NewEVMTxContext(msg), e.ibs, *e.vmConfig, e.rules) + msg.SetCheckNonce(!e.vmConfig.StatelessExec) if msg.FeeCap().IsZero() { // Only zero-gas transactions may be service ones syscall := func(contract common.Address, data []byte) ([]byte, error) { @@ -121,10 +120,19 @@ func (e *TraceWorker) ExecTxn(txNum uint64, txIndex int, txn types.Transaction) } msg.SetIsFree(e.engine.IsServiceTransaction(msg.From(), syscall)) } + + txContext := core.NewEVMTxContext(msg) + if e.vmConfig.TraceJumpDest { + txContext.TxHash = txn.Hash() + } + e.evm.ResetBetweenBlocks(*e.blockCtx, txContext, e.ibs, *e.vmConfig, e.rules) + + gp := new(core.GasPool).AddGas(txn.GetGas()).AddBlobGas(txn.GetBlobGas()) res, err := core.ApplyMessage(e.evm, msg, gp, true /* refunds */, false /* gasBailout */) if err != nil { return nil, fmt.Errorf("%w: blockNum=%d, txNum=%d, %s", err, e.blockNum, txNum, e.ibs.Error()) } + e.ibs.SoftFinalise() if e.vmConfig.Tracer != nil { if e.tracer.Found() { e.tracer.SetTransaction(txn) diff --git a/turbo/jsonrpc/eth_callMany.go b/turbo/jsonrpc/eth_callMany.go index a7672aab4fc..4ebcde8405f 100644 --- a/turbo/jsonrpc/eth_callMany.go +++ b/turbo/jsonrpc/eth_callMany.go @@ -278,7 +278,7 @@ func (api *APIImpl) CallMany(ctx context.Context, bundles []Bundle, simulateCont } txCtx = core.NewEVMTxContext(msg) evm = vm.NewEVM(blockCtx, txCtx, evm.IntraBlockState(), chainConfig, vm.Config{Debug: false}) - result, err := core.ApplyMessage(evm, msg, gp, true, false) + result, err := core.ApplyMessage(evm, msg, gp, true /* refunds */, false /* gasBailout */) if err != nil { return nil, err }