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 .PermissioningService ;
4851import org .hyperledger .besu .plugin .services .PicoCLIOptions ;
4952import org .hyperledger .besu .plugin .services .PrivacyPluginService ;
5255import org .hyperledger .besu .plugin .services .StorageService ;
5356import org .hyperledger .besu .plugin .services .TransactionPoolValidatorService ;
5457import org .hyperledger .besu .plugin .services .TransactionSelectionService ;
58+ import org .hyperledger .besu .plugin .services .TransactionSimulationService ;
5559import org .hyperledger .besu .plugin .services .storage .rocksdb .RocksDBPlugin ;
5660import org .hyperledger .besu .services .BesuConfigurationImpl ;
5761import org .hyperledger .besu .services .BesuEventsImpl ;
5862import org .hyperledger .besu .services .BesuPluginContextImpl ;
63+ import org .hyperledger .besu .services .BlockchainServiceImpl ;
5964import org .hyperledger .besu .services .PermissioningServiceImpl ;
6065import org .hyperledger .besu .services .PicoCLIOptionsImpl ;
6166import org .hyperledger .besu .services .PrivacyPluginServiceImpl ;
6469import org .hyperledger .besu .services .StorageServiceImpl ;
6570import org .hyperledger .besu .services .TransactionPoolValidatorServiceImpl ;
6671import org .hyperledger .besu .services .TransactionSelectionServiceImpl ;
72+ import org .hyperledger .besu .services .TransactionSimulationServiceImpl ;
6773
6874import java .io .File ;
6975import java .nio .file .Path ;
@@ -95,18 +101,27 @@ private BesuPluginContextImpl buildPluginContext(
95101 final BesuNode node ,
96102 final StorageServiceImpl storageService ,
97103 final SecurityModuleServiceImpl securityModuleService ,
104+ final TransactionSimulationServiceImpl transactionSimulationServiceImpl ,
98105 final TransactionSelectionServiceImpl transactionSelectionServiceImpl ,
106+ final TransactionPoolValidatorServiceImpl transactionPoolValidatorServiceImpl ,
107+ final BlockchainServiceImpl blockchainServiceImpl ,
108+ final RpcEndpointServiceImpl rpcEndpointServiceImpl ,
99109 final BesuConfiguration commonPluginConfiguration ) {
100110 final CommandLine commandLine = new CommandLine (CommandSpec .create ());
101111 final BesuPluginContextImpl besuPluginContext = new BesuPluginContextImpl ();
102112 besuPluginContext .addService (StorageService .class , storageService );
103113 besuPluginContext .addService (SecurityModuleService .class , securityModuleService );
104114 besuPluginContext .addService (PicoCLIOptions .class , new PicoCLIOptionsImpl (commandLine ));
105- besuPluginContext .addService (RpcEndpointService .class , new RpcEndpointServiceImpl () );
115+ besuPluginContext .addService (RpcEndpointService .class , rpcEndpointServiceImpl );
106116 besuPluginContext .addService (
107117 TransactionSelectionService .class , transactionSelectionServiceImpl );
108118 besuPluginContext .addService (
109- TransactionPoolValidatorService .class , new TransactionPoolValidatorServiceImpl ());
119+ TransactionPoolValidatorService .class , transactionPoolValidatorServiceImpl );
120+ besuPluginContext .addService (
121+ TransactionSimulationService .class , transactionSimulationServiceImpl );
122+ besuPluginContext .addService (BlockchainService .class , blockchainServiceImpl );
123+ besuPluginContext .addService (BesuConfiguration .class , commonPluginConfiguration );
124+
110125 final Path pluginsPath ;
111126 final String pluginDir = System .getProperty ("besu.plugins.dir" );
112127 if (pluginDir == null || pluginDir .isEmpty ()) {
@@ -147,8 +162,14 @@ public void startNode(final BesuNode node) {
147162
148163 final StorageServiceImpl storageService = new StorageServiceImpl ();
149164 final SecurityModuleServiceImpl securityModuleService = new SecurityModuleServiceImpl ();
165+ final TransactionSimulationServiceImpl transactionSimulationServiceImpl =
166+ new TransactionSimulationServiceImpl ();
150167 final TransactionSelectionServiceImpl transactionSelectionServiceImpl =
151168 new TransactionSelectionServiceImpl ();
169+ final TransactionPoolValidatorServiceImpl transactionPoolValidatorServiceImpl =
170+ new TransactionPoolValidatorServiceImpl ();
171+ final BlockchainServiceImpl blockchainServiceImpl = new BlockchainServiceImpl ();
172+ final RpcEndpointServiceImpl rpcEndpointServiceImpl = new RpcEndpointServiceImpl ();
152173 final Path dataDir = node .homeDirectory ();
153174 final BesuConfigurationImpl commonPluginConfiguration = new BesuConfigurationImpl ();
154175 final var miningParameters =
@@ -169,7 +190,11 @@ public void startNode(final BesuNode node) {
169190 node ,
170191 storageService ,
171192 securityModuleService ,
193+ transactionSimulationServiceImpl ,
172194 transactionSelectionServiceImpl ,
195+ transactionPoolValidatorServiceImpl ,
196+ blockchainServiceImpl ,
197+ rpcEndpointServiceImpl ,
173198 commonPluginConfiguration ));
174199
175200 GlobalOpenTelemetry .resetForTest ();
@@ -203,6 +228,7 @@ public void startNode(final BesuNode node) {
203228 ImmutableTransactionPoolConfiguration .builder ()
204229 .from (node .getTransactionPoolConfiguration ())
205230 .strictTransactionReplayProtectionEnabled (node .isStrictTxReplayProtectionEnabled ())
231+ .transactionPoolValidatorService (transactionPoolValidatorServiceImpl )
206232 .build ();
207233
208234 final int maxPeers = 25 ;
@@ -236,6 +262,10 @@ public void startNode(final BesuNode node) {
236262
237263 final BesuController besuController = builder .build ();
238264
265+ initTransactionSimulationService (
266+ transactionSimulationServiceImpl , besuController , node .getApiConfiguration ());
267+ initBlockchainService (blockchainServiceImpl , besuController );
268+
239269 final RunnerBuilder runnerBuilder = new RunnerBuilder ();
240270 runnerBuilder .permissioningConfiguration (node .getPermissioningConfiguration ());
241271 runnerBuilder .apiConfiguration (node .getApiConfiguration ());
@@ -265,7 +295,7 @@ public void startNode(final BesuNode node) {
265295 .besuPluginContext (new BesuPluginContextImpl ())
266296 .autoLogBloomCaching (false )
267297 .storageProvider (storageProvider )
268- .rpcEndpointService (new RpcEndpointServiceImpl () );
298+ .rpcEndpointService (rpcEndpointServiceImpl );
269299 node .engineRpcConfiguration ().ifPresent (runnerBuilder ::engineJsonRpcConfiguration );
270300
271301 final Runner runner = runnerBuilder .build ();
@@ -289,6 +319,25 @@ public void startNode(final BesuNode node) {
289319 MDC .remove ("node" );
290320 }
291321
322+ private void initBlockchainService (
323+ final BlockchainServiceImpl blockchainServiceImpl , final BesuController besuController ) {
324+ blockchainServiceImpl .init (
325+ besuController .getProtocolContext (), besuController .getProtocolSchedule ());
326+ }
327+
328+ private void initTransactionSimulationService (
329+ final TransactionSimulationServiceImpl transactionSimulationService ,
330+ final BesuController besuController ,
331+ final ApiConfiguration apiConfiguration ) {
332+ transactionSimulationService .init (
333+ besuController .getProtocolContext ().getBlockchain (),
334+ new TransactionSimulator (
335+ besuController .getProtocolContext ().getBlockchain (),
336+ besuController .getProtocolContext ().getWorldStateArchive (),
337+ besuController .getProtocolSchedule (),
338+ apiConfiguration .getGasCap ()));
339+ }
340+
292341 @ Override
293342 public void stopNode (final BesuNode node ) {
294343 final BesuPluginContextImpl pluginContext = besuPluginContextMap .remove (node );
0 commit comments