Skip to content

Commit 3df20d2

Browse files
flcl42deffrian
andauthored
Use OP tx processor in trace RPC module (#7118)
Co-authored-by: Nikita Mescheryakov <[email protected]>
1 parent 692ed6a commit 3df20d2

40 files changed

+414
-260
lines changed

src/Nethermind/Nethermind.AuRa.Test/Contract/AuRaContractGasLimitOverrideTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Threading.Tasks;
88
using FluentAssertions;
99
using Nethermind.Abi;
10+
using Nethermind.Blockchain;
1011
using Nethermind.Consensus;
1112
using Nethermind.Consensus.AuRa;
1213
using Nethermind.Consensus.AuRa.Contracts;
@@ -85,7 +86,7 @@ protected override BlockProcessor CreateBlockProcessor()
8586
BlockGasLimitContract gasLimitContract = new(AbiEncoder.Instance, blockGasLimitContractTransition.Value, blockGasLimitContractTransition.Key,
8687
new ReadOnlyTxProcessingEnv(
8788
WorldStateManager,
88-
BlockTree, SpecProvider, LimboLogs.Instance));
89+
BlockTree.AsReadOnly(), SpecProvider, LimboLogs.Instance));
8990

9091
GasLimitOverrideCache = new AuRaContractGasLimitOverride.Cache();
9192
GasLimitCalculator = new AuRaContractGasLimitOverride(new[] { gasLimitContract }, GasLimitOverrideCache, false, new FollowOtherMiners(SpecProvider), LimboLogs.Instance);

src/Nethermind/Nethermind.AuRa.Test/Contract/TxPriorityContractTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Threading.Tasks;
1111
using FluentAssertions;
1212
using Nethermind.Abi;
13+
using Nethermind.Blockchain;
1314
using Nethermind.Blockchain.Data;
1415
using Nethermind.Consensus.AuRa.Contracts;
1516
using Nethermind.Consensus.AuRa.Contracts.DataStore;
@@ -254,7 +255,7 @@ protected override TxPoolTxSource CreateTxPoolTxSource()
254255
TxPoolTxSource txPoolTxSource = base.CreateTxPoolTxSource();
255256

256257
TxPriorityContract = new TxPriorityContract(AbiEncoder.Instance, TestItem.AddressA,
257-
new ReadOnlyTxProcessingEnv(WorldStateManager, BlockTree, SpecProvider, LimboLogs.Instance));
258+
new ReadOnlyTxProcessingEnv(WorldStateManager, BlockTree.AsReadOnly(), SpecProvider, LimboLogs.Instance));
258259

