Skip to content

Commit 1c8c785

Browse files
authored
extension methods for ITransactionProcessor (#11393)
* extension methods for ITransactionProcessor * fix * resolve issues , add warmup to interface and make other files compatible * fix linting * fix linting * fixes: use same style for extension and make buildup option * add system for flags
1 parent 28760dc commit 1c8c785

4 files changed

Lines changed: 140 additions & 136 deletions

File tree

src/Nethermind/Nethermind.Evm.Test/OverridableEnv/DisposableScopeOverridableEnvTests.cs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,7 @@ private class TestTransactionProcessor(IWorldState worldState) : ITransactionPro
119119
{
120120
public IWorldState WorldState => worldState;
121121

122-
public TransactionResult Execute(Transaction transaction, ITxTracer txTracer) =>
123-
throw new NotImplementedException();
124-
125-
public TransactionResult CallAndRestore(Transaction transaction, ITxTracer txTracer) =>
126-
throw new NotImplementedException();
127-
128-
public TransactionResult BuildUp(Transaction transaction, ITxTracer txTracer) =>
129-
throw new NotImplementedException();
130-
131-
public TransactionResult Trace(Transaction transaction, ITxTracer txTracer) =>
132-
throw new NotImplementedException();
133-
134-
public TransactionResult Warmup(Transaction transaction, ITxTracer txTracer) =>
122+
public TransactionResult Process(Transaction transaction, ITxTracer txTracer, ExecutionOptions options) =>
135123
throw new NotImplementedException();
136124

137125
public void SetBlockExecutionContext(BlockHeader blockHeader) =>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
2+
// SPDX-License-Identifier: LGPL-3.0-only
3+
4+
using System;
5+
6+
namespace Nethermind.Evm.TransactionProcessing;
7+
8+
[Flags]
9+
public enum ExecutionOptions
10+
{
11+
/// <summary>
12+
/// Just accumulate the state
13+
/// </summary>
14+
None = 0,
15+
16+
/// <summary>
17+
/// Commit the state after execution
18+
/// </summary>
19+
Commit = 1,
20+
21+
/// <summary>
22+
/// Restore state after execution
23+
/// </summary>
24+
Restore = 2,
25+
26+
/// <summary>
27+
/// Skip potential fail checks
28+
/// </summary>
29+
SkipValidation = 4,
30+
31+
/// <summary>
32+
/// Marker option used by state pre-warmer
33+
/// </summary>
34+
Warmup = 8,
35+
36+
/// <summary>
37+
/// Accumulate state without committing or restoring (block-building mode)
38+
/// </summary>
39+
BuildUp = 16,
40+
41+
/// <summary>
42+
/// Skip potential fail checks and commit state after execution
43+
/// </summary>
44+
SkipValidationAndCommit = Commit | SkipValidation,
45+
46+
/// <summary>
47+
/// Commit and later restore state also skip validation, use for CallAndRestore
48+
/// </summary>
49+
CommitAndRestore = Commit | Restore | SkipValidation
50+
}

src/Nethermind/Nethermind.Evm/TransactionProcessing/ITransactionProcessor.cs

Lines changed: 78 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,10 @@ namespace Nethermind.Evm.TransactionProcessing;
99

1010
public interface ITransactionProcessor
1111
{
12-
/// <summary>
13-
/// Execute transaction, commit state
14-
/// </summary>
15-
TransactionResult Execute(Transaction transaction, ITxTracer txTracer);
16-
17-
/// <summary>
18-
/// Call transaction, rollback state
19-
/// </summary>
20-
TransactionResult CallAndRestore(Transaction transaction, ITxTracer txTracer);
21-
22-
/// <summary>
23-
/// Execute transaction, keep the state uncommitted
24-
/// </summary>
25-
TransactionResult BuildUp(Transaction transaction, ITxTracer txTracer);
26-
27-
/// <summary>
28-
/// Call transaction, no validations, commit state
29-
/// Will NOT charge gas from sender account, so stateDiff will miss gas fee
30-
/// </summary>
31-
TransactionResult Trace(Transaction transaction, ITxTracer txTracer);
32-
33-
/// <summary>
34-
/// Call transaction, no validations, don't commit state
35-
/// Will NOT charge gas from sender account
36-
/// </summary>
37-
TransactionResult Warmup(Transaction transaction, ITxTracer txTracer);
38-
12+
TransactionResult Process(
13+
Transaction transaction,
14+
ITxTracer txTracer,
15+
ExecutionOptions options);
3916

4017
void SetBlockExecutionContext(BlockHeader blockHeader);
4118
void SetBlockExecutionContext(in BlockExecutionContext blockExecutionContext);
@@ -49,44 +26,80 @@ bool TryCalculateBlobBaseFee(BlockHeader header, Transaction transaction,
4926

5027
public static class ITransactionProcessorExtensions
5128
{
52-
public static TransactionResult Execute(this ITransactionProcessor transactionProcessor, Transaction transaction, BlockHeader header, ITxTracer txTracer)
53-
{
54-
transactionProcessor.SetBlockExecutionContext(header);
55-
return transactionProcessor.Execute(transaction, txTracer);
56-
}
57-
58-
public static TransactionResult CallAndRestore(this ITransactionProcessor transactionProcessor, Transaction transaction, BlockHeader header, ITxTracer txTracer)
59-
{
60-
transactionProcessor.SetBlockExecutionContext(header);
61-
return transactionProcessor.CallAndRestore(transaction, txTracer);
62-
}
63-
64-
public static TransactionResult Execute(this ITransactionProcessor transactionProcessor, Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
65-
{
66-
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
67-
return transactionProcessor.Execute(transaction, txTracer);
68-
}
69-
70-
public static TransactionResult CallAndRestore(this ITransactionProcessor transactionProcessor, Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
71-
{
72-
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
73-
return transactionProcessor.CallAndRestore(transaction, txTracer);
74-
}
75-
76-
public static TransactionResult BuildUp(this ITransactionProcessor transactionProcessor, Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
77-
{
78-
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
79-
return transactionProcessor.BuildUp(transaction, txTracer);
80-
}
81-
public static TransactionResult Trace(this ITransactionProcessor transactionProcessor, Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
82-
{
83-
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
84-
return transactionProcessor.Trace(transaction, txTracer);
85-
}
86-
87-
public static TransactionResult Warmup(this ITransactionProcessor transactionProcessor, Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
29+
extension(ITransactionProcessor transactionProcessor)
8830
{
89-
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
90-
return transactionProcessor.Warmup(transaction, txTracer);
31+
/// <summary>
32+
/// Execute transaction, commit state.
33+
/// </summary>
34+
public TransactionResult Execute(Transaction transaction, ITxTracer txTracer)
35+
=> transactionProcessor.Process(transaction, txTracer, ExecutionOptions.Commit);
36+
37+
/// <summary>
38+
/// Call transaction, rollback state.
39+
/// </summary>
40+
public TransactionResult CallAndRestore(Transaction transaction, ITxTracer txTracer)
41+
=> transactionProcessor.Process(transaction, txTracer, ExecutionOptions.CommitAndRestore);
42+
43+
/// <summary>
44+
/// Execute transaction, keep the state uncommitted (block-building mode).
45+
/// </summary>
46+
public TransactionResult BuildUp(Transaction transaction, ITxTracer txTracer)
47+
=> transactionProcessor.Process(transaction, txTracer, ExecutionOptions.BuildUp);
48+
49+
/// <summary>
50+
/// Call transaction, no validations, commit state.
51+
/// Will NOT charge gas from sender account, so stateDiff will miss gas fee.
52+
/// </summary>
53+
public TransactionResult Trace(Transaction transaction, ITxTracer txTracer)
54+
=> transactionProcessor.Process(transaction, txTracer, ExecutionOptions.SkipValidationAndCommit);
55+
56+
/// <summary>
57+
/// Call transaction, no validations, don't commit state.
58+
/// Will NOT charge gas from sender account.
59+
/// </summary>
60+
public TransactionResult Warmup(Transaction transaction, ITxTracer txTracer)
61+
=> transactionProcessor.Process(transaction, txTracer, ExecutionOptions.Warmup | ExecutionOptions.SkipValidation);
62+
63+
public TransactionResult Execute(Transaction transaction, BlockHeader header, ITxTracer txTracer)
64+
{
65+
transactionProcessor.SetBlockExecutionContext(header);
66+
return transactionProcessor.Execute(transaction, txTracer);
67+
}
68+
69+
public TransactionResult CallAndRestore(Transaction transaction, BlockHeader header, ITxTracer txTracer)
70+
{
71+
transactionProcessor.SetBlockExecutionContext(header);
72+
return transactionProcessor.CallAndRestore(transaction, txTracer);
73+
}
74+
75+
public TransactionResult Execute(Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
76+
{
77+
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
78+
return transactionProcessor.Execute(transaction, txTracer);
79+
}
80+
81+
public TransactionResult CallAndRestore(Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
82+
{
83+
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
84+
return transactionProcessor.CallAndRestore(transaction, txTracer);
85+
}
86+
87+
public TransactionResult BuildUp(Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
88+
{
89+
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
90+
return transactionProcessor.BuildUp(transaction, txTracer);
91+
}
92+
93+
public TransactionResult Trace(Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
94+
{
95+
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
96+
return transactionProcessor.Trace(transaction, txTracer);
97+
}
98+
99+
public TransactionResult Warmup(Transaction transaction, in BlockExecutionContext blockExecutionContext, ITxTracer txTracer)
100+
{
101+
transactionProcessor.SetBlockExecutionContext(in blockExecutionContext);
102+
return transactionProcessor.Warmup(transaction, txTracer);
103+
}
91104
}
92105
}

src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs

Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -70,45 +70,6 @@ public abstract class TransactionProcessorBase<TGasPolicy> : ITransactionProcess
7070
private long _blockCumulativeRegularGas;
7171
private long _blockCumulativeReceiptGas;
7272

73-
[Flags]
74-
protected enum ExecutionOptions
75-
{
76-
/// <summary>
77-
/// Just accumulate the state
78-
/// </summary>
79-
None = 0,
80-
81-
/// <summary>
82-
/// Commit the state after execution
83-
/// </summary>
84-
Commit = 1,
85-
86-
/// <summary>
87-
/// Restore state after execution
88-
/// </summary>
89-
Restore = 2,
90-
91-
/// <summary>
92-
/// Skip potential fail checks
93-
/// </summary>
94-
SkipValidation = 4,
95-
96-
/// <summary>
97-
/// Marker option used by state pre-warmer
98-
/// </summary>
99-
Warmup = 8,
100-
101-
/// <summary>
102-
/// Skip potential fail checks and commit state after execution
103-
/// </summary>
104-
SkipValidationAndCommit = Commit | SkipValidation,
105-
106-
/// <summary>
107-
/// Commit and later restore state also skip validation, use for CallAndRestore
108-
/// </summary>
109-
CommitAndRestore = Commit | Restore | SkipValidation
110-
}
111-
11273
protected TransactionProcessorBase(
11374
ITransactionProcessor.IBlobBaseFeeCalculator? blobBaseFeeCalculator,
11475
ISpecProvider? specProvider,
@@ -151,26 +112,18 @@ public void SetBlockExecutionContext(BlockHeader header)
151112
SetBlockExecutionContext(in blockExecutionContext);
152113
}
153114

154-
public TransactionResult CallAndRestore(Transaction transaction, ITxTracer txTracer) =>
155-
ExecuteCore(transaction, txTracer, ExecutionOptions.CommitAndRestore);
156-
157-
public TransactionResult BuildUp(Transaction transaction, ITxTracer txTracer)
115+
public TransactionResult Process(
116+
Transaction transaction,
117+
ITxTracer txTracer,
118+
ExecutionOptions options)
158119
{
159-
// we need to treat the result of previous transaction as the original value of next transaction
160-
// when we do not commit
161-
WorldState.TakeSnapshot(true);
162-
return ExecuteCore(transaction, txTracer, ExecutionOptions.None);
163-
}
164-
165-
public TransactionResult Execute(Transaction transaction, ITxTracer txTracer) =>
166-
ExecuteCore(transaction, txTracer, ExecutionOptions.Commit);
167-
168-
public TransactionResult Trace(Transaction transaction, ITxTracer txTracer) =>
169-
ExecuteCore(transaction, txTracer, ExecutionOptions.SkipValidationAndCommit);
170-
171-
public virtual TransactionResult Warmup(Transaction transaction, ITxTracer txTracer) =>
172-
ExecuteCore(transaction, txTracer, ExecutionOptions.Warmup | ExecutionOptions.SkipValidation);
120+
if (options == ExecutionOptions.BuildUp)
121+
{
122+
WorldState.TakeSnapshot(true);
123+
}
173124

125+
return ExecuteCore(transaction, txTracer, options);
126+
}
174127
private TransactionResult ExecuteCore(Transaction tx, ITxTracer tracer, ExecutionOptions opts)
175128
{
176129
if (Logger.IsTrace) Logger.Trace($"Executing tx {tx.Hash}");
@@ -441,7 +394,7 @@ private AuthorizationTupleResult IsValidForExecution(
441394

442395
private static void UpdateMetrics(ExecutionOptions opts, UInt256 effectiveGasPrice)
443396
{
444-
if (opts is ExecutionOptions.Commit or ExecutionOptions.None && (effectiveGasPrice[2] | effectiveGasPrice[3]) == 0)
397+
if (opts is ExecutionOptions.Commit or ExecutionOptions.None or ExecutionOptions.BuildUp && (effectiveGasPrice[2] | effectiveGasPrice[3]) == 0)
445398
{
446399
float gasPrice = (float)((double)effectiveGasPrice / 1_000_000_000.0);
447400

0 commit comments

Comments
 (0)