Skip to content

Commit 173f825

Browse files
committed
Expose methods to query the hardfork in the Plugin API
Signed-off-by: Fabio Di Fabio <[email protected]>
1 parent c58fff2 commit 173f825

File tree

25 files changed

+427
-214
lines changed

25 files changed

+427
-214
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
### Additions and Improvements
1111
- Improve transaction simulation and gas estimation when no gas pricing is present [#8888](https://github.com/hyperledger/besu/pull/8888)
1212
- Add option to trace reference tests during execution [#8878](https://github.com/hyperledger/besu/pull/8878)
13+
- Expose methods to query hardfork by block header or for the next block in the Plugin API [#8909](https://github.com/hyperledger/besu/pull/8909)
1314

1415
#### Fusaka devnets
1516
- EIP-7910 - `eth_config` JSON-RPC Method [#8417](https://github.com/hyperledger/besu/pull/8417)

app/src/main/java/org/hyperledger/besu/services/BlockchainServiceImpl.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator.calculateExcessBlobGasForParent;
1818

1919
import org.hyperledger.besu.datatypes.BlobGas;
20+
import org.hyperledger.besu.datatypes.HardforkId;
2021
import org.hyperledger.besu.datatypes.Hash;
2122
import org.hyperledger.besu.datatypes.Wei;
2223
import org.hyperledger.besu.ethereum.chain.MutableBlockchain;
@@ -226,4 +227,17 @@ public Optional<BigInteger> getChainId() {
226227
}
227228
return protocolSchedule.getChainId();
228229
}
230+
231+
@Override
232+
public HardforkId getHardforkId(final BlockHeader blockHeader) {
233+
return protocolSchedule.getByBlockHeader(blockHeader).getHardforkId();
234+
}
235+
236+
@Override
237+
public HardforkId getNextBlockHardforkId(
238+
final BlockHeader parentBlockHeader, final long timestampForNextBlock) {
239+
return protocolSchedule
240+
.getForNextBlockHeader(parentBlockHeader, timestampForNextBlock)
241+
.getHardforkId();
242+
}
229243
}

consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import static org.assertj.core.api.Assertions.assertThat;
1818
import static org.assertj.core.api.Assertions.assertThatThrownBy;
19+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.FRONTIER;
1920
import static org.mockito.Mockito.mock;
2021
import static org.mockito.Mockito.when;
2122

@@ -100,7 +101,7 @@ public void parametersAlignWithMainnetWithAdjustments() {
100101
new NoOpMetricsSystem())
101102
.getByBlockHeader(blockHeader(0));
102103

103-
assertThat(homestead.getName()).isEqualTo("Frontier");
104+
assertThat(homestead.getHardforkId()).isEqualTo(FRONTIER);
104105
assertThat(homestead.getBlockReward()).isEqualTo(Wei.ZERO);
105106
assertThat(homestead.isSkipZeroBlockRewards()).isEqualTo(true);
106107
assertThat(homestead.getDifficultyCalculator()).isInstanceOf(CliqueDifficultyCalculator.class);

consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockMinerTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.hyperledger.besu.consensus.clique.blockcreation;
1616

1717
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.FRONTIER;
1819
import static org.mockito.ArgumentMatchers.any;
1920
import static org.mockito.ArgumentMatchers.anyLong;
2021
import static org.mockito.Mockito.mock;
@@ -97,7 +98,7 @@ void doesNotMineBlockIfNoTransactionsWhenEmptyBlocksNotAllowed() throws Interrup
9798

9899
final BlockImporter blockImporter = mock(BlockImporter.class);
99100
final ProtocolSpec protocolSpec = mock(ProtocolSpec.class);
100-
101+
when(protocolSpec.getHardforkId()).thenReturn(FRONTIER);
101102
final ProtocolSchedule protocolSchedule = singleSpecSchedule(protocolSpec);
102103

103104
when(protocolSpec.getBlockImporter()).thenReturn(blockImporter);
@@ -153,7 +154,7 @@ void minesBlockIfHasTransactionsWhenEmptyBlocksNotAllowed() throws InterruptedEx
153154

154155
final BlockImporter blockImporter = mock(BlockImporter.class);
155156
final ProtocolSpec protocolSpec = mock(ProtocolSpec.class);
156-
157+
when(protocolSpec.getHardforkId()).thenReturn(FRONTIER);
157158
final ProtocolSchedule protocolSchedule = singleSpecSchedule(protocolSpec);
158159

159160
when(protocolSpec.getBlockImporter()).thenReturn(blockImporter);

consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@
1515
package org.hyperledger.besu.consensus.common;
1616

1717
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.BERLIN;
19+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.BYZANTIUM;
20+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.CONSTANTINOPLE;
21+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.FRONTIER;
22+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.HOMESTEAD;
23+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.LONDON;
24+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.SHANGHAI;
1825

1926
import org.hyperledger.besu.config.GenesisConfigOptions;
2027
import org.hyperledger.besu.config.StubGenesisConfigOptions;
@@ -62,18 +69,18 @@ public void createsCombinedProtocolScheduleWithMilestonesFromSingleProtocolSched
6269
final BftProtocolSchedule combinedProtocolSchedule =
6370
combinedProtocolScheduleFactory.create(consensusSchedule, Optional.of(BigInteger.TEN));
6471

65-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 0L).getName())
66-
.isEqualTo("Frontier");
72+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 0L).getHardforkId())
73+
.isEqualTo(FRONTIER);
6774
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 0L))
6875
.isSameAs(protocolSchedule.getByBlockNumberOrTimestamp(0L, 0L));
6976

