Skip to content

Commit 51c4f5e

Browse files
authored
Log constructed and block BALs on mismatch (#9402)
Signed-off-by: Miroslav Kovar <[email protected]>
1 parent 8784c4e commit 51c4f5e

File tree

17 files changed

+108
-33
lines changed

17 files changed

+108
-33
lines changed

app/src/main/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilder.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ public class ConfigurationOverviewBuilder {
7272
private RocksDBCLIOptions.BlobDBSettings blobDBSettings;
7373
private Long targetGasLimit;
7474
private boolean isBalOptimizationEnabled = true;
75-
private boolean isBalLenientOnMismatch = false;
75+
private boolean isBalLenientOnStateRootMismatch = false;
76+
private boolean shouldLogBalsOnMismatch = false;
7677
private boolean isBalApiEnabled = false;
7778
private Duration balStateRootTimeout = Duration.ofSeconds(1);
7879

@@ -395,7 +396,8 @@ public ConfigurationOverviewBuilder setTargetGasLimit(final Long targetGasLimit)
395396
*/
396397
public ConfigurationOverviewBuilder setBalConfiguration(final BalConfiguration balConfiguration) {
397398
this.isBalOptimizationEnabled = balConfiguration.isBalOptimisationEnabled();
398-
this.isBalLenientOnMismatch = balConfiguration.isBalLenientOnMismatch();
399+
this.isBalLenientOnStateRootMismatch = balConfiguration.isBalLenientOnStateRootMismatch();
400+
this.shouldLogBalsOnMismatch = balConfiguration.shouldLogBalsOnMismatch();
399401
this.isBalApiEnabled = balConfiguration.isBalApiEnabled();
400402
this.balStateRootTimeout = balConfiguration.getBalStateRootTimeout();
401403
return this;
@@ -474,7 +476,10 @@ public String build() {
474476
}
475477

476478
lines.add("BAL optimizations " + (isBalOptimizationEnabled ? "enabled" : "disabled"));
477-
lines.add("BAL mismatch leniency " + (isBalLenientOnMismatch ? "enabled" : "disabled"));
479+
lines.add(
480+
"BAL state root mismatch leniency "
481+
+ (isBalLenientOnStateRootMismatch ? "enabled" : "disabled"));
482+
lines.add("BAL logging on BAL mismatch " + (shouldLogBalsOnMismatch ? "enabled" : "disabled"));
478483
lines.add("BAL API " + (isBalApiEnabled ? "enabled" : "disabled"));
479484
lines.add("BAL state root timeout: " + balStateRootTimeout.toMillis() + " ms");
480485

app/src/main/java/org/hyperledger/besu/cli/options/BalConfigurationOptions.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,17 @@ public BalConfigurationOptions() {}
3333
boolean balOptimizationEnabled = true;
3434

3535
@CommandLine.Option(
36-
names = {"--Xbal-lenient-on-mismatch"},
36+
names = {"--Xbal-lenient-on-state-root-mismatch"},
3737
hidden = true,
3838
description =
3939
"Log an error instead of throwing when the BAL-computed state root does not match the synchronously computed root.")
40-
boolean balLenientOnMismatch = true;
40+
boolean balLenientOnStateRootMismatch = true;
41+
42+
@CommandLine.Option(
43+
names = {"--Xbal-log-bals-on-mismatch"},
44+
hidden = true,
45+
description = "Log the constructed and block's BAL when they differ.")
46+
boolean balLogBalsOnMismatch = false;
4147

4248
@CommandLine.Option(
4349
names = {"--Xbal-api-enabled"},
@@ -62,7 +68,8 @@ public BalConfiguration toDomainObject() {
6268
return ImmutableBalConfiguration.builder()
6369
.isBalApiEnabled(balApiEnabled)
6470
.isBalOptimisationEnabled(balOptimizationEnabled)
65-
.isBalLenientOnMismatch(balLenientOnMismatch)
71+
.shouldLogBalsOnMismatch(balLogBalsOnMismatch)
72+
.isBalLenientOnStateRootMismatch(balLenientOnStateRootMismatch)
6673
.balStateRootTimeout(Duration.ofMillis(balStateRootTimeoutMs))
6774
.build();
6875
}

app/src/test/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilderTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,14 +286,16 @@ void setBalConfiguration() {
286286
builder.setBalConfiguration(
287287
ImmutableBalConfiguration.builder()
288288
.isBalOptimisationEnabled(false)
289-
.isBalLenientOnMismatch(true)
289+
.isBalLenientOnStateRootMismatch(true)
290+
.shouldLogBalsOnMismatch(true)
290291
.isBalApiEnabled(true)
291292
.balStateRootTimeout(Duration.ofMillis(2500))
292293
.build());
293294

294295
final String configuration = builder.build();
295296
assertThat(configuration).contains("BAL optimizations disabled");
296-
assertThat(configuration).contains("BAL mismatch leniency enabled");
297+
assertThat(configuration).contains("BAL state root mismatch leniency enabled");
298+
assertThat(configuration).contains("BAL logging on BAL mismatch enabled");
297299
assertThat(configuration).contains("BAL API enabled");
298300
assertThat(configuration).contains("BAL state root timeout: 2500 ms");
299301
}

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.hyperledger.besu.ethereum.core.BlockDataGenerator;
2727
import org.hyperledger.besu.ethereum.core.BlockHeader;
2828
import org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor;
29+
import org.hyperledger.besu.ethereum.mainnet.BalConfiguration;
2930
import org.hyperledger.besu.ethereum.mainnet.ClassicBlockProcessor;
3031
import org.hyperledger.besu.ethereum.mainnet.MainnetBlockProcessor;
3132
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor;
@@ -91,7 +92,8 @@ public void assertThatTraceGeneratorReturnValidRewardsForMainnetBlockProcessor()
9192
blockReward,
9293
BlockHeader::getCoinbase,
9394
true,
94-
protocolSchedule);
95+
protocolSchedule,
96+
BalConfiguration.DEFAULT);
9597
when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor);
9698

9799
final Stream<Trace> traceStream =
@@ -151,7 +153,8 @@ public void assertThatTraceGeneratorReturnValidRewardsForClassicBlockProcessor()
151153
BlockHeader::getCoinbase,
152154
true,
153155
eraRounds,
154-
protocolSchedule);
156+
protocolSchedule,
157+
BalConfiguration.DEFAULT);
155158
when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor);
156159