259260
Priorities = new DictionaryContractDataStore<TxPriorityContract.Destination>(
260261
new TxPriorityContract.DestinationSortedListContractDataStoreCollection(),

src/Nethermind/Nethermind.AuRa.Test/Transactions/TxCertifierFilterTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using FluentAssertions;
77
using Nethermind.Abi;
88
using Nethermind.AuRa.Test.Contract;
9+
using Nethermind.Blockchain;
910
using Nethermind.Consensus.AuRa;
1011
using Nethermind.Consensus.AuRa.Contracts;
1112
using Nethermind.Consensus.AuRa.Transactions;
@@ -138,7 +139,7 @@ protected override BlockProcessor CreateBlockProcessor()
138139
AbiEncoder abiEncoder = AbiEncoder.Instance;
139140
ReadOnlyTransactionProcessorSource = new ReadOnlyTxProcessingEnv(
140141
WorldStateManager,
141-
BlockTree, SpecProvider,
142+
BlockTree.AsReadOnly(), SpecProvider,
142143
LimboLogs.Instance);
143144
RegisterContract = new RegisterContract(abiEncoder, ChainSpec.Parameters.Registrar, ReadOnlyTransactionProcessorSource);
144145
CertifierContract = new CertifierContract(

src/Nethermind/Nethermind.AuRa.Test/Transactions/TxPermissionFilterTest.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using FluentAssertions;
99
using Nethermind.Abi;
1010
using Nethermind.AuRa.Test.Contract;
11+
using Nethermind.Blockchain;
1112
using Nethermind.Consensus.AuRa;
1213
using Nethermind.Consensus.AuRa.Contracts;
1314
using Nethermind.Consensus.AuRa.Transactions;
@@ -277,12 +278,12 @@ protected override BlockProcessor CreateBlockProcessor()
277278
IReadOnlyTrieStore trieStore = new TrieStore(DbProvider.StateDb, LimboLogs.Instance).AsReadOnly();
278279
IReadOnlyTxProcessorSource txProcessorSource = new ReadOnlyTxProcessingEnv(
279280
WorldStateManager,
280-
BlockTree,
281+
BlockTree.AsReadOnly(),
281282
SpecProvider,
282283
LimboLogs.Instance);
283284

284285
VersionedTransactionPermissionContract transactionPermissionContract = new(AbiEncoder.Instance, _contractAddress, 1,
285-
new ReadOnlyTxProcessingEnv(WorldStateManager, BlockTree, SpecProvider, LimboLogs.Instance), TransactionPermissionContractVersions, LimboLogs.Instance, SpecProvider);
286+
new ReadOnlyTxProcessingEnv(WorldStateManager, BlockTree.AsReadOnly(), SpecProvider, LimboLogs.Instance), TransactionPermissionContractVersions, LimboLogs.Instance, SpecProvider);
286287

287288
TxPermissionFilterCache = new PermissionBasedTxFilter.Cache();
288289
PermissionBasedTxFilter = new PermissionBasedTxFilter(transactionPermissionContract, TxPermissionFilterCache, LimboLogs.Instance);

src/Nethermind/Nethermind.Consensus/Processing/ReadOnlyChainProcessingEnv.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Nethermind.Consensus.Rewards;
88
using Nethermind.Consensus.Validators;
99
using Nethermind.Core.Specs;
10-
using Nethermind.Db;
1110
using Nethermind.Logging;
1211
using Nethermind.State;
1312

@@ -41,7 +40,16 @@ public ReadOnlyChainProcessingEnv(
4140
IBlockProcessor.IBlockTransactionsExecutor transactionsExecutor =
4241
blockTransactionsExecutor ?? new BlockProcessor.BlockValidationTransactionsExecutor(_txEnv.TransactionProcessor, StateProvider);
4342

44-
BlockProcessor = new BlockProcessor(
43+
BlockProcessor = CreateBlockProcessor(txEnv, blockValidator, rewardCalculator, receiptStorage, specProvider, logManager, transactionsExecutor);
44+
45+
_blockProcessingQueue = new BlockchainProcessor(_txEnv.BlockTree, BlockProcessor, recoveryStep, _txEnv.StateReader, logManager, BlockchainProcessor.Options.NoReceipts);
46+
BlockProcessingQueue = _blockProcessingQueue;
47+
ChainProcessor = new OneTimeChainProcessor(txEnv.StateProvider, _blockProcessingQueue);
48+
}
49+
50+
protected virtual IBlockProcessor CreateBlockProcessor(ReadOnlyTxProcessingEnv txEnv, IBlockValidator blockValidator, IRewardCalculator rewardCalculator, IReceiptStorage receiptStorage, ISpecProvider specProvider, ILogManager logManager, IBlockProcessor.IBlockTransactionsExecutor transactionsExecutor)
51+
{
52+
return new BlockProcessor(
4553
specProvider,
4654
blockValidator,
4755
rewardCalculator,
@@ -50,10 +58,6 @@ public ReadOnlyChainProcessingEnv(
5058
receiptStorage,
5159
new BlockhashStore(txEnv.BlockTree, specProvider, StateProvider),
5260
logManager);
53-
54-
_blockProcessingQueue = new BlockchainProcessor(_txEnv.BlockTree, BlockProcessor, recoveryStep, _txEnv.StateReader, logManager, BlockchainProcessor.Options.NoReceipts);
55-
BlockProcessingQueue = _blockProcessingQueue;
56-
ChainProcessor = new OneTimeChainProcessor(txEnv.StateProvider, _blockProcessingQueue);
5761
}
5862

5963
public void Dispose()

src/Nethermind/Nethermind.Consensus/Processing/ReadOnlyTxProcessingEnv.cs

Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,52 +12,48 @@
1212

1313
// ReSharper disable MemberCanBePrivate.Global
1414
// ReSharper disable UnusedAutoPropertyAccessor.Global
15-
namespace Nethermind.Consensus.Processing
15+
namespace Nethermind.Consensus.Processing;
16+
17+
public class ReadOnlyTxProcessingEnv : IReadOnlyTxProcessorSource
1618
{
17-
public class ReadOnlyTxProcessingEnv : IReadOnlyTxProcessorSource
19+
protected readonly ISpecProvider _specProvider;
20+
protected readonly ILogManager? _logManager;
21+
22+
public IStateReader StateReader { get; }
23+
public IWorldState StateProvider { get; }
24+
public ITransactionProcessor TransactionProcessor { get; set; }
25+
public IBlockTree BlockTree { get; }
26+
27+
public ReadOnlyTxProcessingEnv(
28+
IWorldStateManager? worldStateManager,
29+
IReadOnlyBlockTree? readOnlyBlockTree,
30+
ISpecProvider? specProvider,
31+
ILogManager? logManager,
32+
PreBlockCaches? preBlockCaches = null)
33+
{
34+
ArgumentNullException.ThrowIfNull(worldStateManager);
35+
ArgumentNullException.ThrowIfNull(readOnlyBlockTree);
36+
ArgumentNullException.ThrowIfNull(specProvider);
37+
38+
StateReader = worldStateManager.GlobalStateReader;
39+
StateProvider = worldStateManager.CreateResettableWorldState(preBlockCaches);
40+
BlockTree = readOnlyBlockTree;
41+
_specProvider = specProvider;
42+
_logManager = logManager;
43+
TransactionProcessor = CreateTransactionProcessor();
44+
}
45+
46+
protected virtual TransactionProcessor CreateTransactionProcessor()
47+
{
48+
BlockhashProvider blockhashProvider = new(BlockTree, _specProvider, StateProvider, _logManager);
49+
VirtualMachine virtualMachine = new(blockhashProvider, _specProvider, _logManager);
50+
return new TransactionProcessor(_specProvider, StateProvider, virtualMachine, _logManager);
51+
}
52+
53+
public IReadOnlyTransactionProcessor Build(Hash256 stateRoot) => new ReadOnlyTransactionProcessor(TransactionProcessor, StateProvider, stateRoot);
54+
55+
public void Reset()
1856
{
19-
public IStateReader StateReader { get; }
20-
public IWorldState StateProvider { get; }
21-
public ITransactionProcessor TransactionProcessor { get; set; }
22-
public IBlockTree BlockTree { get; }
23-
public IBlockhashProvider BlockhashProvider { get; }
24-
public IVirtualMachine Machine { get; }
25-
public ISpecProvider SpecProvider { get; }
26-
27-
public ReadOnlyTxProcessingEnv(
28-
IWorldStateManager worldStateManager,
29-
IBlockTree? blockTree,
30-
ISpecProvider? specProvider,
31-
ILogManager? logManager)
32-
: this(worldStateManager, blockTree?.AsReadOnly(), specProvider, logManager)
33-
{
34-
}
35-
36-
public ReadOnlyTxProcessingEnv(
37-
IWorldStateManager worldStateManager,
38-
IReadOnlyBlockTree? readOnlyBlockTree,
39-
ISpecProvider? specProvider,
40-
ILogManager? logManager,
41-
PreBlockCaches? preBlockCaches = null)
42-
{
43-
ArgumentNullException.ThrowIfNull(specProvider);
44-
ArgumentNullException.ThrowIfNull(worldStateManager);
45-
SpecProvider = specProvider;
46-
StateReader = worldStateManager.GlobalStateReader;
47-
StateProvider = worldStateManager.CreateResettableWorldState(preBlockCaches);
48-
49-
BlockTree = readOnlyBlockTree ?? throw new ArgumentNullException(nameof(readOnlyBlockTree));
50-
BlockhashProvider = new BlockhashProvider(BlockTree, specProvider, StateProvider, logManager);
51-
52-
Machine = new VirtualMachine(BlockhashProvider, specProvider, logManager);
53-
TransactionProcessor = new TransactionProcessor(specProvider, StateProvider, Machine, logManager);
54-
}
55-
56-
public IReadOnlyTransactionProcessor Build(Hash256 stateRoot) => new ReadOnlyTransactionProcessor(TransactionProcessor, StateProvider, stateRoot);
57-
58-
public void Reset()
59-
{
60-
StateProvider.Reset();
61-
}
57+
StateProvider.Reset();
6258
}
6359
}

src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,7 @@ public virtual async Task Execute(CancellationToken cancellationToken)
114114
_api.LogManager);
115115
rpcModuleProvider.RegisterBoundedByCpuCount(debugModuleFactory, _jsonRpcConfig.Timeout);
116116

117-
TraceModuleFactory traceModuleFactory = new(
118-
_api.WorldStateManager,
119-
_api.BlockTree,
120-
_jsonRpcConfig,
121-
_api.BlockPreprocessor,
122-
_api.RewardCalculatorSource,
123-
_api.ReceiptStorage,
124-
_api.SpecProvider,
125-
_api.PoSSwitcher,
126-
_api.LogManager);
127-
128-
rpcModuleProvider.RegisterBoundedByCpuCount(traceModuleFactory, _jsonRpcConfig.Timeout);
117+
RegisterTraceRpcModule(rpcModuleProvider);
129118

130119
StepDependencyException.ThrowIfNull(_api.EthereumEcdsa);
131120

@@ -249,4 +238,31 @@ protected virtual void RegisterEthRpcModule(IRpcModuleProvider rpcModuleProvider
249238
rpcModuleProvider.RegisterBounded(ethModuleFactory,
250239
_jsonRpcConfig.EthModuleConcurrentInstances ?? Environment.ProcessorCount, _jsonRpcConfig.Timeout);
251240
}
241+
242+
protected ModuleFactoryBase<ITraceRpcModule> CreateTraceModuleFactory()
243+
{
244+
StepDependencyException.ThrowIfNull(_api.WorldStateManager);
245+
StepDependencyException.ThrowIfNull(_api.BlockTree);
246+
StepDependencyException.ThrowIfNull(_api.RewardCalculatorSource);
247+
StepDependencyException.ThrowIfNull(_api.ReceiptStorage);
248+
StepDependencyException.ThrowIfNull(_api.SpecProvider);
249+
250+
return new TraceModuleFactory(
251+
_api.WorldStateManager,
252+
_api.BlockTree,
253+
_jsonRpcConfig,
254+
_api.BlockPreprocessor,
255+
_api.RewardCalculatorSource,
256+
_api.ReceiptStorage,
257+
_api.SpecProvider,
258+
_api.PoSSwitcher,
259+
_api.LogManager);
260+
}
261+
262+
protected virtual void RegisterTraceRpcModule(IRpcModuleProvider rpcModuleProvider)
263+
{
264+
ModuleFactoryBase<ITraceRpcModule> traceModuleFactory = CreateTraceModuleFactory();
265+
266+
rpcModuleProvider.RegisterBoundedByCpuCount(traceModuleFactory, _jsonRpcConfig.Timeout);
267+
}
252268
}

src/Nethermind/Nethermind.Init/Steps/StepInitializationException.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public StepDependencyException(string message)
1818
{
1919
}
2020

21-
public static void ThrowIfNull([NotNull] object? argument, [CallerArgumentExpression("argument")] string? paramName = null)
21+
public static void ThrowIfNull([NotNull] object? argument, [CallerArgumentExpression(nameof(argument))] string? paramName = null)
2222
{
2323
if (argument is not null)
2424
return;

src/Nethermind/Nethermind.JsonRpc.Test/Modules/Trace/ParityStyleTracerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,15 @@ public void Setup()
9393
[Test]
9494
public void Can_trace_raw_parity_style()
9595
{
96-
TraceRpcModule traceRpcModule = new(NullReceiptStorage.Instance, _tracer, _blockTree, _jsonRpcConfig, MainnetSpecProvider.Instance, LimboLogs.Instance, _stateReader);
96+
TraceRpcModule traceRpcModule = new(NullReceiptStorage.Instance, _tracer, _blockTree, _jsonRpcConfig, _stateReader);
9797
ResultWrapper<ParityTxTraceFromReplay> result = traceRpcModule.trace_rawTransaction(Bytes.FromHexString("f889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215f"), new[] { "trace" });
9898
Assert.NotNull(result.Data);
9999
}
100100

101101
[Test]
102102
public void Can_trace_raw_parity_style_berlin_tx()
103103
{
104-
TraceRpcModule traceRpcModule = new(NullReceiptStorage.Instance, _tracer, _blockTree, _jsonRpcConfig, MainnetSpecProvider.Instance, LimboLogs.Instance, _stateReader);
104+
TraceRpcModule traceRpcModule = new(NullReceiptStorage.Instance, _tracer, _blockTree, _jsonRpcConfig, _stateReader);
105105
ResultWrapper<ParityTxTraceFromReplay> result = traceRpcModule.trace_rawTransaction(Bytes.FromHexString("01f85b821e8e8204d7847735940083030d408080853a60005500c080a0f43e70c79190701347517e283ef63753f6143a5225cbb500b14d98eadfb7616ba070893923d8a1fc97499f426524f9e82f8e0322dfac7c3d7e8a9eee515f0bcdc4"), new[] { "trace" });
106106
Assert.NotNull(result.Data);
107107
}
@@ -114,7 +114,7 @@ public void Should_return_correct_block_reward(bool isPostMerge)
114114
_blockTree!.SuggestBlock(block).Should().Be(AddBlockResult.Added);
115115
_poSSwitcher!.IsPostMerge(Arg.Any<BlockHeader>()).Returns(isPostMerge);
116116

117-
TraceRpcModule traceRpcModule = new(NullReceiptStorage.Instance, _tracer, _blockTree, _jsonRpcConfig, MainnetSpecProvider.Instance, LimboLogs.Instance, _stateReader);
117+
TraceRpcModule traceRpcModule = new(NullReceiptStorage.Instance, _tracer, _blockTree, _jsonRpcConfig, _stateReader);
118118
ParityTxTraceFromStore[] result = traceRpcModule.trace_block(new BlockParameter(block.Number)).Data.ToArray();
119119
if (isPostMerge)
120120
{

src/Nethermind/Nethermind.JsonRpc.Test/Modules/TraceRpcModuleTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public async Task Build(ISpecProvider? specProvider = null, bool isAura = false)
7272
ReadOnlyChainProcessingEnv executeProcessingEnv = CreateChainProcessingEnv(executeBlockTransactionsExecutor);
7373

7474
Tracer tracer = new(txProcessingEnv.StateProvider, traceProcessingEnv.ChainProcessor, executeProcessingEnv.ChainProcessor);
75-
TraceRpcModule = new TraceRpcModule(receiptFinder, tracer, Blockchain.BlockFinder, JsonRpcConfig, MainnetSpecProvider.Instance, LimboLogs.Instance, txProcessingEnv.StateReader);
75+
TraceRpcModule = new TraceRpcModule(receiptFinder, tracer, Blockchain.BlockFinder, JsonRpcConfig, txProcessingEnv.StateReader);
7676

7777
for (int i = 1; i < 10; i++)
7878
{

0 commit comments

Comments
 (0)