Skip to content

Commit 0deab11

Browse files
authored
Merge pull request #320 from OffchainLabs/replay_run_mode
Replay run mode
2 parents 021ff6f + de513a2 commit 0deab11

File tree

12 files changed

+27
-20
lines changed

12 files changed

+27
-20
lines changed

cmd/evm/internal/t8ntool/execution.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
208208
rejectedTxs = append(rejectedTxs, &rejectedTx{i, errMsg})
209209
continue
210210
}
211-
msg, err := core.TransactionToMessage(tx, signer, pre.Env.BaseFee)
211+
msg, err := core.TransactionToMessage(tx, signer, pre.Env.BaseFee, core.MessageCommitMode)
212212
if err != nil {
213213
log.Warn("rejected tx", "index", i, "hash", tx.Hash(), "error", err)
214214
rejectedTxs = append(rejectedTxs, &rejectedTx{i, err.Error()})

core/state_prefetcher.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (p *statePrefetcher) Prefetch(block *types.Block, statedb *state.StateDB, c
6363
return
6464
}
6565
// Convert the transaction into an executable message and pre-cache its sender
66-
msg, err := TransactionToMessage(tx, signer, header.BaseFee)
66+
msg, err := TransactionToMessage(tx, signer, header.BaseFee, MessageEthcallMode)
6767
if err != nil {
6868
return // Also invalid block, bail out
6969
}

core/state_processor.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
8080
}
8181
// Iterate over and process the individual transactions
8282
for i, tx := range block.Transactions() {
83-
msg, err := TransactionToMessage(tx, signer, header.BaseFee)
83+
msg, err := TransactionToMessage(tx, signer, header.BaseFee, MessageCommitMode)
8484
if err != nil {
8585
return nil, nil, 0, fmt.Errorf("could not apply tx %d [%v]: %w", i, tx.Hash().Hex(), err)
8686
}
@@ -170,7 +170,7 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo
170170
}
171171

