Skip to content

Commit 43714ec

Browse files
committed
eth_config showAllForks prototype
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
1 parent dd0ca13 commit 43714ec

5 files changed

Lines changed: 111 additions & 1 deletion

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import java.math.BigInteger;
2929
import java.util.List;
30+
import java.util.NavigableSet;
3031
import java.util.Optional;
3132
import java.util.function.Predicate;
3233

@@ -252,4 +253,9 @@ public Optional<ScheduledProtocolSpec> getNextProtocolSpec(final long currentTim
252253
public Optional<ScheduledProtocolSpec> getLatestProtocolSpec() {
253254
return getPostMergeSchedule().getLatestProtocolSpec();
254255
}
256+
257+
@Override
258+
public NavigableSet<ScheduledProtocolSpec> getProtocolSpecs() {
259+
return getPostMergeSchedule().getProtocolSpecs();
260+
}
255261
}

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
import org.hyperledger.besu.config.GenesisConfigOptions;
1818
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod;
1919
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
20+
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters;
21+
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.JsonRpcParameter;
2022
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
2123
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
24+
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType;
2225
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
2326
import org.hyperledger.besu.ethereum.core.BlockHeader;
2427
import org.hyperledger.besu.ethereum.forkid.ForkIdManager;
@@ -31,11 +34,13 @@
3134

3235
import java.util.Map;
3336
import java.util.Map.Entry;
37+
import java.util.NavigableSet;
3438
import java.util.Optional;
3539
import java.util.TreeMap;
3640
import java.util.function.Supplier;
3741

3842
import com.fasterxml.jackson.databind.ObjectMapper;
43+
import com.fasterxml.jackson.databind.node.ArrayNode;
3944
import com.fasterxml.jackson.databind.node.ObjectNode;
4045
import com.google.common.base.Suppliers;
4146

