Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Include consolidationRequestContract in jsonGenesisConfigOptions #7647

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Changelog

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


### Upcoming Breaking Changes
- k8s (KUBERNETES) Nat method is now deprecated and will be removed in a future release
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -539,4 +539,11 @@ default boolean isConsensusMigration() {
* @return the deposit address
*/
Optional<Address> getDepositContractAddress();

/**
* The consolidation request contract address
*
* @return the consolidation request contract address
*/
Optional<Address> getConsolidationRequestContractAddress();
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions {
private static final String WITHDRAWAL_REQUEST_CONTRACT_ADDRESS_KEY =
"withdrawalrequestcontractaddress";
private static final String DEPOSIT_CONTRACT_ADDRESS_KEY = "depositcontractaddress";
private static final String CONSOLIDATION_REQUEST_CONTRACT_ADDRESS_KEY =
"consolidationrequestcontractaddress";

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

@Override
public Optional<Address> getConsolidationRequestContractAddress() {
Optional<String> inputAddress =
JsonUtil.getString(configRoot, CONSOLIDATION_REQUEST_CONTRACT_ADDRESS_KEY);
return inputAddress.map(Address::fromHexString);
}

@Override
public Map<String, Object> asMap() {
final ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
Expand Down Expand Up @@ -504,6 +513,8 @@ public Map<String, Object> asMap() {
getWithdrawalRequestContractAddress()
.ifPresent(l -> builder.put("withdrawalRequestContractAddress", l));
getDepositContractAddress().ifPresent(l -> builder.put("depositContractAddress", l));
getConsolidationRequestContractAddress()
.ifPresent(l -> builder.put("consolidationRequestContractAddress", l));

if (isClique()) {
builder.put("clique", getCliqueConfigOptions().asMap());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,11 @@ public Optional<Address> getDepositContractAddress() {
return Optional.empty();
}

@Override
public Optional<Address> getConsolidationRequestContractAddress() {
return Optional.empty();
}

/**
* Homestead block stub genesis config options.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,33 @@ void asMapIncludesDepositContractAddress() {
.containsValue(Address.ZERO);
}

@Test
void shouldGetConsolidationRequestContractAddress() {
final GenesisConfigOptions config =
fromConfigOptions(
singletonMap(
"consolidationRequestContractAddress",
"0x00000000219ab540356cbb839cbe05303d7705fa"));
assertThat(config.getConsolidationRequestContractAddress())
.hasValue(Address.fromHexString("0x00000000219ab540356cbb839cbe05303d7705fa"));
}

@Test
void shouldNotHaveConsolidationRequestContractAddressWhenEmpty() {
final GenesisConfigOptions config = fromConfigOptions(emptyMap());
assertThat(config.getConsolidationRequestContractAddress()).isEmpty();
}

@Test
void asMapIncludesConsolidationRequestContractAddress() {
final GenesisConfigOptions config =
fromConfigOptions(Map.of("consolidationRequestContractAddress", "0x0"));

assertThat(config.asMap())
.containsOnlyKeys("consolidationRequestContractAddress")
.containsValue(Address.ZERO);
}

private GenesisConfigOptions fromConfigOptions(final Map<String, Object> configOptions) {
final ObjectNode rootNode = JsonUtil.createEmptyObjectNode();
final ObjectNode options = JsonUtil.objectNodeFromMap(configOptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@
*/
package org.hyperledger.besu.ethereum.mainnet;

import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsProcessors;
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsValidator;
import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;

import org.hyperledger.besu.config.GenesisConfigOptions;
import org.hyperledger.besu.config.PowAlgorithm;
Expand All @@ -41,6 +39,7 @@
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
import org.hyperledger.besu.ethereum.mainnet.parallelization.MainnetParallelBlockProcessor;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestContractAddresses;
import org.hyperledger.besu.ethereum.privacy.PrivateTransactionProcessor;
import org.hyperledger.besu.ethereum.privacy.PrivateTransactionValidator;
import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater;
Expand Down Expand Up @@ -767,12 +766,8 @@ static ProtocolSpecBuilder pragueDefinition(
final boolean isParallelTxProcessingEnabled,
final MetricsSystem metricsSystem) {

final Address withdrawalRequestContractAddress =
genesisConfigOptions
.getWithdrawalRequestContractAddress()
.orElse(DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS);
final Address depositContractAddress =
genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS);
RequestContractAddresses requestContractAddresses =
RequestContractAddresses.fromGenesis(genesisConfigOptions);

return cancunDefinition(
chainId,
Expand All @@ -794,10 +789,9 @@ static ProtocolSpecBuilder pragueDefinition(
.precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::prague)

// EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests
.requestsValidator(pragueRequestsValidator(depositContractAddress))
.requestsValidator(pragueRequestsValidator(requestContractAddresses))
// EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests
.requestProcessorCoordinator(
pragueRequestsProcessors(withdrawalRequestContractAddress, depositContractAddress))
.requestProcessorCoordinator(pragueRequestsProcessors(requestContractAddresses))

// change to accept EIP-7702 transactions
.transactionValidatorFactoryBuilder(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,18 @@

public class ConsolidationRequestProcessor
extends AbstractSystemCallRequestProcessor<ConsolidationRequest> {
public static final Address CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS =
public static final Address CONSOLIDATION_REQUEST_CONTRACT_ADDRESS =
Address.fromHexString("0x00b42dbF2194e931E80326D950320f7d9Dbeac02");

private static final int ADDRESS_BYTES = 20;
private static final int PUBLIC_KEY_BYTES = 48;
private static final int CONSOLIDATION_REQUEST_BYTES_SIZE =
ADDRESS_BYTES + PUBLIC_KEY_BYTES + PUBLIC_KEY_BYTES;
private final Address consolidationRequestContractAddress;

public ConsolidationRequestProcessor(final Address consolidationRequestContractAddress) {
this.consolidationRequestContractAddress = consolidationRequestContractAddress;
}

/**
* Gets the call address for consolidation requests.
Expand All @@ -37,7 +42,7 @@ public class ConsolidationRequestProcessor
*/
@Override
protected Address getCallAddress() {
return CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS;
return consolidationRequestContractAddress;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,34 @@
*/
package org.hyperledger.besu.ethereum.mainnet.requests;

import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.datatypes.RequestType;

public class MainnetRequestsValidator {
public static RequestsValidatorCoordinator pragueRequestsValidator(
final Address depositContractAddress) {
final RequestContractAddresses requestContractAddresses) {
return new RequestsValidatorCoordinator.Builder()
.addValidator(RequestType.WITHDRAWAL, new WithdrawalRequestValidator())
.addValidator(RequestType.CONSOLIDATION, new ConsolidationRequestValidator())
.addValidator(RequestType.DEPOSIT, new DepositRequestValidator(depositContractAddress))
.addValidator(
RequestType.DEPOSIT,
new DepositRequestValidator(requestContractAddresses.getDepositContractAddress()))
.build();
}

public static RequestProcessorCoordinator pragueRequestsProcessors(
final Address withdrawalRequestContractAddress, final Address depositContractAddress) {
final RequestContractAddresses requestContractAddresses) {
return new RequestProcessorCoordinator.Builder()
.addProcessor(
RequestType.WITHDRAWAL,
new WithdrawalRequestProcessor(withdrawalRequestContractAddress))
.addProcessor(RequestType.CONSOLIDATION, new ConsolidationRequestProcessor())
.addProcessor(RequestType.DEPOSIT, new DepositRequestProcessor(depositContractAddress))
new WithdrawalRequestProcessor(
requestContractAddresses.getWithdrawalRequestContractAddress()))
.addProcessor(
RequestType.CONSOLIDATION,
new ConsolidationRequestProcessor(
requestContractAddresses.getConsolidationRequestContractAddress()))
.addProcessor(
RequestType.DEPOSIT,
new DepositRequestProcessor(requestContractAddresses.getDepositContractAddress()))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright contributors to Hyperledger Besu.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.mainnet.requests;

import static org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestProcessor.CONSOLIDATION_REQUEST_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;

import org.hyperledger.besu.config.GenesisConfigOptions;
import org.hyperledger.besu.datatypes.Address;

public class RequestContractAddresses {
private final Address withdrawalRequestContractAddress;
private final Address depositContractAddress;
private final Address consolidationRequestContractAddress;

public RequestContractAddresses(
final Address withdrawalRequestContractAddress,
final Address depositContractAddress,
final Address consolidationRequestContractAddress) {
this.withdrawalRequestContractAddress = withdrawalRequestContractAddress;
this.depositContractAddress = depositContractAddress;
this.consolidationRequestContractAddress = consolidationRequestContractAddress;
}

public static RequestContractAddresses fromGenesis(
final GenesisConfigOptions genesisConfigOptions) {
return new RequestContractAddresses(
genesisConfigOptions
.getWithdrawalRequestContractAddress()
.orElse(DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS),
genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS),
genesisConfigOptions
.getConsolidationRequestContractAddress()
.orElse(CONSOLIDATION_REQUEST_CONTRACT_ADDRESS));
}

public Address getWithdrawalRequestContractAddress() {
return withdrawalRequestContractAddress;
}

public Address getDepositContractAddress() {
return depositContractAddress;
}

public Address getConsolidationRequestContractAddress() {
return consolidationRequestContractAddress;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode.NONE;
import static org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestProcessor.CONSOLIDATION_REQUEST_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsValidator;
import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.lenient;

Expand All @@ -31,6 +33,7 @@
import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil;
import org.hyperledger.besu.ethereum.core.Request;
import org.hyperledger.besu.ethereum.core.WithdrawalRequest;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestContractAddresses;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator;
import org.hyperledger.besu.evm.log.LogsBloomFilter;

Expand All @@ -52,9 +55,13 @@ class PragueRequestsValidatorTest {
@Mock private ProtocolSchedule protocolSchedule;
@Mock private ProtocolSpec protocolSpec;
@Mock private WithdrawalsValidator withdrawalsValidator;
private final RequestContractAddresses requestContractAddresses =
new RequestContractAddresses(
DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS,
DEFAULT_DEPOSIT_CONTRACT_ADDRESS,
CONSOLIDATION_REQUEST_CONTRACT_ADDRESS);

RequestsValidatorCoordinator requestValidator =
pragueRequestsValidator(DEFAULT_DEPOSIT_CONTRACT_ADDRESS);
RequestsValidatorCoordinator requestValidator = pragueRequestsValidator(requestContractAddresses);

@BeforeEach
public void setUp() {
Expand Down