172172
func ApplyTransactionWithResultFilter(config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config, resultFilter func(*ExecutionResult) error) (*types.Receipt, *ExecutionResult, error) {
173-
msg, err := TransactionToMessage(tx, types.MakeSigner(config, header.Number, header.Time), header.BaseFee)
173+
msg, err := TransactionToMessage(tx, types.MakeSigner(config, header.Number, header.Time), header.BaseFee, MessageReplayMode)
174174
if err != nil {
175175
return nil, nil, err
176176
}

core/state_transition.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,19 @@ const (
165165
MessageCommitMode MessageRunMode = iota
166166
MessageGasEstimationMode
167167
MessageEthcallMode
168+
MessageReplayMode
168169
)
169170

171+
// these message modes are executed onchain so cannot make any gas shortcuts
172+
func (m MessageRunMode) ExecutedOnChain() bool {
173+
return m == MessageCommitMode || m == MessageReplayMode
174+
}
175+
170176
// TransactionToMessage converts a transaction into a Message.
171-
func TransactionToMessage(tx *types.Transaction, s types.Signer, baseFee *big.Int) (*Message, error) {
177+
func TransactionToMessage(tx *types.Transaction, s types.Signer, baseFee *big.Int, runmode MessageRunMode) (*Message, error) {
172178
msg := &Message{
179+
TxRunMode: runmode,
180+
173181
Tx: tx,
174182

175183
Nonce: tx.Nonce(),

eth/state_accessor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func (eth *Ethereum) stateAtTransaction(ctx context.Context, block *types.Block,
259259
signer := types.MakeSigner(eth.blockchain.Config(), block.Number(), block.Time())
260260
for idx, tx := range block.Transactions() {
261261
// Assemble the transaction call message and return if the requested offset
262-
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee())
262+
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee(), core.MessageReplayMode)
263263
txContext := core.NewEVMTxContext(msg)
264264
context := core.NewEVMBlockContext(block.Header(), eth.blockchain, nil)
265265
if idx == txIndex {

eth/tracers/api.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ func (api *API) traceChain(start, end *types.Block, config *TraceConfig, closed
274274
)
275275
// Trace all the transactions contained within
276276
for i, tx := range task.block.Transactions() {
277-
msg, _ := core.TransactionToMessage(tx, signer, task.block.BaseFee())
277+
msg, _ := core.TransactionToMessage(tx, signer, task.block.BaseFee(), core.MessageReplayMode)
278278
txctx := &Context{
279279
BlockHash: task.block.Hash(),
280280
BlockNumber: task.block.Number(),
@@ -535,7 +535,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config
535535
return nil, err
536536
}
537537
var (
538-
msg, _ = core.TransactionToMessage(tx, signer, block.BaseFee())
538+
msg, _ = core.TransactionToMessage(tx, signer, block.BaseFee(), core.MessageReplayMode)
539539
txContext = core.NewEVMTxContext(msg)
540540
vmenv = vm.NewEVM(vmctx, txContext, statedb, chainConfig, vm.Config{})
541541
)
@@ -609,7 +609,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac
609609
)
610610
for i, tx := range txs {
611611
// Generate the next state snapshot fast without tracing
612-
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee())
612+
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee(), core.MessageReplayMode)
613613
txctx := &Context{
614614
BlockHash: blockHash,
615615
BlockNumber: block.Number(),
@@ -652,7 +652,7 @@ func (api *API) traceBlockParallel(ctx context.Context, block *types.Block, stat
652652
defer pend.Done()
653653
// Fetch and execute the next transaction trace tasks
654654
for task := range jobs {
655-
msg, _ := core.TransactionToMessage(txs[task.index], signer, block.BaseFee())
655+
msg, _ := core.TransactionToMessage(txs[task.index], signer, block.BaseFee(), core.MessageReplayMode)
656656
txctx := &Context{
657657
BlockHash: blockHash,
658658
BlockNumber: block.Number(),
@@ -683,7 +683,7 @@ txloop:
683683
}
684684

685685
// Generate the next state snapshot fast without tracing
686-
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee())
686+
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee(), core.MessageReplayMode)
687687
statedb.SetTxContext(tx.Hash(), i)
688688
vmenv := vm.NewEVM(blockCtx, core.NewEVMTxContext(msg), statedb, api.backend.ChainConfig(), vm.Config{})
689689
if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.GasLimit)); err != nil {
@@ -763,7 +763,7 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block
763763
for i, tx := range block.Transactions() {
764764
// Prepare the transaction for un-traced execution
765765
var (
766-
msg, _ = core.TransactionToMessage(tx, signer, block.BaseFee())
766+
msg, _ = core.TransactionToMessage(tx, signer, block.BaseFee(), core.MessageReplayMode)
767767
txContext = core.NewEVMTxContext(msg)
768768
vmConf vm.Config
769769
dump *os.File

eth/tracers/api_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func (b *testBackend) StateAtTransaction(ctx context.Context, block *types.Block
175175
// Recompute transactions up to the target index.
176176
signer := types.MakeSigner(b.chainConfig, block.Number(), block.Time())
177177
for idx, tx := range block.Transactions() {
178-
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee())
178+
msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee(), core.MessageReplayMode)
179179
txContext := core.NewEVMTxContext(msg)
180180
context := core.NewEVMBlockContext(block.Header(), b.chain, nil)
181181
if idx == txIndex {

eth/tracers/internal/tracetest/calltrace_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func testCallTracer(tracerName string, dirPath string, t *testing.T) {
152152
if err != nil {
153153
t.Fatalf("failed to create call tracer: %v", err)
154154
}
155-
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
155+
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee, core.MessageReplayMode)
156156
if err != nil {
157157
t.Fatalf("failed to prepare transaction for tracing: %v", err)
158158
}
@@ -242,7 +242,7 @@ func benchTracer(tracerName string, test *callTracerTest, b *testing.B) {
242242
Difficulty: (*big.Int)(test.Context.Difficulty),
243243
GasLimit: uint64(test.Context.GasLimit),
244244
}
245-
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
245+
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee, core.MessageReplayMode)
246246
if err != nil {
247247
b.Fatalf("failed to prepare transaction for tracing: %v", err)
248248
}

eth/tracers/internal/tracetest/flat_calltrace_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func flatCallTracerTestRunner(tracerName string, filename string, dirPath string
103103
if err != nil {
104104
return fmt.Errorf("failed to create call tracer: %v", err)
105105
}
106-
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
106+
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee, core.MessageReplayMode)
107107
if err != nil {
108108
return fmt.Errorf("failed to prepare transaction for tracing: %v", err)
109109
}

eth/tracers/internal/tracetest/prestate_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T) {
111111
if err != nil {
112112
t.Fatalf("failed to create call tracer: %v", err)
113113
}
114-
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
114+
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee, core.MessageReplayMode)
115115
if err != nil {
116116
t.Fatalf("failed to prepare transaction for tracing: %v", err)
117117
}

eth/tracers/tracers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func BenchmarkTransactionTrace(b *testing.B) {
9090
//EnableReturnData: false,
9191
})
9292
evm := vm.NewEVM(context, txContext, statedb, params.AllEthashProtocolChanges, vm.Config{Tracer: tracer})
93-
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
93+
msg, err := core.TransactionToMessage(tx, signer, context.BaseFee, core.MessageReplayMode)
9494
if err != nil {
9595
b.Fatalf("failed to prepare transaction for tracing: %v", err)
9696
}

internal/ethapi/api.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,7 +1155,7 @@ func runScheduledTxes(ctx context.Context, b core.NodeInterfaceBackendAPI, state
11551155
scheduled := result.ScheduledTxes
11561156
for runMode == core.MessageGasEstimationMode && len(scheduled) > 0 {
11571157
// This will panic if the scheduled tx is signed, but we only schedule unsigned ones
1158-
msg, err := core.TransactionToMessage(scheduled[0], types.NewArbitrumSigner(nil), header.BaseFee)
1158+
msg, err := core.TransactionToMessage(scheduled[0], types.NewArbitrumSigner(nil), header.BaseFee, runMode)
11591159
if err != nil {
11601160
return nil, err
11611161
}
@@ -1167,7 +1167,6 @@ func runScheduledTxes(ctx context.Context, b core.NodeInterfaceBackendAPI, state
11671167
log.Warn("Scheduling tx used less gas than scheduled tx has available", "usedGas", result.UsedGas, "scheduledGas", msg.GasLimit)
11681168
result.UsedGas = 0
11691169
}
1170-
msg.TxRunMode = runMode
11711170
// make a new EVM for the scheduled Tx (an EVM must never be reused)
11721171
evm := b.GetEVM(ctx, msg, state, header, &vm.Config{NoBaseFee: true}, &blockCtx)
11731172
go func() {

0 commit comments

Comments
 (0)