70-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(5L, 0L).getName())
71-
.isEqualTo("Homestead");
77+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(5L, 0L).getHardforkId())
78+
.isEqualTo(HOMESTEAD);
7279
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(5L, 0L))
7380
.isSameAs(protocolSchedule.getByBlockNumberOrTimestamp(5L, 0L));
7481

75-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(10L, 0L).getName())
76-
.isEqualTo("Constantinople");
82+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(10L, 0L).getHardforkId())
83+
.isEqualTo(CONSTANTINOPLE);
7784
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(10L, 0L))
7885
.isSameAs(protocolSchedule.getByBlockNumberOrTimestamp(10L, 0L));
7986

@@ -111,51 +118,52 @@ public void createsCombinedProtocolScheduleWithMilestonesFromMultipleSchedules()
111118
combinedProtocolScheduleFactory.create(consensusSchedule, Optional.of(BigInteger.TEN));
112119

113120
// consensus schedule 1
114-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 0L).getName())
115-
.isEqualTo("Frontier");
121+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 0L).getHardforkId())
122+
.isEqualTo(FRONTIER);
116123
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 0L))
117124
.isSameAs(protocolSchedule1.getByBlockNumberOrTimestamp(0L, 0L));
118125

119-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(5L, 0L).getName())
120-
.isEqualTo("Homestead");
126+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(5L, 0L).getHardforkId())
127+
.isEqualTo(HOMESTEAD);
121128
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(5L, 0L))
122129
.isSameAs(protocolSchedule1.getByBlockNumberOrTimestamp(5L, 0L));
123-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(10L, 0L).getName())
124-
.isEqualTo("Byzantium");
130+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(10L, 0L).getHardforkId())
131+
.isEqualTo(BYZANTIUM);
125132
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(10L, 0L))
126133
.isSameAs(protocolSchedule1.getByBlockNumberOrTimestamp(10L, 0L));
127134

128135
// consensus schedule 2 migration block
129-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(100L, 0L).getName())
130-
.isEqualTo("Byzantium");
136+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(100L, 0L).getHardforkId())
137+
.isEqualTo(BYZANTIUM);
131138
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(100L, 0L))
132139
.isSameAs(protocolSchedule2.getByBlockNumberOrTimestamp(10L, 0L));
133140

134141
// consensus schedule 2
135-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(105L, 0L).getName())
136-
.isEqualTo("Constantinople");
142+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(105L, 0L).getHardforkId())
143+
.isEqualTo(CONSTANTINOPLE);
137144
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(105L, 0L))
138145
.isSameAs(protocolSchedule2.getByBlockNumberOrTimestamp(105L, 0L));
139-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(110L, 0L).getName())
140-
.isEqualTo("Berlin");
146+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(110L, 0L).getHardforkId())
147+
.isEqualTo(BERLIN);
141148
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(110L, 0L))
142149
.isSameAs(protocolSchedule2.getByBlockNumberOrTimestamp(110L, 0L));
143150

