Skip to content

Commit 719659a

Browse files
authored
Remove the possibility to create block before Byzantium hard-fork (#9005)
Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
1 parent c4e52b1 commit 719659a

File tree

6 files changed

+83
-95
lines changed

6 files changed

+83
-95
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
- Change in behavior for `eth_estimateGas`, to improve accuracy, when used on a network with a base fee market, the internal transaction simulation does not anymore underprice transactions, so if there are no gas pricing related fields specified in the request, then gas price for the transaction is set to the base fee value [#8888](https://github.com/hyperledger/besu/pull/8888)
77
- Remove PoAMetricsService and IbftQueryService which have been deprecated since 2019 and are replaced by PoaQueryService and BftQueryService respectively [#8940](https://github.com/hyperledger/besu/pull/8940)
88
- Remove deprecated `Quantity.getValue` method (deprecated since 2019) [#8968](https://github.com/hyperledger/besu/pull/8968)
9+
- Support for block creation on networks running a pre-Byzantium fork is removed, after being deprecated for a few months. If still running a pre-Byzantium network, it needs to be updated to continue to produce blocks [#9005](https://github.com/hyperledger/besu/pull/9005)
910

1011
### Upcoming Breaking Changes
1112

acceptance-tests/tests/src/test/resources/clique/clique.json.tpl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
{
22
"config": {
33
"chainId": 4,
4-
"homesteadBlock": 1,
5-
"eip150Block": 2,
6-
"eip158Block": 4,
7-
"byzantiumBlock": 5,
4+
"byzantiumBlock": 0,
85
"constantinopleBlock": 6,
96
"petersburgBlock": 7,
107
"clique": {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ private TransactionSelectionResult handleTransactionSelected(
479479

480480
final TransactionReceipt receipt =
481481
transactionReceiptFactory.create(
482-
transaction.getType(), processingResult, worldState, cumulativeGasUsed);
482+
transaction.getType(), processingResult, cumulativeGasUsed);
483483

484484
transactionSelectionResults.updateSelected(transaction, receipt, gasUsedByTransaction);
485485

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,15 @@
5555

5656
public abstract class AbstractBlockProcessor implements BlockProcessor {
5757

58-
@FunctionalInterface
5958
public interface TransactionReceiptFactory {
60-
6159
TransactionReceipt create(
6260
TransactionType transactionType,
6361
TransactionProcessingResult result,
6462
WorldState worldState,
6563
long gasUsed);
64+
65+
TransactionReceipt create(
66+
TransactionType transactionType, TransactionProcessingResult result, long gasUsed);
6667
}
6768

6869
private static final Logger LOG = LoggerFactory.getLogger(AbstractBlockProcessor.class);

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

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@
3131
import org.hyperledger.besu.config.PowAlgorithm;
3232
import org.hyperledger.besu.datatypes.TransactionType;
3333
import org.hyperledger.besu.datatypes.Wei;
34-
import org.hyperledger.besu.ethereum.core.TransactionReceipt;
3534
import org.hyperledger.besu.ethereum.core.feemarket.CoinbaseFeePriceCalculator;
36-
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
3735
import org.hyperledger.besu.evm.ClassicEVMs;
3836
import org.hyperledger.besu.evm.MainnetEVMs;
3937
import org.hyperledger.besu.evm.contractvalidation.MaxCodeSizeRule;
@@ -49,7 +47,6 @@
4947
import org.hyperledger.besu.evm.internal.EvmConfiguration;
5048
import org.hyperledger.besu.evm.processor.ContractCreationProcessor;
5149
import org.hyperledger.besu.evm.processor.MessageCallProcessor;
52-
import org.hyperledger.besu.evm.worldstate.WorldState;
5350
import org.hyperledger.besu.plugin.services.MetricsSystem;
5451

5552
import java.math.BigInteger;
@@ -175,9 +172,7 @@ public static ProtocolSpecBuilder atlantisDefinition(
175172
.precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::byzantium)
176173
.difficultyCalculator(ClassicDifficultyCalculators.EIP100)
177174
.transactionReceiptFactory(
178-
enableRevertReason
179-
? ClassicProtocolSpecs::byzantiumTransactionReceiptFactoryWithReasonEnabled
180-
: ClassicProtocolSpecs::byzantiumTransactionReceiptFactory)
175+
new MainnetProtocolSpecs.ByzantiumTransactionReceiptFactory(enableRevertReason))
181176
.contractCreationProcessorBuilder(
182177
evm ->
183178
new ContractCreationProcessor(
@@ -271,26 +266,6 @@ public static ProtocolSpecBuilder thanosDefinition(
271266
.hardforkId(THANOS);
272267
}
273268

274-
private static TransactionReceipt byzantiumTransactionReceiptFactory(
275-
// ignored because it's always FRONTIER for byzantium
276-
final TransactionType __,
277-
final TransactionProcessingResult result,
278-
final WorldState worldState,
279-
final long gasUsed) {
280-
return new TransactionReceipt(
281-
result.isSuccessful() ? 1 : 0, gasUsed, result.getLogs(), Optional.empty());
282-
}
283-
284-
private static TransactionReceipt byzantiumTransactionReceiptFactoryWithReasonEnabled(
285-
// ignored because it's always FRONTIER for byzantium
286-
final TransactionType __,
287-
final TransactionProcessingResult result,
288-
final WorldState worldState,
289-
final long gasUsed) {
290-
return new TransactionReceipt(
291-
result.isSuccessful() ? 1 : 0, gasUsed, result.getLogs(), result.getRevertReason());
292-
}
293-
294269
public static ProtocolSpecBuilder magnetoDefinition(
295270
final Optional<BigInteger> chainId,
296271
final boolean enableRevertReason,
@@ -315,9 +290,7 @@ public static ProtocolSpecBuilder magnetoDefinition(
315290
chainId,
316291
Set.of(TransactionType.FRONTIER, TransactionType.ACCESS_LIST)))
317292
.transactionReceiptFactory(
318-
enableRevertReason
319-
? MainnetProtocolSpecs::berlinTransactionReceiptFactoryWithReasonEnabled
320-
: MainnetProtocolSpecs::berlinTransactionReceiptFactory)
293+
new MainnetProtocolSpecs.BerlinTransactionReceiptFactory(enableRevertReason))
321294
.hardforkId(MAGNETO);
322295
}
323296

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

Lines changed: 75 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.hyperledger.besu.ethereum.core.MutableWorldState;
6666
import org.hyperledger.besu.ethereum.core.TransactionReceipt;
6767
import org.hyperledger.besu.ethereum.core.feemarket.CoinbaseFeePriceCalculator;
68+
import org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor.TransactionReceiptFactory;
6869
import org.hyperledger.besu.ethereum.mainnet.blockhash.CancunPreExecutionProcessor;
6970
import org.hyperledger.besu.ethereum.mainnet.blockhash.FrontierPreExecutionProcessor;
7071
import org.hyperledger.besu.ethereum.mainnet.blockhash.PraguePreExecutionProcessor;
@@ -190,7 +191,7 @@ public static ProtocolSpecBuilder frontierDefinition(
190191
(feeMarket, gasCalculator, gasLimitCalculator) ->
191192
MainnetBlockHeaderValidator.createLegacyFeeMarketOmmerValidator())
192193
.blockBodyValidatorBuilder(MainnetBlockBodyValidator::new)
193-
.transactionReceiptFactory(MainnetProtocolSpecs::frontierTransactionReceiptFactory)
194+
.transactionReceiptFactory(new FrontierTransactionReceiptFactory())
194195
.blockReward(FRONTIER_BLOCK_REWARD)
195196
.skipZeroBlockRewards(false)
196197
.blockProcessorBuilder(
@@ -348,10 +349,7 @@ public static ProtocolSpecBuilder byzantiumDefinition(
348349
.evmBuilder(MainnetEVMs::byzantium)
349350
.precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::byzantium)
350351
.difficultyCalculator(MainnetDifficultyCalculators.BYZANTIUM)
351-
.transactionReceiptFactory(
352-
enableRevertReason
353-
? MainnetProtocolSpecs::byzantiumTransactionReceiptFactoryWithReasonEnabled
354-
: MainnetProtocolSpecs::byzantiumTransactionReceiptFactory)
352+
.transactionReceiptFactory(new ByzantiumTransactionReceiptFactory(enableRevertReason))
355353
.blockReward(BYZANTIUM_BLOCK_REWARD)
356354
.hardforkId(BYZANTIUM);
357355
}
@@ -457,10 +455,7 @@ static ProtocolSpecBuilder berlinDefinition(
457455
true,
458456
chainId,
459457
Set.of(TransactionType.FRONTIER, TransactionType.ACCESS_LIST)))
460-
.transactionReceiptFactory(
461-
enableRevertReason
462-
? MainnetProtocolSpecs::berlinTransactionReceiptFactoryWithReasonEnabled
463-
: MainnetProtocolSpecs::berlinTransactionReceiptFactory)
458+
.transactionReceiptFactory(new BerlinTransactionReceiptFactory(enableRevertReason))
464459
.hardforkId(BERLIN);
465460
}
466461

@@ -1114,63 +1109,84 @@ static ProtocolSpecBuilder experimentalEipsDefinition(
11141109
.hardforkId(EXPERIMENTAL_EIPS);
11151110
}
11161111

1117-
private static TransactionReceipt frontierTransactionReceiptFactory(
1118-
// ignored because it's always FRONTIER
1119-
final TransactionType __,
1120-
final TransactionProcessingResult result,
1121-
final WorldState worldState,
1122-
final long gasUsed) {
1123-
return new TransactionReceipt(
1124-
worldState.frontierRootHash(),
1125-
gasUsed,
1126-
result.getLogs(),
1127-
Optional.empty()); // No revert reason in frontier
1128-
}
1112+
private static class FrontierTransactionReceiptFactory implements TransactionReceiptFactory {
11291113

1130-
private static TransactionReceipt byzantiumTransactionReceiptFactory(
1131-
// ignored because it's always FRONTIER
1132-
final TransactionType __,
1133-
final TransactionProcessingResult result,
1134-
final WorldState worldState,
1135-
final long gasUsed) {
1136-
return new TransactionReceipt(
1137-
result.isSuccessful() ? 1 : 0, gasUsed, result.getLogs(), Optional.empty());
1114+
@Override
1115+
public TransactionReceipt create(
1116+
final TransactionType transactionType,
1117+
final TransactionProcessingResult result,
1118+
final WorldState worldState,
1119+
final long gasUsed) {
1120+
return new TransactionReceipt(
1121+
worldState.frontierRootHash(),
1122+
gasUsed,
1123+
result.getLogs(),
1124+
Optional.empty()); // No revert reason in Frontier
1125+
}
1126+
1127+
@Override
1128+
public TransactionReceipt create(
1129+
final TransactionType transactionType,
1130+
final TransactionProcessingResult result,
1131+
final long gasUsed) {
1132+
throw new UnsupportedOperationException("No stateless transaction receipt in Frontier");
1133+
}
11381134
}
11391135

1140-
private static TransactionReceipt byzantiumTransactionReceiptFactoryWithReasonEnabled(
1141-
// ignored because it's always FRONTIER
1142-
final TransactionType __,
1143-
final TransactionProcessingResult result,
1144-
final WorldState worldState,
1145-
final long gasUsed) {
1146-
return new TransactionReceipt(
1147-
result.isSuccessful() ? 1 : 0, gasUsed, result.getLogs(), result.getRevertReason());
1136+
private abstract static class PostFrontierTransactionReceiptFactory
1137+
implements TransactionReceiptFactory {
1138+
protected final boolean revertReasonEnabled;
1139+
1140+
public PostFrontierTransactionReceiptFactory(final boolean revertReasonEnabled) {
1141+
this.revertReasonEnabled = revertReasonEnabled;
1142+
}
1143+
1144+
@Override
1145+
public TransactionReceipt create(
1146+
final TransactionType transactionType,
1147+
final TransactionProcessingResult result,
1148+
final WorldState worldState,
1149+
final long gasUsed) {
1150+
return create(transactionType, result, gasUsed);
1151+
}
11481152
}
11491153

1150-
static TransactionReceipt berlinTransactionReceiptFactory(
1151-
final TransactionType transactionType,
1152-
final TransactionProcessingResult transactionProcessingResult,
1153-
final WorldState worldState,
1154-
final long gasUsed) {
1155-
return new TransactionReceipt(
1156-
transactionType,
1157-
transactionProcessingResult.isSuccessful() ? 1 : 0,
1158-
gasUsed,
1159-
transactionProcessingResult.getLogs(),
1160-
Optional.empty());
1154+
static class ByzantiumTransactionReceiptFactory extends PostFrontierTransactionReceiptFactory {
1155+
public ByzantiumTransactionReceiptFactory(final boolean revertReasonEnabled) {
1156+
super(revertReasonEnabled);
1157+
}
1158+
1159+
@Override
1160+
public TransactionReceipt create(
1161+
final TransactionType transactionType,
1162+
final TransactionProcessingResult result,
1163+
final long gasUsed) {
1164+
return new TransactionReceipt(
1165+
result.isSuccessful() ? 1 : 0,
1166+
gasUsed,
1167+
result.getLogs(),
1168+
revertReasonEnabled ? result.getRevertReason() : Optional.empty());
1169+
}
11611170
}
11621171

1163-
static TransactionReceipt berlinTransactionReceiptFactoryWithReasonEnabled(
1164-
final TransactionType transactionType,
1165-
final TransactionProcessingResult transactionProcessingResult,
1166-
final WorldState worldState,
1167-
final long gasUsed) {
1168-
return new TransactionReceipt(
1169-
transactionType,
1170-
transactionProcessingResult.isSuccessful() ? 1 : 0,
1171-
gasUsed,
1172-
transactionProcessingResult.getLogs(),
1173-
transactionProcessingResult.getRevertReason());
1172+
static class BerlinTransactionReceiptFactory extends PostFrontierTransactionReceiptFactory {
1173+
1174+
public BerlinTransactionReceiptFactory(final boolean revertReasonEnabled) {
1175+
super(revertReasonEnabled);
1176+
}
1177+
1178+
@Override
1179+
public TransactionReceipt create(
1180+
final TransactionType transactionType,
1181+
final TransactionProcessingResult result,
1182+
final long gasUsed) {
1183+
return new TransactionReceipt(
1184+
transactionType,
1185+
result.isSuccessful() ? 1 : 0,
1186+
gasUsed,
1187+
result.getLogs(),
1188+
revertReasonEnabled ? result.getRevertReason() : Optional.empty());
1189+
}
11741190
}
11751191

11761192
private record DaoBlockProcessor(BlockProcessor wrapped) implements BlockProcessor {

0 commit comments

Comments
 (0)