2828import org .hyperledger .besu .cryptoservices .KeyPairSecurityModule ;
2929import org .hyperledger .besu .cryptoservices .NodeKey ;
3030import org .hyperledger .besu .ethereum .GasLimitCalculator ;
31+ import org .hyperledger .besu .ethereum .api .ApiConfiguration ;
3132import org .hyperledger .besu .ethereum .api .graphql .GraphQLConfiguration ;
3233import org .hyperledger .besu .ethereum .core .ImmutableMiningParameters ;
3334import org .hyperledger .besu .ethereum .eth .EthProtocolConfiguration ;
3738import org .hyperledger .besu .ethereum .p2p .peers .EnodeURLImpl ;
3839import org .hyperledger .besu .ethereum .storage .keyvalue .KeyValueStorageProvider ;
3940import org .hyperledger .besu .ethereum .storage .keyvalue .KeyValueStorageProviderBuilder ;
41+ import org .hyperledger .besu .ethereum .transaction .TransactionSimulator ;
4042import org .hyperledger .besu .ethereum .worldstate .DataStorageConfiguration ;
4143import org .hyperledger .besu .evm .internal .EvmConfiguration ;
4244import org .hyperledger .besu .metrics .MetricsSystemFactory ;
4345import org .hyperledger .besu .metrics .ObservableMetricsSystem ;
4446import org .hyperledger .besu .plugin .data .EnodeURL ;
4547import org .hyperledger .besu .plugin .services .BesuConfiguration ;
4648import org .hyperledger .besu .plugin .services .BesuEvents ;
49+ import org .hyperledger .besu .plugin .services .BlockchainService ;
4750import org .hyperledger .besu .plugin .services .PicoCLIOptions ;
4851import org .hyperledger .besu .plugin .services .RpcEndpointService ;
4952import org .hyperledger .besu .plugin .services .SecurityModuleService ;
5053import org .hyperledger .besu .plugin .services .StorageService ;
5154import org .hyperledger .besu .plugin .services .TransactionPoolValidatorService ;
5255import org .hyperledger .besu .plugin .services .TransactionSelectionService ;
56+ import org .hyperledger .besu .plugin .services .TransactionSimulationService ;
5357import org .hyperledger .besu .plugin .services .storage .rocksdb .RocksDBPlugin ;
5458import org .hyperledger .besu .services .BesuConfigurationImpl ;
5559import org .hyperledger .besu .services .BesuEventsImpl ;
5660import org .hyperledger .besu .services .BesuPluginContextImpl ;
61+ import org .hyperledger .besu .services .BlockchainServiceImpl ;
5762import org .hyperledger .besu .services .PermissioningServiceImpl ;
5863import org .hyperledger .besu .services .PicoCLIOptionsImpl ;
5964import org .hyperledger .besu .services .RpcEndpointServiceImpl ;
6065import org .hyperledger .besu .services .SecurityModuleServiceImpl ;
6166import org .hyperledger .besu .services .StorageServiceImpl ;
6267import org .hyperledger .besu .services .TransactionPoolValidatorServiceImpl ;
6368import org .hyperledger .besu .services .TransactionSelectionServiceImpl ;
69+ import org .hyperledger .besu .services .TransactionSimulationServiceImpl ;
6470
6571import java .io .File ;
6672import java .nio .file .Path ;
@@ -92,18 +98,27 @@ private BesuPluginContextImpl buildPluginContext(
9298 final BesuNode node ,
9399 final StorageServiceImpl storageService ,
94100 final SecurityModuleServiceImpl securityModuleService ,
101+ final TransactionSimulationServiceImpl transactionSimulationServiceImpl ,
95102 final TransactionSelectionServiceImpl transactionSelectionServiceImpl ,
103+ final TransactionPoolValidatorServiceImpl transactionPoolValidatorServiceImpl ,
104+ final BlockchainServiceImpl blockchainServiceImpl ,
105+ final RpcEndpointServiceImpl rpcEndpointServiceImpl ,
96106 final BesuConfiguration commonPluginConfiguration ) {
97107 final CommandLine commandLine = new CommandLine (CommandSpec .create ());
98108 final BesuPluginContextImpl besuPluginContext = new BesuPluginContextImpl ();
99109 besuPluginContext .addService (StorageService .class , storageService );
100110 besuPluginContext .addService (SecurityModuleService .class , securityModuleService );
101111 besuPluginContext .addService (PicoCLIOptions .class , new PicoCLIOptionsImpl (commandLine ));
102- besuPluginContext .addService (RpcEndpointService .class , new RpcEndpointServiceImpl () );
112+ besuPluginContext .addService (RpcEndpointService .class , rpcEndpointServiceImpl );
103113 besuPluginContext .addService (
104114 TransactionSelectionService .class , transactionSelectionServiceImpl );
105115 besuPluginContext .addService (
106- TransactionPoolValidatorService .class , new TransactionPoolValidatorServiceImpl ());
116+ TransactionPoolValidatorService .class , transactionPoolValidatorServiceImpl );
117+ besuPluginContext .addService (
118+ TransactionSimulationService .class , transactionSimulationServiceImpl );
119+ besuPluginContext .addService (BlockchainService .class , blockchainServiceImpl );
120+ besuPluginContext .addService (BesuConfiguration .class , commonPluginConfiguration );
121+
107122 final Path pluginsPath ;
108123 final String pluginDir = System .getProperty ("besu.plugins.dir" );
109124 if (pluginDir == null || pluginDir .isEmpty ()) {
@@ -120,9 +135,6 @@ private BesuPluginContextImpl buildPluginContext(
120135 besuPluginContext .registerPlugins (pluginsPath );
121136
122137 commandLine .parseArgs (node .getConfiguration ().getExtraCLIOptions ().toArray (new String [0 ]));
123-
124- besuPluginContext .addService (BesuConfiguration .class , commonPluginConfiguration );
125-
126138 // register built-in plugins
127139 new RocksDBPlugin ().register (besuPluginContext );
128140
@@ -143,8 +155,14 @@ public void startNode(final BesuNode node) {
143155
144156 final StorageServiceImpl storageService = new StorageServiceImpl ();
145157 final SecurityModuleServiceImpl securityModuleService = new SecurityModuleServiceImpl ();
158+ final TransactionSimulationServiceImpl transactionSimulationServiceImpl =
159+ new TransactionSimulationServiceImpl ();
146160 final TransactionSelectionServiceImpl transactionSelectionServiceImpl =
147161 new TransactionSelectionServiceImpl ();
162+ final TransactionPoolValidatorServiceImpl transactionPoolValidatorServiceImpl =
163+ new TransactionPoolValidatorServiceImpl ();
164+ final BlockchainServiceImpl blockchainServiceImpl = new BlockchainServiceImpl ();
165+ final RpcEndpointServiceImpl rpcEndpointServiceImpl = new RpcEndpointServiceImpl ();
148166 final Path dataDir = node .homeDirectory ();
149167 final BesuConfigurationImpl commonPluginConfiguration = new BesuConfigurationImpl ();
150168 final var miningParameters =
@@ -165,7 +183,11 @@ public void startNode(final BesuNode node) {
165183 node ,
166184 storageService ,
167185 securityModuleService ,
186+ transactionSimulationServiceImpl ,
168187 transactionSelectionServiceImpl ,
188+ transactionPoolValidatorServiceImpl ,
189+ blockchainServiceImpl ,
190+ rpcEndpointServiceImpl ,
169191 commonPluginConfiguration ));
170192
171193 GlobalOpenTelemetry .resetForTest ();
@@ -199,6 +221,7 @@ public void startNode(final BesuNode node) {
199221 ImmutableTransactionPoolConfiguration .builder ()
200222 .from (node .getTransactionPoolConfiguration ())
201223 .strictTransactionReplayProtectionEnabled (node .isStrictTxReplayProtectionEnabled ())
224+ .transactionPoolValidatorService (transactionPoolValidatorServiceImpl )
202225 .build ();
203226
204227 final int maxPeers = 25 ;
@@ -232,6 +255,10 @@ public void startNode(final BesuNode node) {
232255
233256 final BesuController besuController = builder .build ();
234257
258+ initTransactionSimulationService (
259+ transactionSimulationServiceImpl , besuController , node .getApiConfiguration ());
260+ initBlockchainService (blockchainServiceImpl , besuController );
261+
235262 final RunnerBuilder runnerBuilder = new RunnerBuilder ();
236263 runnerBuilder .permissioningConfiguration (node .getPermissioningConfiguration ());
237264 runnerBuilder .apiConfiguration (node .getApiConfiguration ());
@@ -261,7 +288,7 @@ public void startNode(final BesuNode node) {
261288 .besuPluginContext (new BesuPluginContextImpl ())
262289 .autoLogBloomCaching (false )
263290 .storageProvider (storageProvider )
264- .rpcEndpointService (new RpcEndpointServiceImpl () );
291+ .rpcEndpointService (rpcEndpointServiceImpl );
265292 node .engineRpcConfiguration ().ifPresent (runnerBuilder ::engineJsonRpcConfiguration );
266293
267294 final Runner runner = runnerBuilder .build ();
@@ -285,6 +312,25 @@ public void startNode(final BesuNode node) {
285312 MDC .remove ("node" );
286313 }
287314
315+ private void initBlockchainService (
316+ final BlockchainServiceImpl blockchainServiceImpl , final BesuController besuController ) {
317+ blockchainServiceImpl .init (
318+ besuController .getProtocolContext (), besuController .getProtocolSchedule ());
319+ }
320+
321+ private void initTransactionSimulationService (
322+ final TransactionSimulationServiceImpl transactionSimulationService ,
323+ final BesuController besuController ,
324+ final ApiConfiguration apiConfiguration ) {
325+ transactionSimulationService .init (
326+ besuController .getProtocolContext ().getBlockchain (),
327+ new TransactionSimulator (
328+ besuController .getProtocolContext ().getBlockchain (),
329+ besuController .getProtocolContext ().getWorldStateArchive (),
330+ besuController .getProtocolSchedule (),
331+ apiConfiguration .getGasCap ()));
332+ }
333+
288334 @ Override
289335 public void stopNode (final BesuNode node ) {
290336 final BesuPluginContextImpl pluginContext = besuPluginContextMap .remove (node );
0 commit comments