144151
// consensus schedule 3 migration block
145-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(200L, 0L).getName())
146-
.isEqualTo("Berlin");
152+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(200L, 0L).getHardforkId())
153+
.isEqualTo(BERLIN);
147154
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(200L, 0L))
148155
.isSameAs(protocolSchedule3.getByBlockNumberOrTimestamp(110L, 0L));
149156

150157
// consensus schedule 3
151-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(220L, 0L).getName())
152-
.isEqualTo("London");
158+
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(220L, 0L).getHardforkId())
159+
.isEqualTo(LONDON);
153160
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(220L, 0L))
154161
.isSameAs(protocolSchedule3.getByBlockNumberOrTimestamp(220L, 0L));
155162

156163
// consensus schedule 4
157-
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 1000000050L).getName())
158-
.isEqualTo("Shanghai");
164+
assertThat(
165+
combinedProtocolSchedule.getByBlockNumberOrTimestamp(0L, 1000000050L).getHardforkId())
166+
.isEqualTo(SHANGHAI);
159167
assertThat(combinedProtocolSchedule.getByBlockNumberOrTimestamp(220L, 1000000050L))
160168
.isSameAs(protocolSchedule4.getByBlockNumberOrTimestamp(220L, 1000000050L));
161169

consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
*/
1515
package org.hyperledger.besu.consensus.merge;
1616

17+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.PARIS;
18+
1719
import org.hyperledger.besu.config.GenesisConfigOptions;
1820
import org.hyperledger.besu.datatypes.Wei;
1921
import org.hyperledger.besu.ethereum.GasLimitCalculator;
@@ -103,7 +105,7 @@ private static ProtocolSpecBuilder applyParisSpecificModifications(
103105
.difficultyCalculator((a, b) -> BigInteger.ZERO)
104106
.skipZeroBlockRewards(true)
105107
.isPoS(true)
106-
.name("Paris");
108+
.hardforkId(PARIS);
107109
}
108110

