Skip to content

Commit 7a5ccfa

Browse files
gconnectGabriel-Trintinalia
authored andcommitted
Add consolidationRequestContract in jsonGenesisConfig (hyperledger#7647)
* Include consolidationRequestContract in jsonGenesisConfigOptions Signed-off-by: gconnect <[email protected]> * Update changelog and ran spotlessApply Signed-off-by: gconnect <[email protected]> * Rename consolidationRequestPredeployAddress to consolidationRequestContractAddress Signed-off-by: gconnect <[email protected]> * Create request contract addresses class Signed-off-by: gconnect <[email protected]> * Update method calls Signed-off-by: gconnect <[email protected]> * Refactor RequestContractAddresses class and update method calls and test Signed-off-by: gconnect <[email protected]> --------- Signed-off-by: gconnect <[email protected]> Co-authored-by: Gabriel-Trintinalia <[email protected]> Signed-off-by: Wolmin <[email protected]>
1 parent d4fd55d commit 7a5ccfa

File tree

10 files changed

+148
-22
lines changed

10 files changed

+148
-22
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Changelog
22

33
## [Unreleased]
4+
- Add configuration of Consolidation Request Contract Address via genesis configuration [#7647](https://github.com/hyperledger/besu/pull/7647)
5+
46

57
### Upcoming Breaking Changes
68
- k8s (KUBERNETES) Nat method is now deprecated and will be removed in a future release

config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java

+7
Original file line numberDiff line numberDiff line change
@@ -539,4 +539,11 @@ default boolean isConsensusMigration() {
539539
* @return the deposit address
540540
*/
541541
Optional<Address> getDepositContractAddress();
542+
543+
/**
544+
* The consolidation request contract address
545+
*
546+
* @return the consolidation request contract address
547+
*/
548+
Optional<Address> getConsolidationRequestContractAddress();
542549
}

config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java

+11
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions {
5252
private static final String WITHDRAWAL_REQUEST_CONTRACT_ADDRESS_KEY =
5353
"withdrawalrequestcontractaddress";
5454
private static final String DEPOSIT_CONTRACT_ADDRESS_KEY = "depositcontractaddress";
55+
private static final String CONSOLIDATION_REQUEST_CONTRACT_ADDRESS_KEY =
56+
"consolidationrequestcontractaddress";
5557

5658
private final ObjectNode configRoot;
5759
private final Map<String, String> configOverrides = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
@@ -453,6 +455,13 @@ public Optional<Address> getDepositContractAddress() {
453455
return inputAddress.map(Address::fromHexString);
454456
}
455457

458+
@Override
459+
public Optional<Address> getConsolidationRequestContractAddress() {
460+
Optional<String> inputAddress =
461+
JsonUtil.getString(configRoot, CONSOLIDATION_REQUEST_CONTRACT_ADDRESS_KEY);
462+
return inputAddress.map(Address::fromHexString);
463+
}
464+
456465
@Override
457466
public Map<String, Object> asMap() {
458467
final ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
@@ -504,6 +513,8 @@ public Map<String, Object> asMap() {
504513
getWithdrawalRequestContractAddress()
505514
.ifPresent(l -> builder.put("withdrawalRequestContractAddress", l));
506515
getDepositContractAddress().ifPresent(l -> builder.put("depositContractAddress", l));
516+
getConsolidationRequestContractAddress()
517+
.ifPresent(l -> builder.put("consolidationRequestContractAddress", l));
507518

508519
if (isClique()) {
509520
builder.put("clique", getCliqueConfigOptions().asMap());

config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java

+5
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,11 @@ public Optional<Address> getDepositContractAddress() {
467467
return Optional.empty();
468468
}
469469

470+
@Override
471+
public Optional<Address> getConsolidationRequestContractAddress() {
472+
return Optional.empty();
473+
}
474+
470475
/**
471476
* Homestead block stub genesis config options.
472477
*

config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,33 @@ void asMapIncludesDepositContractAddress() {
382382
.containsValue(Address.ZERO);
383383
}
384384

385+
@Test
386+
void shouldGetConsolidationRequestContractAddress() {
387+
final GenesisConfigOptions config =
388+
fromConfigOptions(
389+
singletonMap(
390+
"consolidationRequestContractAddress",
391+
"0x00000000219ab540356cbb839cbe05303d7705fa"));
392+
assertThat(config.getConsolidationRequestContractAddress())
393+
.hasValue(Address.fromHexString("0x00000000219ab540356cbb839cbe05303d7705fa"));
394+
}
395+
396+
@Test
397+
void shouldNotHaveConsolidationRequestContractAddressWhenEmpty() {
398+
final GenesisConfigOptions config = fromConfigOptions(emptyMap());
399+
assertThat(config.getConsolidationRequestContractAddress()).isEmpty();
400+
}
401+
402+
@Test
403+
void asMapIncludesConsolidationRequestContractAddress() {
404+
final GenesisConfigOptions config =
405+
fromConfigOptions(Map.of("consolidationRequestContractAddress", "0x0"));
406+
407+
assertThat(config.asMap())
408+
.containsOnlyKeys("consolidationRequestContractAddress")
409+
.containsValue(Address.ZERO);
410+
}
411+
385412
private GenesisConfigOptions fromConfigOptions(final Map<String, Object> configOptions) {
386413
final ObjectNode rootNode = JsonUtil.createEmptyObjectNode();
387414
final ObjectNode options = JsonUtil.objectNodeFromMap(configOptions);

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

+5-11
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414
*/
1515
package org.hyperledger.besu.ethereum.mainnet;
1616

17-
import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
1817
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsProcessors;
1918
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsValidator;
20-
import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;
2119

2220
import org.hyperledger.besu.config.GenesisConfigOptions;
2321
import org.hyperledger.besu.config.PowAlgorithm;
@@ -41,6 +39,7 @@
4139
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
4240
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
4341
import org.hyperledger.besu.ethereum.mainnet.parallelization.MainnetParallelBlockProcessor;
42+
import org.hyperledger.besu.ethereum.mainnet.requests.RequestContractAddresses;
4443
import org.hyperledger.besu.ethereum.privacy.PrivateTransactionProcessor;
4544
import org.hyperledger.besu.ethereum.privacy.PrivateTransactionValidator;
4645
import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater;
@@ -767,12 +766,8 @@ static ProtocolSpecBuilder pragueDefinition(
767766
final boolean isParallelTxProcessingEnabled,
768767
final MetricsSystem metricsSystem) {
769768

770-
final Address withdrawalRequestContractAddress =
771-
genesisConfigOptions
772-
.getWithdrawalRequestContractAddress()
773-
.orElse(DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS);
774-
final Address depositContractAddress =
775-
genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS);
769+
RequestContractAddresses requestContractAddresses =
770+
RequestContractAddresses.fromGenesis(genesisConfigOptions);
776771

777772
return cancunDefinition(
778773
chainId,
@@ -794,10 +789,9 @@ static ProtocolSpecBuilder pragueDefinition(
794789
.precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::prague)
795790

796791
// EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests
797-
.requestsValidator(pragueRequestsValidator(depositContractAddress))
792+
.requestsValidator(pragueRequestsValidator(requestContractAddresses))
798793
// EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests
799-
.requestProcessorCoordinator(
800-
pragueRequestsProcessors(withdrawalRequestContractAddress, depositContractAddress))
794+
.requestProcessorCoordinator(pragueRequestsProcessors(requestContractAddresses))
801795

802796
// change to accept EIP-7702 transactions
803797
.transactionValidatorFactoryBuilder(

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,18 @@
2222

2323
public class ConsolidationRequestProcessor
2424
extends AbstractSystemCallRequestProcessor<ConsolidationRequest> {
25-
public static final Address CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS =
25+
public static final Address CONSOLIDATION_REQUEST_CONTRACT_ADDRESS =
2626
Address.fromHexString("0x00b42dbF2194e931E80326D950320f7d9Dbeac02");
2727

2828
private static final int ADDRESS_BYTES = 20;
2929
private static final int PUBLIC_KEY_BYTES = 48;
3030
private static final int CONSOLIDATION_REQUEST_BYTES_SIZE =
3131
ADDRESS_BYTES + PUBLIC_KEY_BYTES + PUBLIC_KEY_BYTES;
32+
private final Address consolidationRequestContractAddress;
33+
34+
public ConsolidationRequestProcessor(final Address consolidationRequestContractAddress) {
35+
this.consolidationRequestContractAddress = consolidationRequestContractAddress;
36+
}
3237

3338
/**
3439
* Gets the call address for consolidation requests.
@@ -37,7 +42,7 @@ public class ConsolidationRequestProcessor
3742
*/
3843
@Override
3944
protected Address getCallAddress() {
40-
return CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS;
45+
return consolidationRequestContractAddress;
4146
}
4247

4348
/**

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java

+14-7
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,34 @@
1414
*/
1515
package org.hyperledger.besu.ethereum.mainnet.requests;
1616

17-
import org.hyperledger.besu.datatypes.Address;
1817
import org.hyperledger.besu.datatypes.RequestType;
1918

2019
public class MainnetRequestsValidator {
2120
public static RequestsValidatorCoordinator pragueRequestsValidator(
22-
final Address depositContractAddress) {
21+
final RequestContractAddresses requestContractAddresses) {
2322
return new RequestsValidatorCoordinator.Builder()
2423
.addValidator(RequestType.WITHDRAWAL, new WithdrawalRequestValidator())
2524
.addValidator(RequestType.CONSOLIDATION, new ConsolidationRequestValidator())
26-
.addValidator(RequestType.DEPOSIT, new DepositRequestValidator(depositContractAddress))
25+
.addValidator(
26+
RequestType.DEPOSIT,
27+
new DepositRequestValidator(requestContractAddresses.getDepositContractAddress()))
2728
.build();
2829
}
2930

3031
public static RequestProcessorCoordinator pragueRequestsProcessors(
31-
final Address withdrawalRequestContractAddress, final Address depositContractAddress) {
32+
final RequestContractAddresses requestContractAddresses) {
3233
return new RequestProcessorCoordinator.Builder()
3334
.addProcessor(
3435
RequestType.WITHDRAWAL,
35-
new WithdrawalRequestProcessor(withdrawalRequestContractAddress))
36-
.addProcessor(RequestType.CONSOLIDATION, new ConsolidationRequestProcessor())
37-
.addProcessor(RequestType.DEPOSIT, new DepositRequestProcessor(depositContractAddress))
36+
new WithdrawalRequestProcessor(
37+
requestContractAddresses.getWithdrawalRequestContractAddress()))
38+
.addProcessor(
39+
RequestType.CONSOLIDATION,
40+
new ConsolidationRequestProcessor(
41+
requestContractAddresses.getConsolidationRequestContractAddress()))
42+
.addProcessor(
43+
RequestType.DEPOSIT,
44+
new DepositRequestProcessor(requestContractAddresses.getDepositContractAddress()))
3845
.build();
3946
}
4047
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright contributors to Hyperledger 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.mainnet.requests;
16+
17+
import static org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestProcessor.CONSOLIDATION_REQUEST_CONTRACT_ADDRESS;
18+
import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
19+
import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;
20+
21+
import org.hyperledger.besu.config.GenesisConfigOptions;
22+
import org.hyperledger.besu.datatypes.Address;
23+
24+
public class RequestContractAddresses {
25+
private final Address withdrawalRequestContractAddress;
26+
private final Address depositContractAddress;
27+
private final Address consolidationRequestContractAddress;
28+
29+
public RequestContractAddresses(
30+
final Address withdrawalRequestContractAddress,
31+
final Address depositContractAddress,
32+
final Address consolidationRequestContractAddress) {
33+
this.withdrawalRequestContractAddress = withdrawalRequestContractAddress;
34+
this.depositContractAddress = depositContractAddress;
35+
this.consolidationRequestContractAddress = consolidationRequestContractAddress;
36+
}
37+
38+
public static RequestContractAddresses fromGenesis(
39+
final GenesisConfigOptions genesisConfigOptions) {
40+
return new RequestContractAddresses(
41+
genesisConfigOptions
42+
.getWithdrawalRequestContractAddress()
43+
.orElse(DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS),
44+
genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS),
45+
genesisConfigOptions
46+
.getConsolidationRequestContractAddress()
47+
.orElse(CONSOLIDATION_REQUEST_CONTRACT_ADDRESS));
48+
}
49+
50+
public Address getWithdrawalRequestContractAddress() {
51+
return withdrawalRequestContractAddress;
52+
}
53+
54+
public Address getDepositContractAddress() {
55+
return depositContractAddress;
56+
}
57+
58+
public Address getConsolidationRequestContractAddress() {
59+
return consolidationRequestContractAddress;
60+
}
61+
}

ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueRequestsValidatorTest.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import static java.util.Collections.emptyList;
1818
import static org.assertj.core.api.Assertions.assertThat;
1919
import static org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode.NONE;
20+
import static org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestProcessor.CONSOLIDATION_REQUEST_CONTRACT_ADDRESS;
2021
import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
2122
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsValidator;
23+
import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;
2224
import static org.mockito.ArgumentMatchers.any;
2325
import static org.mockito.Mockito.lenient;
2426

@@ -31,6 +33,7 @@
3133
import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil;
3234
import org.hyperledger.besu.ethereum.core.Request;
3335
import org.hyperledger.besu.ethereum.core.WithdrawalRequest;
36+
import org.hyperledger.besu.ethereum.mainnet.requests.RequestContractAddresses;
3437
import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator;
3538
import org.hyperledger.besu.evm.log.LogsBloomFilter;
3639

@@ -52,9 +55,13 @@ class PragueRequestsValidatorTest {
5255
@Mock private ProtocolSchedule protocolSchedule;
5356
@Mock private ProtocolSpec protocolSpec;
5457
@Mock private WithdrawalsValidator withdrawalsValidator;
58+
private final RequestContractAddresses requestContractAddresses =
59+
new RequestContractAddresses(
60+
DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS,
61+
DEFAULT_DEPOSIT_CONTRACT_ADDRESS,
62+
CONSOLIDATION_REQUEST_CONTRACT_ADDRESS);
5563

56-
RequestsValidatorCoordinator requestValidator =
57-
pragueRequestsValidator(DEFAULT_DEPOSIT_CONTRACT_ADDRESS);
64+
RequestsValidatorCoordinator requestValidator = pragueRequestsValidator(requestContractAddresses);
5865

5966
@BeforeEach
6067
public void setUp() {

0 commit comments

Comments
 (0)