Skip to content

Commit 0677923

Browse files
authored
disable bal for transaction selection when not activated (#9189)
* disable bal for transaction selection when not activated Signed-off-by: Karim Taam <karim.t2am@gmail.com> * disable bal for block creation and simulator when not activated Signed-off-by: Karim Taam <karim.t2am@gmail.com> * update bal only for selected transaction Signed-off-by: Karim Taam <karim.t2am@gmail.com> * move pending task during block creation before commit for BAL Signed-off-by: Karim Taam <karim.t2am@gmail.com> --------- Signed-off-by: Karim Taam <karim.t2am@gmail.com>
1 parent 3227dd6 commit 0677923

File tree

4 files changed

+97
-25
lines changed

4 files changed

+97
-25
lines changed

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
4848
import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions;
4949
import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor;
50+
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessListFactory;
5051
import org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator;
5152
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessingContext;
5253
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator;
@@ -194,7 +195,10 @@ protected BlockCreationResult createBlock(
194195
final ProtocolSpec newProtocolSpec =
195196
protocolSchedule.getForNextBlockHeader(parentHeader, timestamp);
196197
final boolean includeBlockAccessList =
197-
newProtocolSpec.getBlockAccessListFactory().isPresent();
198+
newProtocolSpec
199+
.getBlockAccessListFactory()
200+
.filter(BlockAccessListFactory::isForkActivated)
201+
.isPresent();
198202

199203
final ProcessableBlockHeader processableBlockHeader =
200204
createPending(

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
4646
import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams;
4747
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessList;
48+
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessListFactory;
4849
import org.hyperledger.besu.ethereum.mainnet.block.access.list.TransactionAccessList;
4950
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
5051
import org.hyperledger.besu.evm.blockhash.BlockHashLookup;
@@ -115,7 +116,7 @@ public class BlockTransactionSelector implements BlockTransactionSelectionServic
115116
private final EthScheduler ethScheduler;
116117
private final AtomicBoolean isTimeout = new AtomicBoolean(false);
117118
private final long blockTxsSelectionMaxTime;
118-
private final BlockAccessList.BlockAccessListBuilder balBuilder;
119+
private final Optional<BlockAccessList.BlockAccessListBuilder> maybeBlockAccessListBuilder;
119120
private WorldUpdater blockWorldStateUpdater;
120121
private WorldUpdater txWorldStateUpdater;
121122
private volatile TransactionEvaluationContext currTxEvaluationContext;
@@ -161,7 +162,12 @@ public BlockTransactionSelector(
161162
blockWorldStateUpdater = worldState.updater();
162163
txWorldStateUpdater = blockWorldStateUpdater.updater();
163164
blockTxsSelectionMaxTime = miningConfiguration.getBlockTxsSelectionMaxTime();
164-
balBuilder = new BlockAccessList.BlockAccessListBuilder();
165+
166+
maybeBlockAccessListBuilder =
167+
protocolSpec
168+
.getBlockAccessListFactory()
169+
.filter(BlockAccessListFactory::isForkActivated)
170+
.map(BlockAccessListFactory::newBlockAccessListBuilder);
165171
}
166172

167173
private List<AbstractTransactionSelector> createTransactionSelectors(
@@ -192,7 +198,10 @@ public TransactionSelectionResults buildTransactionListForBlock() {
192198
.setMessage("Transaction selection result {}")
193199
.addArgument(transactionSelectionResults::toTraceLog)
194200
.log();
195-
transactionSelectionResults.setBlockAccessList(balBuilder.build());
201+
maybeBlockAccessListBuilder.ifPresent(
202+
blockAccessListBuilder -> {
203+
transactionSelectionResults.setBlockAccessList(blockAccessListBuilder.build());
204+
});
196205
return transactionSelectionResults;
197206
}
198207

@@ -294,7 +303,10 @@ public TransactionSelectionResults evaluateTransactions(final List<Transaction>
294303
transactions.forEach(
295304
transaction -> evaluateTransaction(new PendingTransaction.Local.Priority(transaction)));
296305

297-
transactionSelectionResults.setBlockAccessList(balBuilder.build());
306+
maybeBlockAccessListBuilder.ifPresent(
307+
blockAccessListBuilder -> {
308+
transactionSelectionResults.setBlockAccessList(blockAccessListBuilder.build());
309+
});
298310
return transactionSelectionResults;
299311
}
300312

@@ -358,13 +370,13 @@ public boolean commit() {
358370
synchronized (isTimeout) {
359371
isTooLate = isTimeout.get();
360372
if (!isTooLate) {
373+
for (final var pendingAction : selectedTxPendingActions) {
374+
pendingAction.run();
375+
}
361376
selectorsStateManager.commit();
362377
txWorldStateUpdater.commit();
363378
blockWorldStateUpdater.commit();
364379
blockWorldStateUpdater.markTransactionBoundary();
365-
for (final var pendingAction : selectedTxPendingActions) {
366-
pendingAction.run();
367-
}
368380
}
369381
}
370382

@@ -460,21 +472,16 @@ private TransactionProcessingResult processTransaction(final Transaction transac
460472
.createBlockHashLookup(blockchain, blockSelectionContext.pendingBlockHeader());
461473
final TransactionAccessList transactionAccessList =
462474
new TransactionAccessList(currentTxnLocation.get());
463-
final TransactionProcessingResult result =
464-
transactionProcessor.processTransaction(
465-
txWorldStateUpdater,
466-
blockSelectionContext.pendingBlockHeader(),
467-
transaction,
468-
blockSelectionContext.miningBeneficiary(),
469-
operationTracer,
470-
blockHashLookup,
471-
TransactionValidationParams.mining(),
472-
blockSelectionContext.blobGasPrice(),
473-
Optional.of(transactionAccessList));
474-
if (txWorldStateUpdater instanceof StackedUpdater<?, ?> stackedUpdater) {
475-
balBuilder.addTransactionLevelAccessList(transactionAccessList, stackedUpdater);
476-
}
477-
return result;
475+
return transactionProcessor.processTransaction(
476+
txWorldStateUpdater,
477+
blockSelectionContext.pendingBlockHeader(),
478+
transaction,
479+
blockSelectionContext.miningBeneficiary(),
480+
operationTracer,
481+
blockHashLookup,
482+
TransactionValidationParams.mining(),
483+
blockSelectionContext.blobGasPrice(),
484+
Optional.of(transactionAccessList));
478485
}
479486

480487
/**
@@ -505,6 +512,18 @@ private TransactionSelectionResult handleTransactionSelected(
505512
transactionReceiptFactory.create(
506513
transaction.getType(), processingResult, cumulativeGasUsed);
507514

515+
maybeBlockAccessListBuilder.ifPresent(
516+
blockAccessListBuilder ->
517+
processingResult
518+
.getTransactionAccessList()
519+
.ifPresent(
520+
transactionAccessList -> {
521+
if (txWorldStateUpdater
522+
instanceof StackedUpdater<?, ?> stackedUpdater) {
523+
blockAccessListBuilder.addTransactionLevelAccessList(
524+
transactionAccessList, stackedUpdater);
525+
}
526+
}));
508527
transactionSelectionResults.updateSelected(transaction, receipt, gasUsedByTransaction);
509528

510529
notifySelected(evaluationContext, processingResult);

ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor;
7878
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessList;
7979
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessList.AccountChanges;
80+
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessListFactory;
8081
import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor;
8182
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessingContext;
8283
import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext;
@@ -296,9 +297,27 @@ private CreateOn blockCreatorWithBlobGasSupport() {
296297
return createBlockCreator(protocolSpecAdapters);
297298
}
298299

300+
private CreateOn blockCreatorWithBalSupport() {
301+
final var alwaysValidTransactionValidatorFactory = mock(TransactionValidatorFactory.class);
302+
when(alwaysValidTransactionValidatorFactory.get())
303+
.thenReturn(new AlwaysValidTransactionValidator());
304+
final ProtocolSpecAdapters protocolSpecAdapters =
305+
ProtocolSpecAdapters.create(
306+
0,
307+
specBuilder -> {
308+
specBuilder.isReplayProtectionSupported(true);
309+
specBuilder.withdrawalsProcessor(withdrawalsProcessor);
310+
specBuilder.blockAccessListFactory(new BlockAccessListFactory(true, true));
311+
specBuilder.transactionValidatorFactoryBuilder(
312+
(evm, gasLimitCalculator, feeMarket) -> alwaysValidTransactionValidatorFactory);
313+
return specBuilder;
314+
});
315+
return createBlockCreator(protocolSpecAdapters);
316+
}
317+
299318
@Test
300319
public void blockAccessListIncludesAccountChanges() {
301-
final CreateOn miningOn = blockCreatorWithBlobGasSupport();
320+
final CreateOn miningOn = blockCreatorWithBalSupport();
302321
final AbstractBlockCreator blockCreator = miningOn.blockCreator;
303322
final GenesisAccount sender = accounts.get(1);
304323
final GenesisAccount recipient = accounts.get(2);
@@ -345,6 +364,36 @@ public void blockAccessListIncludesAccountChanges() {
345364
assertThat(accountChange3.balanceChanges().get(0).txIndex()).isNotNull();
346365
}
347366

367+
@Test
368+
public void blockAccessListShouldNotIncludesAccountWithoutBalSupport() {
369+
final CreateOn miningOn = blockCreatorWithBlobGasSupport();
370+
final AbstractBlockCreator blockCreator = miningOn.blockCreator;
371+
final GenesisAccount sender = accounts.get(1);
372+
final GenesisAccount recipient = accounts.get(2);
373+
final KeyPair keyPair =
374+
SIGNATURE_ALGORITHM
375+
.get()
376+
.createKeyPair(SECPPrivateKey.create(sender.privateKey(), "ECDSA"));
377+
final BigInteger delta = Wei.fromEth(1).toBigInteger();
378+
final Transaction txn =
379+
new TransactionTestFixture()
380+
.sender(sender.address())
381+
.to(Optional.of(recipient.address()))
382+
.value(Wei.of(delta))
383+
.gasLimit(21_000L)
384+
.nonce(sender.nonce())
385+
.createTransaction(keyPair);
386+
final BlockCreationResult blockCreationResult =
387+
blockCreator.createBlock(
388+
Optional.of(List.of(txn)),
389+
Optional.empty(),
390+
System.currentTimeMillis(),
391+
miningOn.parentHeader);
392+
final Optional<BlockAccessList> maybeBlockAccessList =
393+
blockCreationResult.getTransactionSelectionResults().getBlockAccessList();
394+
assertThat(maybeBlockAccessList).isEmpty();
395+
}
396+
348397
private CreateOn blockCreatorWithWithdrawalsProcessor() {
349398
final ProtocolSpecAdapters protocolSpecAdapters =
350399
ProtocolSpecAdapters.create(

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/BlockSimulator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ protected BlockStateCallSimulationResult processTransactions(
285285
final boolean includeBlockAccessList =
286286
protocolSpec
287287
.getBlockAccessListFactory()
288-
.map(BlockAccessListFactory::isEnabled)
288+
.map(BlockAccessListFactory::isForkActivated)
289289
.orElse(false);
290290

291291
final WorldUpdater blockUpdater = ws.updater();

0 commit comments

Comments
 (0)