157160
final Stream<Trace> traceStream =

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ TransactionReceipt create(
8585

8686
protected final boolean skipZeroBlockRewards;
8787
private final ProtocolSchedule protocolSchedule;
88+
private final BalConfiguration balConfiguration;
8889

8990
protected final MiningBeneficiaryCalculator miningBeneficiaryCalculator;
9091
private BlockImportTracerProvider blockImportTracerProvider = null;
@@ -95,13 +96,15 @@ protected AbstractBlockProcessor(
9596
final Wei blockReward,
9697
final MiningBeneficiaryCalculator miningBeneficiaryCalculator,
9798
final boolean skipZeroBlockRewards,
98-
final ProtocolSchedule protocolSchedule) {
99+
final ProtocolSchedule protocolSchedule,
100+
final BalConfiguration balConfiguration) {
99101
this.transactionProcessor = transactionProcessor;
100102
this.transactionReceiptFactory = transactionReceiptFactory;
101103
this.blockReward = blockReward;
102104
this.miningBeneficiaryCalculator = miningBeneficiaryCalculator;
103105
this.skipZeroBlockRewards = skipZeroBlockRewards;
104106
this.protocolSchedule = protocolSchedule;
107+
this.balConfiguration = balConfiguration;
105108
}
106109

107110
private BlockAwareOperationTracer getBlockImportTracer(
@@ -410,6 +413,21 @@ public BlockProcessingResult processBlock(
410413
"Block access list hash mismatch, calculated: %s header: %s",
411414
expectedHash.toHexString(), headerBalHash.get().toHexString());
412415
LOG.error(errorMessage);
416+
417+
if (balConfiguration.shouldLogBalsOnMismatch()) {
418+
final String constructedBalStr = bal.toString();
419+
final String blockBalStr =
420+
blockBody
421+
.getBlockAccessList()
422+
.map(Object::toString)
423+
.orElse("<no BAL present in block body>");
424+
LOG.error(
425+
"--- BAL constructed during execution ---\n{}\n"
426+
+ "--- BAL from block body ---\n{}",
427+
constructedBalStr,
428+
blockBalStr);
429+
}
430+
413431
if (worldState instanceof BonsaiWorldState) {
414432
((BonsaiWorldStateUpdateAccumulator) worldState.updater()).reset();
415433
}

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BalConfiguration.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,16 @@ default boolean isBalOptimisationEnabled() {
4141
* an error instead of throwing an exception.
4242
*/
4343
@Value.Default
44-
default boolean isBalLenientOnMismatch() {
44+
default boolean isBalLenientOnStateRootMismatch() {
4545
return true;
4646
}
4747

48+
/** Returns whether the BALs should be logged when a constructed and block's BALs mismatch. */
49+
@Value.Default
50+
default boolean shouldLogBalsOnMismatch() {
51+
return false;
52+
}
53+
4854
/** Returns the timeout to use when waiting for the BAL-computed state root. */
4955
@Value.Default
5056
default Duration getBalStateRootTimeout() {

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,16 @@ public ClassicBlockProcessor(
4242
final MiningBeneficiaryCalculator miningBeneficiaryCalculator,
4343
final boolean skipZeroBlockRewards,
4444
final OptionalLong eraLen,
45-
final ProtocolSchedule protocolSchedule) {
45+
final ProtocolSchedule protocolSchedule,
46+
final BalConfiguration balConfiguration) {
4647
super(
4748
transactionProcessor,
4849
transactionReceiptFactory,
4950
blockReward,
5051
miningBeneficiaryCalculator,
5152
skipZeroBlockRewards,
52-
protocolSchedule);
53+
protocolSchedule,
54+
balConfiguration);
5355
eraLength = eraLen.orElse(DEFAULT_ERA_LENGTH);
5456
}
5557

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,17 @@ public static ProtocolSpecBuilder gothamDefinition(
144144
blockReward,
145145
miningBeneficiaryCalculator,
146146
skipZeroBlockRewards,
147-
protocolSchedule) ->
147+
protocolSchedule,
148+
balConfig) ->
148149
new ClassicBlockProcessor(
149150
transactionProcessor,
150151
transactionReceiptFactory,
151152
blockReward,
152153
miningBeneficiaryCalculator,
153154
skipZeroBlockRewards,
154155
genesisConfigOptions.getEcip1017EraRounds(),
155-
protocolSchedule))
156+
protocolSchedule,
157+
balConfig))
156158
.hardforkId(GOTHAM);
157159
}
158160

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,16 @@ public MainnetBlockProcessor(
3636
final Wei blockReward,
3737
final MiningBeneficiaryCalculator miningBeneficiaryCalculator,
3838
final boolean skipZeroBlockRewards,
39-
final ProtocolSchedule protocolSchedule) {
39+
final ProtocolSchedule protocolSchedule,
40+
final BalConfiguration balConfiguration) {
4041
super(
4142
transactionProcessor,
4243
transactionReceiptFactory,
4344
blockReward,
4445
miningBeneficiaryCalculator,
4546
skipZeroBlockRewards,
46-
protocolSchedule);
47+
protocolSchedule,
48+
balConfiguration);
4749
}
4850