@@ -68,13 +73,24 @@ public String getName() {
6873

6974
@Override
7075
public JsonRpcResponse response(final JsonRpcRequestContext requestContext) {
76+
ObjectNode result = mapperSupplier.get().createObjectNode();
77+
if (showAllForks(requestContext)) {
78+
final ArrayNode allForks = result.putArray("all");
79+
final NavigableSet<ScheduledProtocolSpec> protocolSpecs = protocolSchedule.getProtocolSpecs();
80+
final var it = protocolSpecs.descendingIterator();
81+
while (it.hasNext()) {
82+
final ScheduledProtocolSpec spec = it.next();
83+
generateConfig(allForks.addObject(), spec.fork(), spec.spec());
84+
}
85+
return new JsonRpcSuccessResponse(requestContext.getRequest().getId(), result);
86+
}
87+
7188
BlockHeader header = blockchain.getBlockchain().getChainHeadHeader();
7289
long currentTime = System.currentTimeMillis() / 1000;
7390
ProtocolSpec current = protocolSchedule.getForNextBlockHeader(header, currentTime);
7491
Optional<ScheduledProtocolSpec> next = protocolSchedule.getNextProtocolSpec(currentTime);
7592
Optional<ScheduledProtocolSpec> last = protocolSchedule.getLatestProtocolSpec();
7693

77-
ObjectNode result = mapperSupplier.get().createObjectNode();
7894
ObjectNode currentNode = result.putObject("current");
7995
generateConfig(currentNode, current);
8096
if (next.isPresent()) {
@@ -93,6 +109,17 @@ public JsonRpcResponse response(final JsonRpcRequestContext requestContext) {
93109
return new JsonRpcSuccessResponse(requestContext.getRequest().getId(), result);
94110
}
95111

112+
private boolean showAllForks(final JsonRpcRequestContext requestContext) {
113+
try {
114+
final Optional<Boolean> optionalParameter =
115+
requestContext.getOptionalParameter(0, Boolean.class);
116+
return optionalParameter.orElse(false);
117+
} catch (JsonRpcParameter.JsonRpcParameterException e) {
118+
throw new InvalidJsonRpcParameters(
119+
"Invalid showAllForks boolean parameter (index 0)", RpcErrorType.INVALID_PARAMS, e);
120+
}
121+
}
122+
96123
private String getForkIdAsHexString(final long currentTime) {
97124
return forkIdManager.getForkIdByTimestamp(currentTime).getHash().toHexString();
98125
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright contributors to Besu.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5+
* the License. You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11+
* specific language governing permissions and limitations under the License.
12+
*
13+
* SPDX-License-Identifier: Apache-2.0
14+
*/
15+
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.mockito.Mockito.when;
19+
20+
import org.hyperledger.besu.config.GenesisConfigOptions;
21+
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest;
22+
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
23+
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
24+
import org.hyperledger.besu.ethereum.api.query.BlockchainQueries;
25+
import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil;
26+
27+
import java.math.BigInteger;
28+
29+
import com.fasterxml.jackson.databind.JsonNode;
30+
import com.fasterxml.jackson.databind.node.ObjectNode;
31+
import org.junit.jupiter.api.BeforeEach;
32+
import org.junit.jupiter.api.Test;
33+
import org.junit.jupiter.api.extension.ExtendWith;
34+
import org.mockito.Mock;
35+
import org.mockito.junit.jupiter.MockitoExtension;
36+
37+
@ExtendWith(MockitoExtension.class)
38+
class EthConfigTest {
39+
40+
private EthConfig method;
41+
42+
@Mock private BlockchainQueries blockchainQueries;
43+
@Mock private GenesisConfigOptions genesisConfigOptions;
44+
protected BlockchainSetupUtil blockchainSetupUtil;
45+
46+
@BeforeEach
47+
void setup() {
48+
blockchainSetupUtil = BlockchainSetupUtil.forMainnet();
49+
when(blockchainQueries.getBlockchain()).thenReturn(blockchainSetupUtil.getBlockchain());
50+
method =
51+
new EthConfig(
52+
blockchainQueries, blockchainSetupUtil.getProtocolSchedule(), genesisConfigOptions);
53+
}
54+
55+
@Test
56+
void ethConfigForMainnet() {
57+
final JsonRpcSuccessResponse res =
58+
((JsonRpcSuccessResponse)
59+
method.response(
60+
new JsonRpcRequestContext(
61+
new JsonRpcRequest("2.0", "eth_config", new Object[] {true}))));
62+
final ObjectNode result = (ObjectNode) res.getResult();
63+
assertThat(result.has("all")).isTrue();
64+
assertThat(result.get("all").size()).isGreaterThan(3);
65+
for (JsonNode forkObj : result.get("all")) {
66+
assertThat(forkObj.get("chainId").asText()).isEqualTo("0x" + BigInteger.ONE.toString(16));
67+
}
68+
}
69+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ public Optional<ScheduledProtocolSpec> getLatestProtocolSpec() {
109109
return protocolSpecs.stream().max(Comparator.comparing(ScheduledProtocolSpec::fork));
110110
}
111111

112+
@Override
113+
public NavigableSet<ScheduledProtocolSpec> getProtocolSpecs() {
114+
return protocolSpecs;
115+
}
116+
112117
@Override
113118
public Optional<BigInteger> getChainId() {
114119
return chainId;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.math.BigInteger;
2626
import java.util.List;
2727
import java.util.Map;
28+
import java.util.NavigableSet;
2829
import java.util.Optional;
2930
import java.util.function.Predicate;
3031

@@ -50,6 +51,8 @@ default ProtocolSpec getForNextBlockHeader(
5051

5152
Optional<ScheduledProtocolSpec> getLatestProtocolSpec();
5253

54+
NavigableSet<ScheduledProtocolSpec> getProtocolSpecs();
55+
5356
Optional<BigInteger> getChainId();
5457

5558
String listMilestones();

0 commit comments

Comments
 (0)