109111
private static BlockHeaderValidator.Builder getBlockHeaderValidator(

consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
package org.hyperledger.besu.consensus.merge;
1616

1717
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.CANCUN;
19+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.PARIS;
20+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.SHANGHAI;
1821

1922
import org.hyperledger.besu.config.GenesisConfig;
2023
import org.hyperledger.besu.config.GenesisConfigOptions;
@@ -84,8 +87,8 @@ public void mergeSpecificModificationsAreUnappliedForShanghai() {
8487
protocolSchedule.getByBlockHeader(
8588
new BlockHeaderTestFixture().timestamp(1681338455).buildHeader());
8689

87-
assertThat(parisSpec.getName()).isEqualTo("Paris");
88-
assertThat(shanghaiSpec.getName()).isEqualTo("Shanghai");
90+
assertThat(parisSpec.getHardforkId()).isEqualTo(PARIS);
91+
assertThat(shanghaiSpec.getHardforkId()).isEqualTo(SHANGHAI);
8992

9093
// ensure PUSH0 is enabled in Shanghai
9194
final int PUSH0 = 0x5f;
@@ -125,8 +128,8 @@ public void mergeSpecificModificationsAreUnappliedForCancun_whenShanghaiNotConfi
125128
protocolSchedule.getByBlockHeader(
126129
new BlockHeaderTestFixture().number(10).timestamp(1000).buildHeader());
127130

128-
assertThat(parisSpec.getName()).isEqualTo("Paris");
129-
assertThat(cancunSpec.getName()).isEqualTo("Cancun");
131+
assertThat(parisSpec.getHardforkId()).isEqualTo(PARIS);
132+
assertThat(cancunSpec.getHardforkId()).isEqualTo(CANCUN);
130133

131134
// ensure PUSH0 is enabled in Cancun (i.e. it has picked up the Shanghai change rather than been
132135
// reverted to Paris)
@@ -154,14 +157,14 @@ public void mergeSpecificModificationsAreUnappliedForAllMainnetForksAfterParis()
154157
final long lastParisBlockNumber = 17034869L;
155158
final ProtocolSpec parisSpec =
156159
protocolSchedule.getByBlockHeader(blockHeader(lastParisBlockNumber));
157-
assertThat(parisSpec.getName()).isEqualTo("Paris");
160+
assertThat(parisSpec.getHardforkId()).isEqualTo(PARIS);
158161

159162
for (long forkTimestamp : config.getForkBlockTimestamps()) {
160163
final ProtocolSpec postParisSpec =
161164
protocolSchedule.getByBlockHeader(
162165
new BlockHeaderTestFixture().timestamp(forkTimestamp).buildHeader());
163166

164-
assertThat(postParisSpec.getName()).isNotEqualTo("Paris");
167+
assertThat(postParisSpec.getHardforkId()).isNotEqualTo(PARIS);
165168
// ensure PUSH0 is enabled from Shanghai onwards
166169
final int PUSH0 = 0x5f;
167170
assertThat(parisSpec.getEvm().getOperationsUnsafe()[PUSH0])
@@ -186,7 +189,7 @@ public void parametersAlignWithMainnetWithAdjustments() {
186189
new NoOpMetricsSystem())
187190
.getByBlockHeader(blockHeader(0));
188191

189-
assertThat(london.getName()).isEqualTo("Paris");
192+
assertThat(london.getHardforkId()).isEqualTo(PARIS);
190193
assertProofOfStakeConfigIsEnabled(london);
191194
}
192195

datatypes/src/main/java/org/hyperledger/besu/datatypes/HardforkId.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ enum MainnetHardforkId implements HardforkId {
4747
FRONTIER(true, "Frontier"),
4848
/** Homestead fork. */
4949
HOMESTEAD(true, "Homestead"),
50-
/** DAO Fork fork. */
51-
DAO_FORK(true, "DAO Fork"),
50+
/** DAO Recovery Init fork. */
51+
DAO_RECOVERY_INIT(true, "DAO Recovery Init"),
52+
/** DAO Recovery Transition fork. */
53+
DAO_RECOVERY_TRANSITION(true, "DAO Recovery Transition"),
5254
/** Tangerine Whistle fork. */
5355
TANGERINE_WHISTLE(true, "Tangerine Whistle"),
5456
/** Spurious Dragon fork. */
@@ -102,9 +104,9 @@ enum MainnetHardforkId implements HardforkId {
102104
/** Bangkok fork. */
103105
BANGKOK(false, "Bangkok"),
104106
/** Development fork, for accepted and unscheduled EIPs. */
105-
FUTURE_EIPS(false, "Development, for accepted and unscheduled EIPs"),
107+
FUTURE_EIPS(false, "FutureEips"),
106108
/** Developmental fork, for experimental EIPs. */
107-
EXPERIMENTAL_EIPS(false, "Developmental, for experimental EIPs");
109+
EXPERIMENTAL_EIPS(false, "ExperimentalEips");
108110

109111
final boolean finalized;
110112
final String description;
@@ -144,6 +146,8 @@ enum ClassicHardforkId implements HardforkId {
144146
FRONTIER(true, "Frontier"),
145147
/** Homestead fork. */
146148
HOMESTEAD(true, "Homestead"),
149+
/** Classic Recovery Init fork. */
150+
CLASSIC_RECOVERY_INIT(true, "Classic Recovery Init"),
147151
/** Classic Tangerine Whistle fork. */
148152
CLASSIC_TANGERINE_WHISTLE(true, "Classic Tangerine Whistle"),
149153
/** Die Hard fork. */

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfo.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,11 @@ public JsonRpcResponse response(final JsonRpcRequestContext requestContext) {
131131
networkId)));
132132

133133
response.put(
134-
"activeFork", protocolSchedule.getByBlockHeader(chainHead.getBlockHeader()).getName());
134+
"activeFork",
135+
protocolSchedule
136+
.getByBlockHeader(chainHead.getBlockHeader())
137+
.getHardforkId()
138+
.description());
135139

136140
return new JsonRpcSuccessResponse(requestContext.getRequest().getId(), response);
137141
}

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfoTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods;
1616

1717
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.LONDON;
1819
import static org.mockito.ArgumentMatchers.any;
1920
import static org.mockito.ArgumentMatchers.anyLong;
2021
import static org.mockito.ArgumentMatchers.anyString;
@@ -98,7 +99,7 @@ public void setup() {
9899
when(blockchainQueries.getBlockHashByNumber(anyLong())).thenReturn(Optional.of(Hash.EMPTY));
99100
when(blockchain.getChainHead()).thenReturn(testChainHead);
100101
when(natService.queryExternalIPAddress(anyString())).thenReturn("1.2.3.4");
101-
when(protocolSpec.getName()).thenReturn("London");
102+
when(protocolSpec.getHardforkId()).thenReturn(LONDON);
102103
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
103104
method =
104105
new AdminNodeInfo(

0 commit comments

Comments
 (0)