4951
@Override

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ public static ProtocolSpecBuilder frontierDefinition(
202202
.blockReward(FRONTIER_BLOCK_REWARD)
203203
.skipZeroBlockRewards(false)
204204
.isBlockAccessListEnabled(balConfiguration.isBalApiEnabled())
205+
.balConfiguration(balConfiguration)
205206
.blockProcessorBuilder(
206207
isParallelTxProcessingEnabled
207208
? new MainnetParallelBlockProcessor.ParallelBlockProcessorBuilder(metricsSystem)
@@ -291,7 +292,8 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition(
291292
blockReward,
292293
miningBeneficiaryCalculator,
293294
skipZeroBlockRewards,
294-
protocolSchedule) ->
295+
protocolSchedule,
296+
balConfig) ->
295297
new DaoBlockProcessor(
296298
isParallelTxProcessingEnabled
297299
? new MainnetParallelBlockProcessor(
@@ -301,14 +303,16 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition(
301303
miningBeneficiaryCalculator,
302304
skipZeroBlockRewards,
303305
protocolSchedule,
306+
balConfig,
304307
metricsSystem)
305308
: new MainnetBlockProcessor(
306309
transactionProcessor,
307310
transactionReceiptFactory,
308311
blockReward,
309312
miningBeneficiaryCalculator,
310313
skipZeroBlockRewards,
311-
protocolSchedule)))
314+
protocolSchedule,
315+
balConfig)))
312316
.hardforkId(DAO_RECOVERY_INIT);
313317
}
314318

0 commit comments

Comments
 (0)