Skip to content

Commit 65f8880

Browse files
authored
Make block txs selection max time aware of PoA transitions (#6676)
Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
1 parent 246cce4 commit 65f8880

File tree

15 files changed

+627
-161
lines changed

15 files changed

+627
-161
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
- Transaction call object to accept both `input` and `data` field simultaneously if they are set to equal values [#6702](https://github.com/hyperledger/besu/pull/6702)
2525

2626
### Bug fixes
27+
- Make block transaction selection max time aware of PoA transitions [#6676](https://github.com/hyperledger/besu/pull/6676)
2728

2829
### Download Links
2930

besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,10 +2149,10 @@ private TransactionPoolConfiguration buildTransactionPoolConfiguration() {
21492149

21502150
private MiningParameters getMiningParameters() {
21512151
if (miningParameters == null) {
2152-
miningOptions.setGenesisBlockPeriodSeconds(
2153-
getGenesisBlockPeriodSeconds(getActualGenesisConfigOptions()));
21542152
miningOptions.setTransactionSelectionService(transactionSelectionServiceImpl);
21552153
miningParameters = miningOptions.toDomainObject();
2154+
getGenesisBlockPeriodSeconds(getActualGenesisConfigOptions())
2155+
.ifPresent(miningParameters::setBlockPeriodSeconds);
21562156
initMiningParametersMetrics(miningParameters);
21572157
}
21582158
return miningParameters;

besu/src/main/java/org/hyperledger/besu/cli/options/MiningOptions.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.hyperledger.besu.util.number.PositiveNumber;
4343

4444
import java.util.List;
45-
import java.util.OptionalInt;
4645

4746
import org.apache.tuweni.bytes.Bytes;
4847
import org.slf4j.Logger;
@@ -191,7 +190,6 @@ static class Unstable {
191190
DEFAULT_POS_BLOCK_CREATION_REPETITION_MIN_DURATION;
192191
}
193192

194-
private OptionalInt maybeGenesisBlockPeriodSeconds;
195193
private TransactionSelectionService transactionSelectionService;
196194

197195
private MiningOptions() {}
@@ -205,16 +203,6 @@ public static MiningOptions create() {
205203
return new MiningOptions();
206204
}
207205

208-
/**
209-
* Set the optional genesis block period per seconds
210-
*
211-
* @param genesisBlockPeriodSeconds if the network is PoA then the block period in seconds
212-
* specified in the genesis file, otherwise empty.
213-
*/
214-
public void setGenesisBlockPeriodSeconds(final OptionalInt genesisBlockPeriodSeconds) {
215-
maybeGenesisBlockPeriodSeconds = genesisBlockPeriodSeconds;
216-
}
217-
218206
/**
219207
* Set the transaction selection service
220208
*
@@ -311,7 +299,6 @@ public void validate(
311299

312300
static MiningOptions fromConfig(final MiningParameters miningParameters) {
313301
final MiningOptions miningOptions = MiningOptions.create();
314-
miningOptions.setGenesisBlockPeriodSeconds(miningParameters.getGenesisBlockPeriodSeconds());
315302
miningOptions.setTransactionSelectionService(miningParameters.getTransactionSelectionService());
316303
miningOptions.isMiningEnabled = miningParameters.isMiningEnabled();
317304
miningOptions.iStratumMiningEnabled = miningParameters.isStratumMiningEnabled();
@@ -347,9 +334,6 @@ static MiningOptions fromConfig(final MiningParameters miningParameters) {
347334

348335
@Override
349336
public MiningParameters toDomainObject() {
350-
checkNotNull(
351-
maybeGenesisBlockPeriodSeconds,
352-
"genesisBlockPeriodSeconds must be set before using this object");
353337
checkNotNull(
354338
transactionSelectionService,
355339
"transactionSelectionService must be set before using this object");
@@ -370,7 +354,6 @@ public MiningParameters toDomainObject() {
370354
}
371355

372356
return ImmutableMiningParameters.builder()
373-
.genesisBlockPeriodSeconds(maybeGenesisBlockPeriodSeconds)
374357
.transactionSelectionService(transactionSelectionService)
375358
.mutableInitValues(updatableInitValuesBuilder.build())
376359
.isStratumMiningEnabled(iStratumMiningEnabled)

besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,18 @@ protected MiningCoordinator createMiningCoordinator(
102102
miningExecutor,
103103
syncState,
104104
new CliqueMiningTracker(localAddress, protocolContext));
105+
106+
// Update the next block period in seconds according to the transition schedule
107+
protocolContext
108+
.getBlockchain()
109+
.observeBlockAdded(
110+
o ->
111+
miningParameters.setBlockPeriodSeconds(
112+
forksSchedule
113+
.getFork(o.getBlock().getHeader().getNumber() + 1)
114+
.getValue()
115+
.getBlockPeriodSeconds()));
116+
105117
miningCoordinator.addMinedBlockObserver(ethProtocolManager);
106118

107119
// Clique mining is implicitly enabled.

besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,17 @@ protected MiningCoordinator createMiningCoordinator(
234234
blockchain,
235235
bftEventQueue);
236236

237+
// Update the next block period in seconds according to the transition schedule
238+
protocolContext
239+
.getBlockchain()
240+
.observeBlockAdded(
241+
o ->
242+
miningParameters.setBlockPeriodSeconds(
243+
forksSchedule
244+
.getFork(o.getBlock().getHeader().getNumber() + 1)
245+
.getValue()
246+
.getBlockPeriodSeconds()));
247+
237248
if (syncState.isInitialSyncPhaseDone()) {
238249
LOG.info("Starting IBFT mining coordinator");
239250
ibftMiningCoordinator.enable();

besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,17 @@ protected MiningCoordinator createMiningCoordinator(
274274
blockchain,
275275
bftEventQueue);
276276

277+
// Update the next block period in seconds according to the transition schedule
278+
protocolContext
279+
.getBlockchain()
280+
.observeBlockAdded(
281+
o ->
282+
miningParameters.setBlockPeriodSeconds(
283+
qbftForksSchedule
284+
.getFork(o.getBlock().getHeader().getNumber() + 1)
285+
.getValue()
286+
.getBlockPeriodSeconds()));
287+
277288
if (syncState.isInitialSyncPhaseDone()) {
278289
LOG.info("Starting QBFT mining coordinator");
279290
miningCoordinator.enable();

besu/src/test/java/org/hyperledger/besu/cli/options/AbstractCLIOptionsTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.util.Collections;
2424
import java.util.List;
25+
import java.util.function.BiFunction;
2526
import java.util.function.Consumer;
2627

2728
import org.junit.jupiter.api.Test;
@@ -113,10 +114,18 @@ protected List<String> getFieldsToIgnore() {
113114
protected abstract T getOptionsFromBesuCommand(final TestBesuCommand besuCommand);
114115

115116
protected void internalTestSuccess(final Consumer<D> assertion, final String... args) {
117+
internalTestSuccess((bc, conf) -> conf, assertion, args);
118+
}
119+
120+
protected void internalTestSuccess(
121+
final BiFunction<TestBesuCommand, D, D> runtimeConf,
122+
final Consumer<D> assertion,
123+
final String... args) {
116124
final TestBesuCommand cmd = parseCommand(args);
117125

118126
final T options = getOptionsFromBesuCommand(cmd);
119-
final D config = options.toDomainObject();
127+
final D config = runtimeConf.apply(cmd, options.toDomainObject());
128+
120129
assertion.accept(config);
121130

122131
assertThat(commandOutput.toString(UTF_8)).isEmpty();

besu/src/test/java/org/hyperledger/besu/cli/options/MiningOptionsTest.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import java.nio.file.Path;
3535
import java.time.Duration;
3636
import java.util.Optional;
37-
import java.util.OptionalInt;
3837

3938
import org.apache.tuweni.bytes.Bytes;
4039
import org.junit.jupiter.api.Test;
@@ -316,6 +315,7 @@ public void posBlockCreationMaxTimeOutOfAllowedRange() {
316315
@Test
317316
public void blockTxsSelectionMaxTimeDefaultValue() {
318317
internalTestSuccess(
318+
this::runtimeConfiguration,
319319
miningParams ->
320320
assertThat(miningParams.getNonPoaBlockTxsSelectionMaxTime())
321321
.isEqualTo(DEFAULT_NON_POA_BLOCK_TXS_SELECTION_MAX_TIME));
@@ -324,6 +324,7 @@ public void blockTxsSelectionMaxTimeDefaultValue() {
324324
@Test
325325
public void blockTxsSelectionMaxTimeOption() {
326326
internalTestSuccess(
327+
this::runtimeConfiguration,
327328
miningParams -> assertThat(miningParams.getBlockTxsSelectionMaxTime()).isEqualTo(1700L),
328329
"--block-txs-selection-max-time",
329330
"1700");
@@ -343,6 +344,7 @@ public void blockTxsSelectionMaxTimeIncompatibleWithPoaNetworks() throws IOExcep
343344
@Test
344345
public void poaBlockTxsSelectionMaxTimeDefaultValue() {
345346
internalTestSuccess(
347+
this::runtimeConfiguration,
346348
miningParams ->
347349
assertThat(miningParams.getPoaBlockTxsSelectionMaxTime())
348350
.isEqualTo(DEFAULT_POA_BLOCK_TXS_SELECTION_MAX_TIME));
@@ -352,6 +354,7 @@ public void poaBlockTxsSelectionMaxTimeDefaultValue() {
352354
public void poaBlockTxsSelectionMaxTimeOption() throws IOException {
353355
final Path genesisFileIBFT2 = createFakeGenesisFile(VALID_GENESIS_IBFT2_POST_LONDON);
354356
internalTestSuccess(
357+
this::runtimeConfiguration,
355358
miningParams ->
356359
assertThat(miningParams.getPoaBlockTxsSelectionMaxTime())
357360
.isEqualTo(PositiveNumber.fromInt(80)),
@@ -365,6 +368,7 @@ public void poaBlockTxsSelectionMaxTimeOption() throws IOException {
365368
public void poaBlockTxsSelectionMaxTimeOptionOver100Percent() throws IOException {
366369
final Path genesisFileClique = createFakeGenesisFile(VALID_GENESIS_CLIQUE_POST_LONDON);
367370
internalTestSuccess(
371+
this::runtimeConfiguration,
368372
miningParams -> {
369373
assertThat(miningParams.getPoaBlockTxsSelectionMaxTime())
370374
.isEqualTo(PositiveNumber.fromInt(200));
@@ -412,16 +416,19 @@ protected MiningOptions optionsFromDomainObject(final MiningParameters domainObj
412416

413417
@Override
414418
protected MiningOptions getOptionsFromBesuCommand(final TestBesuCommand besuCommand) {
415-
final var miningOptions = besuCommand.getMiningOptions();
416-
miningOptions.setGenesisBlockPeriodSeconds(
417-
besuCommand.getActualGenesisConfigOptions().isPoa()
418-
? OptionalInt.of(POA_BLOCK_PERIOD_SECONDS)
419-
: OptionalInt.empty());
420-
return miningOptions;
419+
return besuCommand.getMiningOptions();
421420
}
422421

423422
@Override
424423
protected String[] getNonOptionFields() {
425-
return new String[] {"maybeGenesisBlockPeriodSeconds", "transactionSelectionService"};
424+
return new String[] {"transactionSelectionService"};
425+
}
426+
427+
private MiningParameters runtimeConfiguration(
428+
final TestBesuCommand besuCommand, final MiningParameters miningParameters) {
429+
if (besuCommand.getActualGenesisConfigOptions().isPoa()) {
430+
miningParameters.setBlockPeriodSeconds(POA_BLOCK_PERIOD_SECONDS);
431+
}
432+
return miningParameters;
426433
}
427434
}

0 commit comments

Comments
 (0)