Add support for movePrecompileToAddress in State Overrides (eth_call) (#8115)

Signed-off-by: Gabriel-Trintinalia <gabriel.trintinalia@consensys.net>
This commit is contained in:
Gabriel-Trintinalia
2025-01-15 12:27:57 +08:00
committed by GitHub
parent 9c12ed19df
commit 5cc309a26e
17 changed files with 615 additions and 137 deletions

View File

@@ -16,8 +16,10 @@ package org.hyperledger.besu.evm.precompile;
import org.hyperledger.besu.datatypes.Address;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/** Encapsulates a group of {@link PrecompiledContract}s used together. */
public class PrecompileContractRegistry {
@@ -48,4 +50,13 @@ public class PrecompileContractRegistry {
public void put(final Address address, final PrecompiledContract precompile) {
precompiles.put(address, precompile);
}
/**
* Gets the addresses of the precompiled contracts.
*
* @return the addresses
*/
public Set<Address> getPrecompileAddresses() {
return Collections.unmodifiableSet(precompiles.keySet());
}
}

View File

@@ -30,6 +30,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import com.google.common.annotations.VisibleForTesting;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,7 +38,8 @@ import org.slf4j.LoggerFactory;
public class MessageCallProcessor extends AbstractMessageProcessor {
private static final Logger LOG = LoggerFactory.getLogger(MessageCallProcessor.class);
private final PrecompileContractRegistry precompiles;
/** The precompiles. */
protected final PrecompileContractRegistry precompiles;
/**
* Instantiates a new Message call processor.
@@ -171,4 +173,14 @@ public class MessageCallProcessor extends AbstractMessageProcessor {
frame.setExceptionalHaltReason(result.getHaltReason());
}
}
/**
* Gets the precompile addresses.
*
* @return the precompile addresses
*/
@VisibleForTesting
public Set<Address> getPrecompileAddresses() {
return precompiles.getPrecompileAddresses();
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright contributors to 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.evm.processor;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.evm.precompile.PrecompileContractRegistry;
import java.util.Map;
/**
* A message call processor designed specifically for simulation purposes that allows for overriding
* precompile addresses.
*/
public class OverriddenPrecompilesMessageCallProcessor extends MessageCallProcessor {
/**
* Instantiates a new Modifiable precompiles message call processor for simulation.
*
* @param originalProcessor the original processor
* @param precompileOverrides the address overrides
*/
public OverriddenPrecompilesMessageCallProcessor(
final MessageCallProcessor originalProcessor,
final Map<Address, Address> precompileOverrides) {
super(
originalProcessor.evm,
createRegistryWithPrecompileOverrides(originalProcessor.precompiles, precompileOverrides));
}
/**
* Creates a new PrecompileContractRegistry with the specified address overrides.
*
* @param originalRegistry the original precompile contract registry
* @param precompileOverrides the address overrides
* @return a new PrecompileContractRegistry with the overrides applied
*/
private static PrecompileContractRegistry createRegistryWithPrecompileOverrides(
final PrecompileContractRegistry originalRegistry,
final Map<Address, Address> precompileOverrides) {
PrecompileContractRegistry newRegistry = new PrecompileContractRegistry();
for (Address originalAddress : originalRegistry.getPrecompileAddresses()) {
Address effectiveAddress = precompileOverrides.getOrDefault(originalAddress, originalAddress);
newRegistry.put(effectiveAddress, originalRegistry.get(originalAddress));
}
return newRegistry;
}
}